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

#get a domain for testing
-
    name: get a domain for testing
    type: item
    method: GET
    path: '/api/domains/?page=1&rows=1&order_by=id&order_by_direction=desc&reseller_id=1'
    retain:
        domain: body
    perl_code: !!perl/code |
        {
            my ($retained) = @_;
            my $domain = $retained->{domain}->{'_embedded'}->{'ngcp:domains'}->[0];
            $retained->{domain} = $domain;
            $retained->{domain_id} = $domain->{id};
        } 
    conditions:
        is:
            code: 200
        ok:
            '${domain}.id': defined

#create a BillingProfile
-
    name: create a BillingProfile
    type: item
    method: POST
    path: /api/billingprofiles/
    header:
        Content-Type: application/json
        Prefer: return=representation
    content:
        name: test profile ${unique_id}
        handle: test_profile_handle${unique_id}
        reseller_id: 1
    conditions:
        is:
            code: 201
    retain:
        billing_profile_id: header.location

#create a Customer Contact
-
    name: create a Customer Contact
    type: item
    method: POST
    path: /api/customercontacts/
    header:
        Content-Type: application/json
    content:
        firstname: cust_contact_first
        lastname: cust_contact_last
        email: cust_contact@custcontact.invalid
        reseller_id: 1
    conditions:
        is:
            code: 201
    perl_code: !!perl/code |
        {
            my ($retained) = @_;
            $retained->{customer_type} = 'sipaccount';
        }
    retain:
        customer_contact_path: header.location
        customer_contact_id: header.location

#create Customer
-
    name: include create Customer
    type: include
    file: CreateCustomer.yaml
    perl_code: !!perl/code |
        {
            my ($retained) = @_;

            $retained->{customer_content} = {
                status => 'active',
                contact_id => $retained->{customer_contact_id},
                billing_profile_id => $retained->{billing_profile_id},
                type => 'sipaccount',
                max_subscribers => undef,
                external_id => undef
            };
        }

#get a subscriberprofile for testing
-
    name: get a subscriberprofile for testing
    type: item
    method: GET
    path: '/api/subscriberprofiles/?page=1&rows=1&order_by=id&order_by_direction=desc'
    retain:
        subscriberprofile: body
    perl_code: !!perl/code |
        {
            my ($retained) = @_;
            my $subscriberprofile = $retained->{subscriberprofile}->{'_embedded'}->{'ngcp:subscriberprofiles'}->[0];
            $retained->{subscriberprofile} = $subscriberprofile;
            $retained->{subscriberprofile_id} = $subscriberprofile->{id};
            $retained->{customer_id} = $retained->{customer}->{id};
        } 
    conditions:
        is:
            code: 200
        ok:
            '${subscriberprofile}.id': defined

#get a subscriberprofileset for testing
-
    name: get a subscriberprofileset for testing
    type: item
    method: GET
    path: '/api/subscriberprofilesets/?page=1&rows=1&order_by=id&order_by_direction=desc'
    retain:
        subscriberprofileset: body
    perl_code: !!perl/code |
        {
            my ($retained) = @_;
            my $subscriberprofileset = $retained->{subscriberprofileset}->{'_embedded'}->{'ngcp:subscriberprofilesets'}->[0];
            $retained->{subscriberprofileset} = $subscriberprofileset;
            $retained->{subscriberprofileset_id} = $subscriberprofileset->{id};
        } 
    conditions:
        is:
            code: 200
        ok:
            '${subscriberprofileset}.id': defined

#create subscriber
-
    name: create subscriber
    type: item
    method: POST
    path: '/api/subscribers/'
    header:
        Content-Type: application/json
    content:
        administrative: 0
        customer_id: ${customer_id}
        primary_number:
            ac: 12
            cc: 12
            sn: 12
        alias_numbers:
            -
                ac: 112
                cc: 112
                sn: 112
        username: 'api_test_username_1'
        password: 'api_test_password'
        webusername: 'api_test_webusername_1'
        webpassword: 'web_password_1'
        domain_id: ${domain_id}
        email: null
        external_id: null
        is_pbx_group: 0
        is_pbx_pilot: 1
        pbx_extension: '111'
        pbx_group_ids:
            - null
        pbx_groupmember_ids:
            - null
        profile_id: ${subscriberprofile_id}
        profile_set_id: ${subscriberprofileset_id}
        status: 'active'
        pbx_hunt_policy: 'parallel'
        pbx_hunt_timeout: '15'
        pbx_hunt_cancel_mode: 'cancel'
    retain:
        subscriber_path1: header.location
    conditions:
        is:
            code: 201

