# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.

##############################################
# Test for xmlrpc call to Bug.legal_values() #
##############################################

use 5.14.0;
use strict;
use warnings;

use FindBin qw($RealBin);
use lib "$RealBin/../lib", "$RealBin/../../local/lib/perl5";

use Test::More tests => 269;
use QA::Util;
my ($config, @clients) = get_rpc_clients();

use constant INVALID_PRODUCT_ID => -1;
use constant INVALID_FIELD_NAME => 'invalid_field';
use constant GLOBAL_FIELDS =>
    qw(bug_severity bug_status op_sys priority rep_platform resolution
       cf_qa_status cf_single_select);
use constant PRODUCT_FIELDS => qw(version target_milestone component);


my $products = $clients[0]->bz_get_products();
my $public_product = $products->{'Another Product'};
my $private_product = $products->{'QA-Selenium-TEST'};

my @all_tests;

for my $field (GLOBAL_FIELDS) {
    push(@all_tests,
         { args => { field => $field },
           test => "Logged-out user can get $field values" });
}

for my $field (PRODUCT_FIELDS) {
    my @tests = (
        { args  => { field => $field },
          error => "argument was not set",
          test  => "$field can't be accessed without a value for 'product'",
        },
        { args  => { product_id => INVALID_PRODUCT_ID, field => $field },
          error => "does not exist",
          test  => "$field cannot be accessed with an invalid product id",
        },

        { args  => { product_id => $private_product, field => $field },
          error => "you don't have access",
          test => "Logged-out user cannot access $field in private product"
        },
        { args  => { product_id => $public_product, field => $field },
          test  => "Logged-out user can access $field in a public product",
        },

        { user  => 'unprivileged',
          args  => { product_id => $private_product, field => $field },
          error => "you don't have access",
          test  => "Unprivileged user cannot access $field in private product",
        },
        { user => 'unprivileged',
          args => { product_id => $public_product, field => $field },
          test => "Logged-in user can access $field in public product",
        },

        { user => 'QA_Selenium_TEST',
          args => { product_id => $private_product, field  => $field },
          test => "Privileged user can access $field in a private product",
        },
    );

    push(@all_tests, @tests);
}

my @extra_tests = (
    { args  => { product_id => $private_product, },
      error => "requires a field argument",
      test  =>  "Passing product_id without 'field' throws an error",
    },
    { args  => { field => INVALID_FIELD_NAME },
      error => "Can't use \"" . INVALID_FIELD_NAME . "\" as a field name",
      test  => 'Invalid field name'
    },
);

push(@all_tests, @extra_tests);

sub post_success {
    my ($call) = @_;

    cmp_ok(scalar @{ $call->result->{'values'} }, '>', 0,
           'Got one or more values');
}

foreach my $rpc (@clients) {
    $rpc->bz_run_tests(tests => \@all_tests,  method => 'Bug.legal_values',
                       post_success => \&post_success);
}
