-#!/usr/bin/env perl
use strict;
use warnings;
-use RT::Test tests => 16;
+use RT::Interface::REST;
+
+use RT::Test tests => 34;
my ($baseurl, $m) = RT::Test->started_ok;
for my $name ("severity", "fu()n:k/") {
my $cf = RT::Test->load_or_create_custom_field(
Name => $name,
- Type => 'Freeform',
+ Type => 'FreeformMultiple',
Queue => 'General',
);
ok($cf->Id, "created a CustomField");
is($cf->Name, $name, "correct CF name");
}
+{
+ my $cf = RT::Test->load_or_create_custom_field(
+ Name => 'single',
+ Type => 'FreeformSingle',
+ Queue => 'General',
+ );
+ ok($cf->Id, "created a CustomField");
+}
my $queue = RT::Test->load_or_create_queue(Name => 'General');
ok($queue->Id, "loaded the General queue");
my ($id) = $m->content =~ /Ticket (\d+) created/;
ok($id, "got ticket #$id");
-my $ticket = RT::Ticket->new($RT::SystemUser);
+my $ticket = RT::Ticket->new(RT->SystemUser);
$ticket->Load($id);
is($ticket->Id, $id, "loaded the REST-created ticket");
is($ticket->Subject, "REST interface", "subject successfully set");
$m->content_contains($_);
}
+# Create ticket 2 for testing ticket links
+for (2 .. 3) {
+ $m->post("$baseurl/REST/1.0/ticket/edit", [
+ user => 'root',
+ pass => 'password',
+ content => $text,
+ ], Content_Type => 'form-data');
+
+ $m->post(
+ "$baseurl/REST/1.0/ticket/1/links",
+ [
+ user => 'root',
+ pass => 'password',
+ ],
+ Content_Type => 'form-data',
+ );
+
+ my $link_data = form_parse($m->content);
+
+ push @{$link_data->[0]->[1]}, 'DependsOn';
+ vpush($link_data->[0]->[2], 'DependsOn', $_);
+
+ $m->post(
+ "$baseurl/REST/1.0/ticket/1/links",
+ [
+ user => 'root',
+ pass => 'password',
+ content => form_compose($link_data),
+ ],
+ Content_Type => 'form-data',
+ );
+
+}
+
+# See what links get reported for ticket 1.
+$m->post(
+ "$baseurl/REST/1.0/ticket/1/links/show",
+ [
+ user => 'root',
+ pass => 'password',
+ ],
+ Content_Type => 'form-data',
+);
+
+# Verify that the link was added correctly.
+my $content = form_parse($m->content);
+my $depends_on = vsplit($content->[0]->[2]->{DependsOn});
+@$depends_on = sort @$depends_on;
+like(
+ $depends_on->[0], qr{/ticket/2$},
+ "Check ticket link.",
+) or diag("'content' obtained:\n", $m->content);
+
+like(
+ $depends_on->[1], qr{/ticket/3$},
+ "Check ticket link.",
+) or diag("'content' obtained:\n", $m->content);
+
+$m->post(
+ "$baseurl/REST/1.0/ticket/2/links/show",
+ [
+ user => 'root',
+ pass => 'password',
+ ],
+ Content_Type => 'form-data',
+);
+my ($link) = $m->content =~ m|DependedOnBy:.*ticket/(\d+)|;
+is($link, 1, "Check ticket link.") or diag("'content' obtained:\n", $m->content);
+
+$m->post(
+ "$baseurl/REST/1.0/ticket/3/links/show",
+ [
+ user => 'root',
+ pass => 'password',
+ ],
+ Content_Type => 'form-data',
+);
+($link) = $m->content =~ m|DependedOnBy:.*ticket/(\d+)|;
+is($link, 1, "Check ticket link.") or diag("'content' obtained:\n", $m->content);
+
+
+{
+ $m->post("$baseurl/REST/1.0/ticket/new", [
+ user => 'root',
+ pass => 'password',
+ format => 'l',
+ ]);
+
+ my $text = $m->content;
+ my @lines = $text =~ m{.*}g;
+ shift @lines; # header
+ push @lines, "CF.{severity}: explosive";
+ push @lines, "CF.{severity}: very";
+ $text = join "\n", @lines;
+
+ $m->post("$baseurl/REST/1.0/ticket/edit", [
+ user => 'root',
+ pass => 'password',
+
+ content => $text,
+ ], Content_Type => 'form-data');
+
+ my ($id) = $m->content =~ /Ticket (\d+) created/;
+ ok($id, "got ticket #$id");
+
+ my $ticket = RT::Ticket->new(RT->SystemUser);
+ $ticket->Load($id);
+ is($ticket->Id, $id, "loaded the REST-created ticket");
+ is_deeply(
+ [sort map $_->Content, @{ $ticket->CustomFieldValues("severity")->ItemsArrayRef }],
+ ["explosive", "very"],
+ "CF successfully set"
+ );
+
+ $m->post(
+ "$baseurl/REST/1.0/ticket/show",
+ [
+ user => 'root',
+ pass => 'password',
+ format => 'l',
+ id => "ticket/$id",
+ ]
+ );
+ $text = $m->content;
+ $text =~ s/.*?\n\n//;
+ $text =~ s/\n\n/\n/;
+ $text =~ s{CF\.\{severity\}:.*\n}{}img;
+ $text .= "CF.{severity}: explosive, a bit\n";
+ $m->post(
+ "$baseurl/REST/1.0/ticket/edit",
+ [
+ user => 'root',
+ pass => 'password',
+ content => $text,
+ ],
+ Content_Type => 'form-data'
+ );
+ $m->content =~ /Ticket ($id) updated/;
+
+ $ticket->Load($id);
+ is_deeply(
+ [sort map $_->Content, @{ $ticket->CustomFieldValues("severity")->ItemsArrayRef }],
+ ['a bit', 'explosive'],
+ "CF successfully set"
+ );
+
+ $m->post(
+ "$baseurl/REST/1.0/ticket/show",
+ [
+ user => 'root',
+ pass => 'password',
+ format => 'l',
+ id => "ticket/$id",
+ ]
+ );
+ $text = $m->content;
+ $text =~ s{CF\.\{severity\}:.*\n}{}img;
+ $text .= "CF.{severity}:\n";
+ $m->post(
+ "$baseurl/REST/1.0/ticket/edit",
+ [
+ user => 'root',
+ pass => 'password',
+ content => $text,
+ ],
+ Content_Type => 'form-data'
+ );
+ $m->content =~ /Ticket ($id) updated/;
+
+ $ticket->Load($id);
+ is_deeply(
+ [sort map $_->Content, @{ $ticket->CustomFieldValues("severity")->ItemsArrayRef }],
+ [],
+ "CF successfully set"
+ );
+
+ my @txns = map [$_->OldValue, $_->NewValue], grep $_->Type eq 'CustomField',
+ @{ $ticket->Transactions->ItemsArrayRef };
+ is_deeply(\@txns, [['very', undef], [undef, 'a bit'], ['explosive', undef], ['a bit', undef]]);
+}
+
+{
+ $m->post("$baseurl/REST/1.0/ticket/new", [
+ user => 'root',
+ pass => 'password',
+ format => 'l',
+ ]);
+
+ my $text = $m->content;
+ my @lines = $text =~ m{.*}g;
+ shift @lines; # header
+ push @lines, "CF.{single}: this";
+ $text = join "\n", @lines;
+
+ $m->post("$baseurl/REST/1.0/ticket/edit", [
+ user => 'root',
+ pass => 'password',
+
+ content => $text,
+ ], Content_Type => 'form-data');
+
+ my ($id) = $m->content =~ /Ticket (\d+) created/;
+ ok($id, "got ticket #$id");
+
+ my $ticket = RT::Ticket->new(RT->SystemUser);
+ $ticket->Load($id);
+ is($ticket->Id, $id, "loaded the REST-created ticket");
+ is_deeply(
+ [sort map $_->Content, @{ $ticket->CustomFieldValues("single")->ItemsArrayRef }],
+ ["this"],
+ "CF successfully set"
+ );
+
+ $m->post(
+ "$baseurl/REST/1.0/ticket/show",
+ [
+ user => 'root',
+ pass => 'password',
+ format => 'l',
+ id => "ticket/$id",
+ ]
+ );
+ $text = $m->content;
+ $text =~ s{CF\.\{single\}:.*\n}{}img;
+ $text .= "CF.{single}: that\n";
+ $m->post(
+ "$baseurl/REST/1.0/ticket/edit",
+ [
+ user => 'root',
+ pass => 'password',
+ content => $text,
+ ],
+ Content_Type => 'form-data'
+ );
+ $m->content =~ /Ticket ($id) updated/;
+
+ $ticket->Load($id);
+ is_deeply(
+ [sort map $_->Content, @{ $ticket->CustomFieldValues("single")->ItemsArrayRef }],
+ ['that'],
+ "CF successfully set"
+ );
+
+ my @txns = map [$_->OldValue, $_->NewValue], grep $_->Type eq 'CustomField',
+ @{ $ticket->Transactions->ItemsArrayRef };
+ is_deeply(\@txns, [['this', 'that']]);
+}