#create subscriber
-
    name: create subscriber
    type: item
    method: POST
    path: '/api/subscribers/'
    header:
        Content-Type: application/json
    content:
        administrative: 0
        customer_id: ${customer_id}
        primary_number:
            ac: 121
            cc: 12
            sn: 12
        alias_numbers:
            -
                ac: 111
                cc: 11
                sn: 11
            -
                ac: 112
                cc: 11
                sn: 11
        username: 'api_test_username_2'
        password: 'api_test_password'
        webusername: 'api_test_webusername_2'
        webpassword: 'web_password_1'
        domain_id: ${domain_id}
        email: null
        external_id: null
        is_pbx_group: 0
        is_pbx_pilot: 0
        pbx_extension: '222'
        pbx_group_ids:
            - null
        pbx_groupmember_ids:
            - null
        profile_id: ${subscriberprofile_id}
        profile_set_id: ${subscriberprofileset_id}
        status: 'active'
        pbx_hunt_policy: 'parallel'
        pbx_hunt_timeout: '15'
        pbx_hunt_cancel_mode: 'cancel'
    retain:
        subscriber_path2: header.location
    conditions:
        is:
            code: 201

#create subscriber
-
    name: create subscriber
    type: item
    method: POST
    path: '/api/subscribers/'
    header:
        Content-Type: application/json
    content:
        administrative: 0
        customer_id: ${customer_id}
        primary_number:
            ac: 12
            cc: 12
            sn: 12
        alias_numbers:
            -
                ac: 112
                cc: 112
                sn: 112
        username: 'api_test_username'
        password: 'api_test_password'
        webusername: 'api_test_webusername'
        webpassword: 'web_password_1'
        domain_id: ${domain_id}
        email: null
        external_id: null
        is_pbx_group: 0
        is_pbx_pilot: 0
        pbx_extension: '111'
        pbx_group_ids:
            - null
        pbx_groupmember_ids:
            - null
        profile_id: ${subscriberprofile_id}
        profile_set_id: ${subscriberprofileset_id}
        status: 'active'
        pbx_hunt_policy: 'parallel'
        pbx_hunt_timeout: '15'
        pbx_hunt_cancel_mode: 'cancel'
    conditions:
        is:
            code: 422
        like:
            body.message: already exists

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

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

#get subscriber
-
    name: GET subscriber
    type: item
    method: GET
    path: '/${subscriber_path2}'
    retain:
        subscriber: body
    perl_code: !!perl/code |
        {
            my ($retained) = @_;
            delete $retained->{subscriber}->{_links};
            delete $retained->{subscriber}->{_embedded};
            delete $retained->{subscriber}->{modify_timestamp};
            delete $retained->{subscriber}->{create_timestamp};
            delete $retained->{subscriber}->{primary_number_id};
            delete $retained->{subscriber}->{webpassword};
        }
    conditions:
        is:
            code: 200

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

#get subscriber
-
    name: GET subscriber
    type: item
    method: GET
    path: '/${subscriber_path2}'
    retain:
        new_subscriber: body
    perl_code: !!perl/code |
        {
            my ($retained) = @_;
            delete $retained->{new_subscriber}->{_links};
            delete $retained->{new_subscriber}->{_embedded};
            delete $retained->{new_subscriber}->{modify_timestamp};
            delete $retained->{new_subscriber}->{create_timestamp};
            delete $retained->{new_subscriber}->{primary_number_id};
            delete $retained->{new_subscriber}->{webpassword};
        }
    conditions:
        is:
            code: 200
        is_deeply:
            '${subscriber}': ${new_subscriber}

#DELETE subscriber
-
    name: DELETE subscriber
    type: item
    method: DELETE
    path: '/${subscriber_path1}'
    conditions:
        is:
            code: 204

#DELETE subscriber
-
    name: DELETE subscriber
    type: item
    method: DELETE
    path: '/${subscriber_path2}'
    conditions:
        is:
            code: 204
