diff options
Diffstat (limited to 'rt/t/web/cf_groupings.t')
-rw-r--r-- | rt/t/web/cf_groupings.t | 277 |
1 files changed, 277 insertions, 0 deletions
diff --git a/rt/t/web/cf_groupings.t b/rt/t/web/cf_groupings.t new file mode 100644 index 000000000..0a40f71af --- /dev/null +++ b/rt/t/web/cf_groupings.t @@ -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; |