---
#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
    retain:
        customer_contact_path: header.location
        customer_contact_id: header.location

#get CustomerContact
-
    name: check CustomerContact
    type: item
    method: GET
    path: '/${customer_contact_path}'
    retain:
        customer_contact: body
    conditions:
        is:
            code: 200

#create a Domain
-
    name: create a Domain
    type: item
    method: POST
    path: /api/domains/
    header:
        Content-Type: application/json
    content:
        domain: test${unique_id}.example.org
        reseller_id: 1
    conditions:
        is:
            code: 201
    retain:
        domain_path: header.location
        domain_id: header.location

#get Domain
-
    name: check Domain
    type: item
    method: GET
    path: '/${domain_path}'
    retain:
        domain: body
    conditions:
        is:
            code: 200

#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:
        billingprofile_id: header.location
    conditions:
        is:
            code: 201

#get billingprofile
-
    name: get billingprofile
    type: item
    method: GET
    path: '/api/billingprofiles/${billingprofile_id}'
    retain:
        billingprofile: body
    conditions:
        is:
            code: 200

#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->{billingprofile_id},
                type => 'sipaccount',
                max_subscribers => undef,
                external_id => undef
            };
        }

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

            my $cc = 800;
            my $ac = '1';
            my $sn = $retained->{unique_id};
            $retained->{customer_id} = $retained->{customer}->{id};
            $retained->{subscriber_content} = {
                primary_number => { cc => $cc, ac => $ac, sn => $sn },
                domain_id => $retained->{domain_id},
                username => 'subscriber_' . '1' . '_'.$retained->{unique_id},
                password => 'subscriber_password',
                customer_id => $retained->{customer_id},
            };
        }

#create voucher
-
    name: create voucher
    type: item
    method: POST
    path: '/api/vouchers/'
    header:
        Content-Type: application/json
    content:
        amount: 1000.0
        code: test_voucher_1${unique_id}
        customer_id: ${customer_id}
        reseller_id: 1
        valid_until: '2037-01-01 00:00:00'
    retain:
        voucher_path1: header.location
    conditions:
        is:
            code: 201

#get Voucher
-
    name: get Voucher
    type: item
    method: GET
    path: '${voucher_path1}'
    retain:
        voucher1: body
    perl_code: !!perl/code |
        {
            my ($retained) = @_;
            $retained->{voucher1_code} = $retained->{voucher1}->{code};
        }
    conditions:
        is:
            code: 200

#create voucher
-
    name: create voucher
    type: item
    method: POST
    path: '/api/vouchers/'
    header:
        Content-Type: application/json
    content:
        amount: 1000.0
        code: test_voucher_2${unique_id}
        customer_id: ${customer_id}
        reseller_id: 1
        valid_until: '2010-01-01 00:00:00'
    retain:
        voucher_path2: header.location
    conditions:
        is:
            code: 201

#get Voucher
-
    name: get Voucher
    type: item
    method: GET
    path: '${voucher_path2}'
    retain:
        voucher2: body
    perl_code: !!perl/code |
        {
            my ($retained) = @_;
            $retained->{voucher2_code} = $retained->{voucher2}->{code};
            $retained->{subscriber_id} = $retained->{subscriber}->{id};
        }
    conditions:
        is:
            code: 200

#perform topup cash
-
    name: perform topup cash
    type: item
    method: POST
    path: '/api/topupcash/'
    header:
        Content-Type: application/json
    content:
        amount: 0.5
        package_id: null
        subscriber_id: invalid
        request_token: 1${unique_id}
    conditions:
        is:
            code: 422

#check topuplog
-
    name: check topuplog
    type: item
    method: GET
    path: '/api/topuplogs/?page=1&rows=10&order_by_direction=asc&order_by=timestamp&request_token=1${unique_id}'
    retain:
        topuplogs_result: body
    perl_code: !!perl/code |
        {
            my ($retained) = @_;
            $retained->{topuplogs} = $retained->{topuplogs_result}->{_embedded}->{'ngcp:topuplogs'}->[0];
            $retained->{expected_token} = "1$retained->{unique_id}";
            $retained->{expected_outcome} = 'failed';
        }
    conditions:
        is:
            '${topuplogs}.request_token': '${expected_token}'
            '${topuplogs}.outcome': '${expected_outcome}'
        like:
            '${topuplogs}.message': "Validation failed. field='subscriber_id'"

#perform topup cash
-
    name: perform topup cash
    type: item
    method: POST
    path: '/api/topupcash/'
    header:
        Content-Type: application/json
    content:
        amount: 'invalid_amount'
        package_id: null
        subscriber_id: ${subscriber_id}
        request_token: 2${unique_id}
    conditions:
        is:
            code: 422

#check topuplog
-
    name: check topuplog
    type: item
    method: GET
    path: '/api/topuplogs/?page=1&rows=10&order_by_direction=asc&order_by=timestamp&request_token=2${unique_id}'
    retain:
        topuplogs_result: body
    perl_code: !!perl/code |
        {
            my ($retained) = @_;
            $retained->{topuplogs} = $retained->{topuplogs_result}->{_embedded}->{'ngcp:topuplogs'}->[0];
            $retained->{expected_token} = "2$retained->{unique_id}";
            $retained->{expected_outcome} = 'failed';
        }
    conditions:
        is:
            '${topuplogs}.request_token': '${expected_token}'
            '${topuplogs}.outcome': '${expected_outcome}'
        like:
            '${topuplogs}.message': "Value cannot be converted to money"

