3131import org .labkey .remoteapi .domain .GetDomainDetailsCommand ;
3232import org .labkey .remoteapi .domain .PropertyDescriptor ;
3333import org .labkey .remoteapi .domain .SaveDomainCommand ;
34+ import org .labkey .remoteapi .query .BaseQueryCommand ;
3435import org .labkey .remoteapi .query .DeleteRowsCommand ;
36+ import org .labkey .remoteapi .query .ExecuteSqlCommand ;
3537import org .labkey .remoteapi .query .Filter ;
3638import org .labkey .remoteapi .query .InsertRowsCommand ;
3739import org .labkey .remoteapi .query .SaveRowsResponse ;
7072import org .labkey .test .util .PermissionsHelper .PrincipalType ;
7173import org .labkey .test .util .PortalHelper ;
7274
75+ import java .io .IOException ;
7376import java .util .ArrayList ;
7477import java .util .Arrays ;
7578import java .util .Collections ;
@@ -570,7 +573,7 @@ public void testImpersonateUser() throws Exception
570573 // stop impersonation
571574 StopImpersonatingCommand stopCmd = new StopImpersonatingCommand ();
572575 CommandResponse stopResp = stopCmd .execute (cn , PROJECT_NAME );
573- assertEquals (302 , stopResp .getStatusCode ());
576+ assertEquals (200 , stopResp .getStatusCode ());
574577
575578 // check whoami
576579 who = new WhoAmICommand ().execute (cn , PROJECT_NAME );
@@ -608,6 +611,7 @@ public void testImpersonationConnection() throws Exception
608611 cn .stopImpersonating ();
609612 }
610613
614+ // Also tests SelectRowCommand and ExecuteSqlCommand
611615 @ Test
612616 public void testSaveRowsApiCommand () throws Exception
613617 {
@@ -741,18 +745,7 @@ public void testSaveRowsApiCommand() throws Exception
741745 // Verify players list after operations
742746 {
743747 var selectRowsCommand = new SelectRowsCommand (schemaName , playersListName );
744- selectRowsCommand .addSort (new Sort ("JerseyNumber" , Sort .Direction .ASCENDING ));
745-
746- var resp = selectRowsCommand .execute (conn , PROJECT_NAME );
747- assertEquals (3 , resp .getRowCount ());
748-
749- var players = resp .getRows ();
750- assertEquals (19 , players .get (0 ).get ("jerseyNumber" )); // verify case-insensitive
751- assertEquals ("Seattle Mariners" , players .get (0 ).get ("Team" ));
752- assertEquals (24 , players .get (1 ).get ("Jerseynumber" )); // verify case-insensitive
753- assertEquals ("Seattle Mariners" , players .get (1 ).get ("Team" ));
754- assertEquals (44 , players .get (2 ).get ("JerseyNumber" ));
755- assertEquals ("New York Yankees" , players .get (2 ).get ("Team" ));
748+ verifyJerseys (conn , selectRowsCommand , 3 );
756749 }
757750
758751 // Verify teams list after operations
@@ -773,6 +766,63 @@ public void testSaveRowsApiCommand() throws Exception
773766 assertEquals ("San Francisco" , teams .get (2 ).get ("City" ));
774767 assertEquals ("Giants" , teams .get (2 ).get ("Team" ));
775768 }
769+
770+ // Test ExecuteSqlCommand basic SELECT
771+ {
772+ var executeSqlCommand = new ExecuteSqlCommand (schemaName , "SELECT * FROM " + schemaName + "." + ExecuteSqlCommand .quoteIdentifier (playersListName ));
773+ var resp = verifyJerseys (conn , executeSqlCommand , 3 );
774+ // setIncludeMetadata(true), the default, should result in metadata and column model
775+ assertNotNull (resp .getMetaData ());
776+ assertNotNull (resp .getColumnModel ()); // setIncludeMetadata(true), the default
777+ }
778+
779+ // Test ExecuteSqlCommand includeMetadata, offset, and maxRows properties
780+ {
781+ var executeSqlCommand = new ExecuteSqlCommand (schemaName , "SELECT * FROM " + schemaName + "." + ExecuteSqlCommand .quoteIdentifier (playersListName ));
782+ executeSqlCommand .addSort (new Sort ("JerseyNumber" , Sort .Direction .ASCENDING ));
783+ executeSqlCommand .setIncludeMetadata (false );
784+ executeSqlCommand .setOffset (2 );
785+ executeSqlCommand .setMaxRows (1 );
786+ var resp = verifyJerseys (conn , executeSqlCommand , 1 );
787+ // setIncludeMetadata(false) should result in no metadata or column model
788+ assertNull (resp .getMetaData ());
789+ assertNull (resp .getColumnModel ());
790+ }
791+
792+ // Test ExecuteSqlCommand parameterized query
793+ {
794+ var executeSqlCommand = new ExecuteSqlCommand (schemaName ,
795+ "PARAMETERS\n " +
796+ "(\n " +
797+ " Number INTEGER\n " +
798+ ")\n SELECT * FROM " + schemaName + "." + ExecuteSqlCommand .quoteIdentifier (playersListName ) +
799+ "\n WHERE JerseyNumber = Number" );
800+ executeSqlCommand .setQueryParameters (Map .of ("Number" , "44" ));
801+ verifyJerseys (conn , executeSqlCommand , 1 );
802+ }
803+ }
804+
805+ private SelectRowsResponse verifyJerseys (Connection conn , BaseQueryCommand <SelectRowsResponse > command , int expectedCount ) throws IOException , CommandException
806+ {
807+ command .addSort (new Sort ("JerseyNumber" , Sort .Direction .ASCENDING ));
808+ var resp = command .execute (conn , PROJECT_NAME );
809+ var players = resp .getRows ();
810+ assertEquals (expectedCount , players .size ());
811+
812+ // Phelps (the Yankee) is always the last player
813+ var lastPlayer = players .getLast ();
814+ assertEquals (44 , lastPlayer .get ("JerseyNumber" ));
815+ assertEquals ("New York Yankees" , lastPlayer .get ("Team" ));
816+
817+ if (expectedCount == 3 )
818+ {
819+ assertEquals (19 , players .get (0 ).get ("jerseyNumber" )); // verify case-insensitive
820+ assertEquals ("Seattle Mariners" , players .get (0 ).get ("Team" ));
821+ assertEquals (24 , players .get (1 ).get ("Jerseynumber" )); // verify case-insensitive
822+ assertEquals ("Seattle Mariners" , players .get (1 ).get ("Team" ));
823+ }
824+
825+ return resp ;
776826 }
777827
778828 @ Override
0 commit comments