#
# Test the basic handling of HTTP (expected response codes and the
# like).
#

fixtures:
    - APIFixture

defaults:
    request_headers:
        # NOTE(cdent): Get past keystone, even though at this stage
        # we don't require auth.
        x-auth-token: admin
        accept: application/json

tests:
- name: 404 at no service
  GET: /barnabas
  status: 404
  response_json_paths:
      $.errors[0].title: Not Found

- name: error message has request id
  GET: /barnabas
  status: 404
  response_json_paths:
      $.errors[0].request_id: /req-[a-fA-F0-9-]+/

- name: error message has default code 1.23
  GET: /barnabas
  status: 404
  request_headers:
      openstack-api-version: placement 1.23
  response_json_paths:
      $.errors[0].code: placement.undefined_code

- name: 404 at no resource provider
  GET: /resource_providers/fd0dd55c-6330-463b-876c-31c54e95cb95
  status: 404

- name: 405 on bad method at root
  DELETE: /
  status: 405
  response_headers:
      allow: GET
  response_json_paths:
      $.errors[0].title: Method Not Allowed

- name: 200 at home
  GET: /
  status: 200

- name: 405 on bad method on app
  DELETE: /resource_providers
  status: 405
  response_headers:
      allow: /(GET|POST), (POST|GET)/
  response_json_paths:
      $.errors[0].title: Method Not Allowed
  response_strings:
    - The method DELETE is not allowed for this resource.

- name: 405 on bad options method on app
  OPTIONS: /resource_providers
  status: 405
  response_headers:
      allow: /(GET|POST), (POST|GET)/
  response_json_paths:
      $.errors[0].title: Method Not Allowed
  response_strings:
    - The method OPTIONS is not allowed for this resource.

- name: bad accept resource providers
  GET: /resource_providers
  request_headers:
      accept: text/plain
  status: 406

- name: complex accept resource providers
  GET: /resource_providers
  request_headers:
      accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  status: 200
  response_json_paths:
      $.resource_providers: []

- name: post resource provider wrong content-type
  POST: /resource_providers
  request_headers:
    content-type: text/plain
  data: I want a resource provider please
  status: 415

- name: post resource provider missing content-type
  desc: because content-length is set, we should have a content-type
  POST: /resource_providers
  data: I want a resource provider please
  status: 400
  response_strings:
      - content-type header required

# NOTE(cdent): This is an awkward test. It is not actually testing a
# PUT of a resource provider. It is confirming that a PUT with no
# body, no content-length header and no content-type header will
# reach the desired handler.
- name: PUT resource provider no body
  desc: different response string from prior test indicates past content-length requirement
  PUT: /resource_providers/d3a64825-8228-4ccb-8a6c-1c6d3eb6a3e8
  status: 415
  response_strings:
      - The media type None is not supported, use application/json

- name: post resource provider schema mismatch
  POST: /resource_providers
  request_headers:
      content-type: application/json
  data:
      transport: car
      color: blue
  status: 400

- name: post good resource provider
  POST: /resource_providers
  request_headers:
    content-type: application/json
  data:
      name: $ENVIRON['RP_NAME']
      uuid: $ENVIRON['RP_UUID']
  status: 201

- name: get resource provider wrong accept
  GET: /resource_providers/$ENVIRON['RP_UUID']
  request_headers:
      accept: text/plain
  status: 406
  response_strings:
      - Only application/json is provided

- name: get resource provider complex accept wild match
  desc: like a browser, */* should match
  GET: /resource_providers/$ENVIRON['RP_UUID']
  request_headers:
      accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
  response_json_paths:
      $.uuid: $ENVIRON['RP_UUID']

- name: get resource provider complex accept no match
  desc: no */*, no match
  GET: /resource_providers/$ENVIRON['RP_UUID']
  request_headers:
      accept: text/html,application/xhtml+xml,application/xml;q=0.9
  status: 406

- name: put poor format resource provider
  PUT: /resource_providers/$ENVIRON['RP_UUID']
  request_headers:
    content-type: text/plain
  data: Why U no provide?
  status: 415

- name: non inventory sub resource provider path
  GET: /resource_providers/7850178f-1807-4512-b135-0b174985405b/cows
  request_headers:
      accept: application/json
  status: 404
  response_json_paths:
      $.errors[0].title:  Not Found
  response_strings:
      - The resource could not be found.

- name: root at 1.15 has cache headers
  GET: /
  request_headers:
      openstack-api-version: placement 1.15
  response_headers:
      cache-control: no-cache
      # Does last-modified look like a legit timestamp?
      last-modified:  /^\w+, \d+ \w+ \d{4} [\d:]+ GMT$/

- name: root at 1.14 no cache headers
  GET: /
  request_headers:
      openstack-api-version: placement 1.14
  response_forbidden_headers:
      - last-modified
      - cache-control

- name: test starred accept and errors
  GET: /resource_providers/foo
  request_headers:
      accept: "*/*"
  status: 404
  response_headers:
      content-type: application/json
  response_json_paths:
      $.errors[0].title: Not Found

- name: bad content length not int
  POST: /resource_providers
  request_headers:
      content-type: application/json
      content-length: hi mom
  data:
      uuid: ce13d7f1-9988-4dfd-8e16-ce071802eb36
  status: 400
  response_strings:
      - content-length header must be an integer
