# 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.

# -*- Mode: perl; indent-tabs-mode: nil -*-

package QA::Tests;

use 5.14.0;
use strict;
use warnings;

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

use parent qw(Exporter);

our @EXPORT_OK = qw(
    PRIVATE_BUG_USER
    STANDARD_BUG_TESTS
    bug_tests
    create_bug_fields
);

use constant INVALID_BUG_ID => -1;
use constant INVALID_BUG_ALIAS => 'aaaaaaa12345';
use constant PRIVATE_BUG_USER => 'QA_Selenium_TEST';

use constant CREATE_BUG => {
    'priority'     => 'Highest',
    'status'       => 'CONFIRMED',
    'version'      => 'unspecified',
    'creator'      => 'editbugs',
    'description'  => '-- Comment Created By Bugzilla XML-RPC Tests --',
    'cc'           => ['unprivileged'],
    'component'    => 'c1',
    'platform'     => 'PC',
    # It's necessary to assign the bug to somebody who isn't in the
    # timetracking group, for the Bug.update tests.
    'assigned_to'  => PRIVATE_BUG_USER,
    'summary'      => 'WebService Test Bug',
    'product'      => 'Another Product',
    'op_sys'       => 'Linux',
    'severity'     => 'normal',
    'qa_contact'   => 'canconfirm',
     version       => 'Another1',
     url           => 'http://www.bugzilla.org/',
     target_milestone => 'AnotherMS1',
};

sub create_bug_fields {
    my ($config) = @_;
    my %bug = %{ CREATE_BUG() };
    foreach my $field (qw(creator assigned_to qa_contact)) {
        my $value = $bug{$field};
        $bug{$field} = $config->{"${value}_user_login"};
    }
    $bug{cc} = [map { $config->{$_ . "_user_login"} } @{ $bug{cc} }];
    return \%bug;
}

sub bug_tests {
    my ($public_id, $private_id) = @_;
    return [
    { args  => { ids => [$private_id] },
      error => "You are not authorized to access",
      test  => 'Logged-out user cannot access a private bug',
    },
    { args => { ids => [$public_id] },
      test => 'Logged-out user can access a public bug.',
    },
    { args  => { ids => [INVALID_BUG_ID] },
      error => "not a valid bug number",
      test  => 'Passing invalid bug id returns error "Invalid Bug ID"',
    },
    { args  => { ids => [undef] },
      error => "You must enter a valid bug number",
      test  => 'Passing undef as bug id param returns error "Invalid Bug ID"',
    },
    { args  => { ids => [INVALID_BUG_ALIAS] },
      error => "nor an alias to a bug",
      test  => 'Passing invalid bug alias returns error "Invalid Bug Alias"',
    },

    { user  => 'editbugs',
      args  => { ids => [$private_id] },
      error => "You are not authorized to access",
      test  => 'Access to a private bug is denied to a user without privs',
    },
    { user => 'unprivileged',
      args => { ids => [$public_id] },
      test => 'User without privs can access a public bug',
    },
    { user => 'admin',
      args => { ids => [$public_id] },
      test => 'Admin can access a public bug.',
    },
    { user => PRIVATE_BUG_USER,
      args => { ids => [$private_id] },
      test => 'User with privs can successfully access a private bug',
    },
    # This helps webservice_bug_attachment get private attachment ids
    # from the public bug, and doesn't hurt for the other tests.
    { user => PRIVATE_BUG_USER,
      args => { ids => [$public_id] },
      test => 'User with privs can also access the public bug',
    },
    ];
}

use constant STANDARD_BUG_TESTS => bug_tests('public_bug', 'private_bug');

1;