#perform topup cash
-
    name: perform topup cash
    type: item
    method: POST
    path: '/api/topupcash/'
    header:
        Content-Type: application/json
    content:
        amount: 50
        package_id:
            id : invalid
        subscriber_id: ${subscriber_id}
        request_token: 3${unique_id}
    conditions:
        is:
            code: 422

#check topuplog
-
    name: check topuplog
    type: item
    method: GET
    path: '/api/topuplogs/?page=1&rows=10&order_by_direction=asc&order_by=timestamp&request_token=3${unique_id}'
    retain:
        topuplogs_result: body
    perl_code: !!perl/code |
        {
            my ($retained) = @_;
            $retained->{topuplogs} = $retained->{topuplogs_result}->{_embedded}->{'ngcp:topuplogs'}->[0];
            $retained->{expected_token} = "3$retained->{unique_id}";
            $retained->{expected_outcome} = 'failed';
        }
    conditions:
        is:
            '${topuplogs}.request_token': '${expected_token}'
            '${topuplogs}.outcome': '${expected_outcome}'
        like:
            '${topuplogs}.message': "Validation failed. field='package_id'"

#perform topup voucher
-
    name: perform topup voucher
    type: item
    method: POST
    path: '/api/topupvouchers/'
    header:
        Content-Type: application/json
    content:
        code: invalid
        subscriber_id: ${subscriber_id}
        request_token: 4${unique_id}
    conditions:
        is:
            code: 422

#check topuplog
-
    name: check topuplog
    type: item
    method: GET
    path: '/api/topuplogs/?page=1&rows=10&order_by_direction=asc&order_by=timestamp&request_token=4${unique_id}'
    retain:
        topuplogs_result: body
    perl_code: !!perl/code |
        {
            my ($retained) = @_;
            $retained->{topuplogs} = $retained->{topuplogs_result}->{_embedded}->{'ngcp:topuplogs'}->[0];
            $retained->{expected_token} = "4$retained->{unique_id}";
            $retained->{expected_outcome} = 'failed';
            $retained->{long_request_token} = 'a' x 256;
            $retained->{expected_request_token} = substr($retained->{long_request_token},0,255);
        }
    conditions:
        is:
            '${topuplogs}.request_token': '${expected_token}'
            '${topuplogs}.outcome': '${expected_outcome}'
        like:
            '${topuplogs}.message': "Invalid voucher code 'invalid'"

#perform topup voucher
-
    name: perform topup voucher
    type: item
    method: POST
    path: '/api/topupvouchers/'
    header:

        Content-Type: application/json
    content:
        code: ${voucher1_code}
        subscriber_id: ${subscriber_id}
        request_token: ${long_request_token}
    conditions:
        is:
            code: 422

#check topuplog
-
    name: check topuplog
    type: item
    method: GET
    path: '/api/topuplogs/?page=1&rows=10&order_by_direction=asc&order_by=timestamp&request_token=${expected_request_token}'
    retain:
        topuplogs_result: body
    perl_code: !!perl/code |
        {
            my ($retained) = @_;
            $retained->{topuplogs} = $retained->{topuplogs_result}->{_embedded}->{'ngcp:topuplogs'}->[0];
        }
    conditions:
        is:
            '${topuplogs}.request_token': '${expected_request_token}'
            '${topuplogs}.outcome': 'failed'
        like:
            '${topuplogs}.message': "Validation failed. field='request_token'"

#perform topup voucher
-
    name: perform topup voucher
    type: item
    method: POST
    path: '/api/topupvouchers/'
    header:
        Content-Type: application/json
    content:
        code: ${voucher1_code}
        subscriber_id: ${subscriber_id}
        request_token: 5${unique_id}
    conditions:
        is:
            code: 204

#perform same topup voucher
-
    name: perform same topup voucher
    type: item
    method: POST
    path: '/api/topupvouchers/'
    header:
        Content-Type: application/json
    content:
        code: ${voucher1_code}
        subscriber_id: ${subscriber_id}
        request_token: 6${unique_id}
    conditions:
        is:
            code: 422

#check topuplog
-
    name: check topuplog
    type: item
    method: GET
    path: '/api/topuplogs/?page=1&rows=10&order_by_direction=asc&order_by=timestamp&request_token=6${unique_id}'
    retain:
        topuplogs_result: body
    perl_code: !!perl/code |
        {
            my ($retained) = @_;
            $retained->{topuplogs} = $retained->{topuplogs_result}->{_embedded}->{'ngcp:topuplogs'}->[0];
            $retained->{expected_token} = "6$retained->{unique_id}";
        }
    conditions:
        is:
            '${topuplogs}.request_token': '${expected_token}'
            '${topuplogs}.outcome': 'failed'
        like:
            '${topuplogs}.message': "already used"

#perform same topup voucher
-
    name: perform same topup voucher
    type: item
    method: POST
    path: '/api/topupvouchers/'
    header:
        Content-Type: application/json
    content:
        code: ${voucher2_code}
        subscriber_id: ${subscriber_id}
        request_token: 7${unique_id}
    conditions:
        is:
            code: 422

#check topuplog
-
    name: check topuplog
    type: item
    method: GET
    path: '/api/topuplogs/?page=1&rows=10&order_by_direction=asc&order_by=timestamp&request_token=7${unique_id}'
    retain:
        topuplogs_result: body
    perl_code: !!perl/code |
        {
            my ($retained) = @_;
            $retained->{topuplogs} = $retained->{topuplogs_result}->{_embedded}->{'ngcp:topuplogs'}->[0];
            $retained->{expected_token} = "7$retained->{unique_id}";
        }
    conditions:
        is:
            '${topuplogs}.request_token': '${expected_token}'
            '${topuplogs}.outcome': 'failed'
        like:
            '${topuplogs}.message': "expired"