---
#check options
-
    name: check OPTIONS for resellers
    type: item
    method: OPTIONS
    path: /api/resellers/
    conditions:
        is:
            code: 200
            header:
                Accept-Post: application/hal+json; profile=http://purl.org/sipwise/ngcp-api/#rel-resellers
        ok:
            options:
                - GET
                - HEAD
                - OPTIONS
                - POST

#create a System Contact
-
    name: create a System Contact
    type: item
    method: POST
    path: /api/systemcontacts/
    header:
        Content-Type: application/json
    content:
        firstname: sys_contact_first
        lastname: sys_contact_last
        email: sys_contact@syscontact.invalid
    conditions:
        is:
            code: 201
    retain:
        system_contact_path: header.location
        system_contact_id: header.location

#create billingprofile
-
    name: create billingprofile
    type: item
    method: POST
    path: '/api/billingprofiles/'
    header:
        Content-Type: application/json
    content:
        reseller_id: 1
        handle: test_profile_${unique_id}
        name: test profile ${unique_id}
    retain:
        billing_profile_id: header.location
    conditions:
        is:
            code: 201

#create contract
-
    name: create contract
    type: item
    method: POST
    path: '/api/contracts/'
    header:
        Content-Type: application/json
    content:
        status: active
        contact_id: ${system_contact_id}
        type: reseller
        billing_profile_id: ${billing_profile_id}
    retain:
        contract1_id: header.location
    conditions:
        is:
            code: 201

#create contract
-
    name: create contract
    type: item
    method: POST
    path: '/api/contracts/'
    header:
        Content-Type: application/json
    content:
        status: active
        contact_id: ${system_contact_id}
        type: reseller
        billing_profile_id: ${billing_profile_id}
    retain:
        contract2_id: header.location
    conditions:
        is:
            code: 201

#create contract
-
    name: create contract
    type: item
    method: POST
    path: '/api/contracts/'
    header:
        Content-Type: application/json
    content:
        status: active
        contact_id: ${system_contact_id}
        type: reseller
        billing_profile_id: ${billing_profile_id}
    retain:
        contract3_id: header.location
    conditions:
        is:
            code: 201

#create contract
-
    name: create contract
    type: item
    method: POST
    path: '/api/contracts/'
    header:
        Content-Type: application/json
    content:
        status: active
        contact_id: ${system_contact_id}
        type: reseller
        billing_profile_id: ${billing_profile_id}
    retain:
        contract4_id: header.location
    conditions:
        is:
            code: 201

#create reseller
-
    name: create reseller
    type: item
    method: POST
    path: '/api/resellers/'
    header:
        Content-Type: application/json
    content:
        contract_id: ${contract1_id}
        status: active
        name: test reseller 1 ${unique_id}
    retain:
        reseller_path1: header.location
    conditions:
        is:
            code: 201

#create reseller
-
    name: create reseller
    type: item
    method: POST
    path: '/api/resellers/'
    header:
        Content-Type: application/json
    content:
        contract_id: ${contract2_id}
        status: active
        name: test reseller 2 ${unique_id}
    retain:
        reseller_path2: header.location
    conditions:
        is:
            code: 201

#create reseller
-
    name: create reseller
    type: item
    method: POST
    path: '/api/resellers/'
    header:
        Content-Type: application/json
    content:
        contract_id: ${contract3_id}
        status: active
        name: test reseller 3 ${unique_id}
    retain:
        reseller_path3: header.location
    conditions:
        is:
            code: 201

#create reseller without contract id
-
    name: create reseller without contract id
    type: item
    method: POST
    path: '/api/resellers/'
    header:
        Content-Type: application/json
    content:
        status: active
        name: test reseller 4 ${unique_id}
    conditions:
        is:
            code: 422
            body.code: 422
        like:
            body.message: field='contract_id'

#create reseller with empty contract id
-
    name: create reseller with empty contract id
    type: item
    method: POST
    path: '/api/resellers/'
    header:
        Content-Type: application/json
    content:
        contract_id: null
        status: active
        name: test reseller 4 ${unique_id}
    conditions:
        is:
            code: 422
            body.code: 422
        like:
            body.message: field='contract_id'

#create reseller with existing contract id
-
    name: create reseller with existing contract id
    type: item
    method: POST
    path: '/api/resellers/'
    header:
        Content-Type: application/json
    content:
        contract_id: ${contract1_id}
        status: active
        name: test reseller 4 ${unique_id}
    conditions:
        is:
            code: 422
            body.code: 422
        like:
            body.message: reseller with this contract already exists

#create reseller with existing name
-
    name: create reseller with existing name
    type: item
    method: POST
    path: '/api/resellers/'
    header:
        Content-Type: application/json
    content:
        contract_id: ${contract4_id}
        status: active
        name: test reseller 1 ${unique_id}
    conditions:
        is:
            code: 422
            body.code: 422
        like:
            body.message: reseller with this name already exists

#create reseller with missing name
-
    name: create reseller with missing name
    type: item
    method: POST
    path: '/api/resellers/'
    header:
        Content-Type: application/json
    content:
        contract_id: ${contract4_id}
        status: active
    conditions:
        is:
            code: 422
            body.code: 422
        like:
            body.message: field='name'

#create reseller with missing status
-
    name: create reseller with missing status
    type: item
    method: POST
    path: '/api/resellers/'
    header:
        Content-Type: application/json
    content:
        contract_id: ${contract4_id}
        name: test reseller 4 ${unique_id}
    conditions:
        is:
            code: 422
            body.code: 422
        like:
            body.message: field='status'

#create reseller with invalid status
-
    name: create reseller with invalid status
    type: item
    method: POST
    path: '/api/resellers/'
    header:
        Content-Type: application/json
    content:
        contract_id: ${contract4_id}
        name: test reseller 4 ${unique_id}
        status: invalid
    conditions:
        is:
            code: 422
            body.code: 422
        like:
            body.message: field='status'


