RT 4.2.11, ticket#13852
[freeside.git] / rt / t / api / db_indexes.t
diff --git a/rt/t/api/db_indexes.t b/rt/t/api/db_indexes.t
new file mode 100644 (file)
index 0000000..3c305d8
--- /dev/null
@@ -0,0 +1,165 @@
+use strict;
+use warnings;
+use Test::Warn;
+
+use RT::Test tests => undef;
+
+my $handle = $RT::Handle;
+my $db_type = RT->Config->Get('DatabaseType');
+
+# Pg,Oracle needs DBA
+RT::Test::__reconnect_rt('as dba');
+ok( $handle->dbh->do("ALTER SESSION SET CURRENT_SCHEMA=". RT->Config->Get('DatabaseUser') ) )
+    if $db_type eq 'Oracle';
+
+note "test handle->Indexes method";
+{
+    my %indexes = $handle->Indexes;
+    ok grep $_ eq 'tickets1', @{ $indexes{'tickets'} };
+    ok grep $_ eq 'tickets2', @{ $indexes{'tickets'} };
+    ok grep $_ eq 'users1', @{ $indexes{'users'} };
+    ok grep $_ eq 'users4', @{ $indexes{'users'} };
+}
+
+note "test handle->DropIndex method";
+{
+    my ($status, $msg) = $handle->DropIndex( Table => 'Tickets', Name => 'Tickets1' );
+    ok $status, $msg;
+
+    my %indexes = $handle->Indexes;
+    ok !grep $_ eq 'tickets1', @{ $indexes{'tickets'} };
+
+    ($status, $msg) = $handle->DropIndex( Table => 'Tickets', Name => 'Tickets1' );
+    ok !$status, $msg;
+}
+
+note "test handle->DropIndexIfExists method";
+{
+    my ($status, $msg) = $handle->DropIndexIfExists( Table => 'Tickets', Name => 'Tickets2' );
+    ok $status, $msg;
+
+    my %indexes = $handle->Indexes;
+    ok !grep $_ eq 'tickets2', @{ $indexes{'tickets'} };
+
+    ($status, $msg) = $handle->DropIndexIfExists( Table => 'Tickets', Name => 'Tickets2' );
+    ok $status, $msg;
+}
+
+note "test handle->IndexInfo method";
+{
+    if ($db_type ne 'Oracle' && $db_type ne 'mysql') {
+        my %res = $handle->IndexInfo( Table => 'Attachments', Name => 'Attachments1' );
+        is_deeply(
+            \%res,
+            {
+                Table => 'attachments', Name => 'attachments1',
+                Unique => 0, Functional => 0,
+                Columns => ['parent']
+            }
+        );
+    } else {
+        my %res = $handle->IndexInfo( Table => 'Attachments', Name => 'Attachments2' );
+        is_deeply(
+            \%res,
+            {
+                Table => 'attachments', Name => 'attachments2',
+                Unique => 0, Functional => 0,
+                Columns => ['transactionid']
+            }
+        );
+    }
+
+    my %res = $handle->IndexInfo( Table => 'GroupMembers', Name => 'GroupMembers1' );
+    is_deeply(
+        \%res,
+        {
+            Table => 'groupmembers', Name => 'groupmembers1',
+            Unique => 1, Functional => 0,
+            Columns => ['groupid', 'memberid']
+        }
+    );
+
+    if ( $db_type eq 'Pg' || $db_type eq 'Oracle' ) {
+        %res = $handle->IndexInfo( Table => 'Queues', Name => 'Queues1' );
+        is_deeply(
+            \%res,
+            {
+                Table => 'queues', Name => 'queues1',
+                Unique => 1, Functional => 1,
+                Columns => ['name'],
+                CaseInsensitive => { name => 1 },
+            }
+        );
+    }
+}
+
+note "test ->CreateIndex and ->IndexesThatBeginWith methods";
+{
+    {
+        my ($name, $msg) = $handle->CreateIndex(
+            Table => 'Users', Name => 'test_users1',
+            Columns => ['Organization'],
+        );
+        ok $name, $msg;
+    }
+    {
+        my ($name, $msg) = $handle->CreateIndex(
+            Table => 'Users', Name => 'test_users2',
+            Columns => ['Organization', 'Name'],
+        );
+        ok $name, $msg;
+    }
+
+    my @list = $handle->IndexesThatBeginWith( Table => 'Users', Columns => ['Organization'] );
+    is_deeply([sort map $_->{Name}, @list], [qw(test_users1 test_users2)]);
+
+    my ($status, $msg) = $handle->DropIndex( Table => 'Users', Name => 'test_users1' );
+    ok $status, $msg;
+    ($status, $msg) = $handle->DropIndex( Table => 'Users', Name => 'test_users2' );
+    ok $status, $msg;
+}
+
+note "Test some cases sensitivity aspects";
+{
+    {
+        my %res = $handle->IndexInfo( Table => 'groupmembers', Name => 'groupmembers1' );
+        is_deeply(
+            \%res,
+            {
+                Table => 'groupmembers', Name => 'groupmembers1',
+                Unique => 1, Functional => 0,
+                Columns => ['groupid', 'memberid']
+            }
+        );
+    }
+
+    {
+        my ($status, $msg) = $handle->DropIndex( Table => 'groupmembers', Name => 'groupmembers1' );
+        ok $status, $msg;
+
+        my %indexes = $handle->Indexes;
+        ok !grep $_ eq 'groupmembers1', @{ $indexes{'groupmembers'} };
+    }
+
+    {
+        my ($name, $msg) = $handle->CreateIndex(
+            Table => 'groupmembers', Name => 'groupmembers1',
+            Unique => 1,
+            Columns => ['groupid', 'memberid']
+        );
+        ok $name, $msg;
+
+        my %indexes = $handle->Indexes;
+        ok grep $_ eq 'groupmembers1', @{ $indexes{'groupmembers'} };
+    }
+
+    {
+        my ($status, $msg) = $handle->DropIndexIfExists( Table => 'groupmembers', Name => 'groupmembers1' );
+        ok $status, $msg;
+
+        my %indexes = $handle->Indexes;
+        ok !grep $_ eq 'groupmembers1', @{ $indexes{'groupmembers'} };
+    }
+}
+
+done_testing();