RT 4.2.11, ticket#13852
[freeside.git] / rt / t / web / cf_groupings.t
diff --git a/rt/t/web/cf_groupings.t b/rt/t/web/cf_groupings.t
new file mode 100644 (file)
index 0000000..0a40f71
--- /dev/null
@@ -0,0 +1,277 @@
+use strict;
+use warnings;
+
+use RT::Test tests => undef;
+
+my @groupings = qw/Basics Dates People Links More/;
+RT->Config->Set( 'CustomFieldGroupings',
+    'RT::Ticket' => {
+        map { +($_ => ["Test$_"]) } @groupings,
+    },
+);
+
+my %CF;
+for my $grouping (@groupings) {
+    my $name = "Test$grouping";
+    my $cf = RT::CustomField->new( RT->SystemUser );
+    my ($id, $msg) = $cf->Create(
+        Name => $name,
+        Queue => '0',
+        Description => 'A Testing custom field',
+        Type => 'FreeformSingle',
+        Pattern => '^(?!bad value).*$',
+    );
+    ok $id, "custom field '$name' correctly created";
+    $CF{$grouping} = $id;
+}
+
+my $queue = RT::Test->load_or_create_queue( Name => 'General' );
+
+my ( $baseurl, $m ) = RT::Test->started_ok;
+ok $m->login, 'logged in as root';
+
+my %location = (
+    Basics => ".ticket-info-basics",
+    Dates  => ".ticket-info-dates",
+    People => "#ticket-create-message",
+    Links  => ".ticket-info-links",
+    More   => ".ticket-info-cfs",
+);
+{
+    note "testing Create";
+    $m->goto_create_ticket($queue);
+
+    my $prefix = 'Object-RT::Ticket--CustomField:';
+    my $dom = $m->dom;
+    $m->form_name('TicketCreate');
+    $m->field("Subject", "CF grouping test");
+
+    for my $grouping (@groupings) {
+        my $input_name = $prefix . "$grouping-$CF{$grouping}-Value";
+        is $dom->find(qq{input[name="$input_name"]})->size, 1, "only one CF input on the page";
+        ok $dom->at(qq{$location{$grouping} input[name="$input_name"]}), "CF is in the right place";
+        $m->field( $input_name, "Test" . $grouping . "Value" );
+    }
+    $m->submit;
+}
+
+my $id = $m->get_ticket_id;
+{
+    note "testing Display";
+    ok $id, "created a ticket";
+    my $dom = $m->dom;
+
+    $location{People} = ".ticket-info-people";
+    foreach my $grouping (@groupings) {
+        my $row_id = "CF-$CF{$grouping}-ShowRow";
+        is $dom->find(qq{#$row_id})->size, 1, "CF on the page";
+        is $dom->at(qq{#$row_id})->all_text, "Test$grouping: Test${grouping}Value", "value is set";
+        ok $dom->at(qq{$location{$grouping} #$row_id}), "CF is in the right place";
+    }
+}
+
+{
+    note "testing Basics/People/Dates/Links pages";
+    my $prefix = 'Object-RT::Ticket-'. $id .'-CustomField:';
+    { # Basics and More both show up on "Basics"
+        for my $name (qw/Basics More/) {
+            $m->follow_link_ok({id => 'page-basics'}, 'Ticket -> Basics');
+            is $m->dom->find(qq{input[name^="$prefix"][name\$="-Value"]})->size, 2,
+                "two CF inputs on the page";
+
+            my $input_name = "$prefix$name-$CF{$name}-Value";
+            ok $m->dom->at(qq{$location{$name} input[name="$input_name"]}),
+                "CF is in the right place";
+            $m->submit_form_ok({
+                with_fields => { $input_name => "Test${name}Changed" },
+                button      => 'SubmitTicket',
+            });
+            $m->content_like(qr{to Test${name}Changed});
+
+            $m->submit_form_ok({
+                with_fields => { $input_name => "bad value" },
+                button      => 'SubmitTicket',
+            });
+            $m->content_like(qr{Test\Q$name\E: Input must match});
+        }
+    }
+
+    # Everything else gets its own page
+    foreach my $name ( qw(People Dates Links) ) {
+        $m->follow_link_ok({id => "page-\L$name"}, "Ticket's $name page");
+        is $m->dom->find(qq{input[name^="$prefix"][name\$="-Value"]})->size, 1,
+            "only one CF input on the page";
+        my $input_name = "$prefix$name-$CF{$name}-Value";
+        $m->submit_form_ok({
+            with_fields => { $input_name => "Test${name}Changed" },
+            button      => 'SubmitTicket',
+        });
+        $m->content_like(qr{to Test${name}Changed});
+
+        $m->submit_form_ok({
+            with_fields => { $input_name => "bad value" },
+            button      => 'SubmitTicket',
+        });
+        $m->content_like(qr{Could not add new custom field value: Input must match});
+    }
+}
+
+{
+    note "testing Jumbo";
+    my $prefix = 'Object-RT::Ticket-'. $id .'-CustomField:';
+    $m->follow_link_ok({id => "page-jumbo"}, "Ticket's Jumbo page");
+    my $dom = $m->dom;
+    $m->form_name("TicketModifyAll");
+
+    foreach my $name ( qw(Basics People Dates Links More) ) {
+        my $input_name = "$prefix$name-$CF{$name}-Value";
+        is $dom->find(qq{input[name="$input_name"]})->size, 1,
+            "only one CF input on the page";
+        $m->field( $input_name, "Test${name}Again" );
+    }
+    $m->click('SubmitTicket');
+    foreach my $name ( qw(Basics People Dates Links More) ) {
+        $m->content_like(qr{to Test${name}Again});
+    }
+}
+
+{
+    note "Reconfigure to place one CF in multiple boxes";
+    $m->no_warnings_ok;
+    RT::Test->stop_server;
+
+    RT->Config->Set( 'CustomFieldGroupings',
+        'RT::Ticket' => {
+            Basics => [ 'TestMore' ],
+            More   => [ 'TestMore' ],
+        },
+    );
+
+    ( $baseurl, $m ) = RT::Test->started_ok;
+    ok $m->login, 'logged in as root';
+}
+
+{
+    note "Testing one CF in multiple boxes";
+    $m->goto_create_ticket($queue);
+
+    my $prefix = 'Object-RT::Ticket--CustomField:';
+    my $dom = $m->dom;
+    $m->form_name('TicketCreate');
+
+    my $cf = $CF{More};
+    is $m->dom->find(qq{input[name^="$prefix"][name\$="-$cf-Value"]})->size, 2,
+        "Two 'More' CF inputs on the page";
+    for my $grouping (qw/Basics More/) {
+        my $input_name = $prefix . "$grouping-$cf-Value";
+        is $dom->find(qq{input[name="$input_name"]})->size, 1, "Found the $grouping grouping";
+        ok $dom->at(qq{$location{$grouping} input[name="$input_name"]}), "CF is in the right place";
+        $m->field( $input_name, "TestMoreValue" );
+    }
+    $m->submit;
+    $m->no_warnings_ok( "Submitting CF with two (identical) values had no warnings" );
+}
+
+$id = $m->get_ticket_id;
+my $ticket = RT::Ticket->new ( RT->SystemUser );
+$ticket->Load( $id );
+is $ticket->CustomFieldValuesAsString( "TestMore", Separator => "|" ), "TestMoreValue",
+    "Value submitted twice is set correctly (and only once)";
+
+my $cf = $CF{More};
+my $prefix = 'Object-RT::Ticket-'. $id .'-CustomField:';
+{
+    note "Updating with multiple appearances of a CF";
+    $m->follow_link_ok({id => 'page-basics'}, 'Ticket -> Basics');
+
+    is $m->dom->find(qq{input[name^="$prefix"][name\$="-$cf-Value"]})->size, 2,
+        "Two 'More' CF inputs on the page";
+    my @inputs;
+    for my $grouping (qw/Basics More/) {
+        my $input_name =  "$prefix$grouping-$cf-Value";
+        push @inputs, $input_name;
+        ok $m->dom->at(qq{$location{$grouping} input[name="$input_name"]}),
+            "CF is in the right place";
+    }
+    $m->submit_form_ok({
+        with_fields => {
+            map {+($_ => "TestMoreChanged")} @inputs,
+        },
+        button => 'SubmitTicket',
+    });
+    $m->no_warnings_ok;
+    $m->content_like(qr{to TestMoreChanged});
+
+    $ticket->Load( $id );
+    is $ticket->CustomFieldValuesAsString( "TestMore", Separator => "|" ), "TestMoreChanged",
+        "Updated value submitted twice is set correctly (and only once)";
+}
+
+{
+    note "Updating with _differing_ values in multiple appearances of a CF";
+
+    my %inputs = map {+($_ => "$prefix$_-$cf-Value")} qw/Basics More/;
+    $m->submit_form_ok({
+        with_fields => {
+            $inputs{Basics} => "BasicsValue",
+            $inputs{More}   => "MoreValue",
+        },
+        button => 'SubmitTicket',
+    });
+    $m->warning_like(qr{CF $cf submitted with multiple differing values});
+    $m->content_like(qr{to BasicsValue}, "Arbitrarily chose first value");
+
+    $ticket->Load( $id );
+    is $ticket->CustomFieldValuesAsString( "TestMore", Separator => "|" ), "BasicsValue",
+        "Conflicting value submitted twice is set correctly (and only once)";
+}
+
+{
+    note "Configuring CF to be a select-multiple";
+    my $custom_field = RT::CustomField->new( RT->SystemUser );
+    $custom_field->Load( $cf );
+    $custom_field->SetType( "Select" );
+    $custom_field->SetMaxValues( 0 );
+    $custom_field->AddValue( Name => $_ ) for 1..9;
+}
+
+{
+    note "Select multiples do not interfere with each other when appearing multiple times";
+    $m->follow_link_ok({id => 'page-basics'}, 'Ticket -> Basics');
+
+    $m->form_name('TicketModify');
+    my %inputs = map {+($_ => "$prefix$_-$cf-Values")} qw/Basics More/;
+    ok $m->dom->at(qq{select[name="$inputs{Basics}"]}), "Found 'More' CF in Basics box";
+    ok $m->dom->at(qq{select[name="$inputs{More}"]}),   "Found 'More' CF in More box";
+
+    $m->select( $inputs{Basics} => [1, 3, 9] );
+    $m->select( $inputs{More}   => [1, 3, 9] );
+    $m->click( 'SubmitTicket' );
+    $m->no_warnings_ok;
+    $m->content_like(qr{$_ added as a value for TestMore}) for 1, 3, 9;
+    $m->content_like(qr{BasicsValue is no longer a value for custom field TestMore});
+
+    $ticket->Load( $id );
+    is $ticket->CustomFieldValuesAsString( "TestMore", Separator => "|" ), "1|3|9",
+        "Multi-select values submitted correctly";
+}
+
+{
+    note "Submit multiples correctly choose one set of values when conflicting information is submitted";
+    $m->form_name('TicketModify');
+    my %inputs = map {+($_ => "$prefix$_-$cf-Values")} qw/Basics More/;
+    $m->select( $inputs{Basics} => [2, 3, 4] );
+    $m->select( $inputs{More}   => [8, 9] );
+    $m->click( 'SubmitTicket' );
+    $m->warning_like(qr{CF $cf submitted with multiple differing values});
+    $m->content_like(qr{$_ added as a value for TestMore}) for 2, 4;
+    $m->content_unlike(qr{$_ added as a value for TestMore}) for 8;
+    $m->content_like(qr{$_ is no longer a value for custom field TestMore}) for 1, 9;
+
+    $ticket->Load( $id );
+    is $ticket->CustomFieldValuesAsString( "TestMore", Separator => "|" ), "3|2|4",
+        "Multi-select values submitted correctly";
+}
+
+undef $m;
+done_testing;