#verify pagination
-
    name: verify pagination
    type: pagination
    method: GET
    path: '/api/resellers/?page=1&rows=2'
    retain:
        collection: body
    conditions:
        is:
            code: 200

#check options on item
-
    name: check OPTIONS for resellers item
    type: item
    method: OPTIONS
    path: '/${reseller_path3}'
    conditions:
        is:
            code: 200
        ok:
            options:
                - GET
                - HEAD
                - OPTIONS
                - PUT
                - PATCH

#get reseller
-
    name: GET reseller
    type: item
    method: GET
    path: '/${reseller_path3}'
    retain:
        reseller: body
    perl_code: !!perl/code |
        {
            my ($retained) = @_;
            delete $retained->{reseller}->{_links};
            delete $retained->{reseller}->{_embedded};
        }
    conditions:
        is:
            code: 200
        ok:
            '${reseller}.id': defined
            '${reseller}.contract_id': defined
            '${reseller}.name': defined
            '${reseller}.status': defined
        like:
            '${reseller}.id': '[0-9]+'
            '${reseller}.contract_id': '[0-9]+'

#put reseller with missing content type
-
    name: PUT reseller with missing content type
    type: item
    method: PUT
    path: '/${reseller_path3}'
    header:
        Prefer: return=minimal
    conditions:
        is:
            code: 415

#put reseller with unsupported content type
-
    name: PUT reseller with unsupported content type
    type: item
    method: PUT
    path: '/${reseller_path3}'
    header:
        Content-Type: application/xxx
        Prefer: return=minimal
    conditions:
        is:
            code: 415

#put reseller with no body
-
    name: PUT reseller with no body
    type: item
    method: PUT
    path: '/${reseller_path3}'
    header:
        Content-Type: application/json
        Prefer: return=representation
    conditions:
        is:
            code: 400

#put reseller
-
    name: PUT reseller
    type: item
    method: PUT
    path: '/${reseller_path3}'
    header:
        Content-Type: application/json
        Prefer: return=representation
    content: '${reseller}'
    conditions:
        is:
            code: 200

#get reseller
-
    name: GET reseller
    type: item
    method: GET
    path: '/${reseller_path3}'
    retain:
        new_reseller: body
    perl_code: !!perl/code |
        {
            my ($retained) = @_;
            delete $retained->{new_reseller}->{_links};
            delete $retained->{new_reseller}->{_embedded};
        }
    conditions:
        is:
            code: 200
        is_deeply:
            '${reseller}': ${new_reseller}

#PATCH reseller
-
    name: PATCH reseller
    type: item
    method: PATCH
    path: '/${reseller_path3}'
    header:
        Content-Type: application/json-patch+json
        Prefer: return=representation
    content:
        -
            op: replace
            path: /name
            value: patched reseller name ${unique_id}
    perl_code: !!perl/code |
        {
            my ($retained) = @_;
            $retained->{patched_name} = 'patched reseller name '.$retained->{unique_id};
        }
    retain:
        patched_reseller: body
    conditions:
        is:
            code: 200
            '${patched_reseller}.name': '${patched_name}'
            '${patched_reseller}._links.self.href': '${reseller_path3}'
            '${patched_reseller}._links.collection.href': '/api/resellers/'

#PATCH reseller with undef contract id
-
    name: PATCH reseller with undef contract id
    type: item
    method: PATCH
    path: '/${reseller_path3}'
    header:
        Content-Type: application/json-patch+json
        Prefer: return=representation
    content:
        -
            op: replace
            path: /contract_id
            value: null
    conditions:
        is:
            code: 422

#PATCH reseller with invalid contract id
-
    name: PATCH reseller with invalid contract id
    type: item
    method: PATCH
    path: '/${reseller_path3}'
    header:
        Content-Type: application/json-patch+json
        Prefer: return=representation
    content:
        -
            op: replace
            path: /contract_id
            value: 99999
    conditions:
        is:
            code: 422

#PATCH reseller with existing contract id
-
    name: PATCH reseller with existing contract id
    type: item
    method: PATCH
    path: '/${reseller_path3}'
    header:
        Content-Type: application/json-patch+json
        Prefer: return=representation
    content:
        -
            op: replace
            path: /contract_id
            value: ${contract2_id}
    conditions:
        is:
            code: 422

#PATCH reseller with existing name
-
    name: PATCH reseller with existing name
    type: item
    method: PATCH
    path: '/${reseller_path3}'
    header:
        Content-Type: application/json-patch+json
        Prefer: return=representation
    content:
        -
            op: replace
            path: /name
            value: test reseller 2 ${unique_id}
    conditions:
        is:
            code: 422

#PATCH reseller with undef name
-
    name: PATCH reseller with undef name
    type: item
    method: PATCH
    path: '/${reseller_path3}'
    header:
        Content-Type: application/json-patch+json
        Prefer: return=representation
    content:
        -
            op: replace
            path: /name
            value: null
    conditions:
        is:
            code: 422

#PATCH reseller with invalid status
-
    name: PATCH reseller with invalid status
    type: item
    method: PATCH
    path: '/${reseller_path3}'
    header:
        Content-Type: application/json-patch+json
        Prefer: return=representation
    content:
        -
            op: replace
            path: /status
            value: invalid
    conditions:
        is:
            code: 422

#PATCH reseller with undef status
-
    name: PATCH reseller with undef status
    type: item
    method: PATCH
    path: '/${reseller_path3}'
    header:
        Content-Type: application/json-patch+json
        Prefer: return=representation
    content:
        -
            op: replace
            path: /status
            value: null
    conditions:
        is:
            code: 422
