From a7d06bfad4b93cdfe7b7d4b38e9e0e608d76e8f8 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Thu, 25 Jun 2026 14:27:56 -0700 Subject: [PATCH 1/3] Test remember terms-of-use acceptance --- .../test/tests/SiteWideTermsOfUseTest.java | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/org/labkey/test/tests/SiteWideTermsOfUseTest.java b/src/org/labkey/test/tests/SiteWideTermsOfUseTest.java index cdf24982f6..3762dfdffd 100644 --- a/src/org/labkey/test/tests/SiteWideTermsOfUseTest.java +++ b/src/org/labkey/test/tests/SiteWideTermsOfUseTest.java @@ -15,19 +15,29 @@ */ package org.labkey.test.tests; +import org.apache.hc.core5.http.HttpStatus; import org.junit.Before; import org.junit.Test; import org.junit.experimental.categories.Category; +import org.labkey.remoteapi.CommandException; +import org.labkey.remoteapi.CommandResponse; +import org.labkey.remoteapi.Connection; +import org.labkey.remoteapi.SimplePostCommand; import org.labkey.test.BaseWebDriverTest; import org.labkey.test.Locator; import org.labkey.test.Locators; import org.labkey.test.TestTimeoutException; +import org.labkey.test.WebTestHelper; import org.labkey.test.categories.Daily; import org.labkey.test.util.PasswordUtil; import org.openqa.selenium.WebElement; +import java.io.IOException; +import java.util.Map; + import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; @Category({Daily.class}) @BaseWebDriverTest.ClassTimeout(minutes = 7) @@ -232,6 +242,64 @@ public void testFailedLoginBadPassword() waitForText(SITE_WIDE_TERMS_TEXT); // should show } + private final static int FREQUENCY_SECONDS = 10; + + @Test + public void testRememberMeTerms() throws IOException, CommandException + { + log("Testing \"Require terms-of-use acceptance\" set to " + FREQUENCY_SECONDS + " seconds"); + + // Remember terms acceptance for FREQUENCY_SECONDS + setFrequency(FREQUENCY_SECONDS); + boolean firstSignIn = true; + boolean secondAcceptance = false; + long firstAcceptance = 0; + long diff; + + // Sign out and back in again for up to FREQUENCY_SECONDS * 1.5 seconds + double max_millis = FREQUENCY_SECONDS * 1.5 * 1000; + do + { + simpleSignOut(); + // Terms dialog doesn't show a sign-in link, so navigate directly to the login page + beginAt(WebTestHelper.buildURL("login", "login")); + assertTextNotPresent(SITE_WIDE_TERMS_TEXT); + doAndWaitForPageToLoad(() -> fillSignInFormAndSubmit("Sign In")); + if (isTextPresent(SITE_WIDE_TERMS_TEXT)) + { + acceptTermsOfUse(SITE_WIDE_TERMS_TEXT, true); + if (firstSignIn) + { + firstAcceptance = System.currentTimeMillis(); + firstSignIn = false; + } + else + { + secondAcceptance = true; + } + } + diff = System.currentTimeMillis() - firstAcceptance; + } + while (!secondAcceptance && !firstSignIn && diff < max_millis); + + assertFalse("First sign in didn't result in TOU!", firstSignIn); + assertTrue("First acceptance time was 0!", firstAcceptance > 0); + assertTrue("Second acceptance didn't occur within 15 seconds!", diff < max_millis); + assertFalse("Second acceptance occurred too early (" + diff + "ms)", diff < FREQUENCY_SECONDS * 1000); + + setFrequency(0); + } + + private void setFrequency(int frequency) throws IOException, CommandException + { + // Use direct API call to set a value that may not appear in the drop-down list + Connection conn = createDefaultConnection(); + SimplePostCommand frequencyCommand = new SimplePostCommand("admin", "setTermsOfUseFrequency"); + frequencyCommand.setParameters(Map.of("seconds", frequency)); + CommandResponse response = frequencyCommand.execute(conn, "/"); + assertEquals(HttpStatus.SC_OK, response.getStatusCode()); + } + protected void signOutWithSiteWideTerms(String termsText, boolean acceptTerms) { log("Signing out"); From 5e9f58443b32c576ede131f573389787326233dd Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Thu, 25 Jun 2026 15:27:03 -0700 Subject: [PATCH 2/3] Comment --- src/org/labkey/test/tests/SiteWideTermsOfUseTest.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/org/labkey/test/tests/SiteWideTermsOfUseTest.java b/src/org/labkey/test/tests/SiteWideTermsOfUseTest.java index 3762dfdffd..ab6dbec526 100644 --- a/src/org/labkey/test/tests/SiteWideTermsOfUseTest.java +++ b/src/org/labkey/test/tests/SiteWideTermsOfUseTest.java @@ -287,6 +287,7 @@ public void testRememberMeTerms() throws IOException, CommandException assertTrue("Second acceptance didn't occur within 15 seconds!", diff < max_millis); assertFalse("Second acceptance occurred too early (" + diff + "ms)", diff < FREQUENCY_SECONDS * 1000); + // Back to every sign-in setFrequency(0); } From 069c3b3f43f738f06d74a304d041f4e9c30de0c8 Mon Sep 17 00:00:00 2001 From: Adam Rauch Date: Thu, 25 Jun 2026 16:55:33 -0700 Subject: [PATCH 3/3] Feedback --- .../test/tests/SiteWideTermsOfUseTest.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/org/labkey/test/tests/SiteWideTermsOfUseTest.java b/src/org/labkey/test/tests/SiteWideTermsOfUseTest.java index ab6dbec526..47f865c896 100644 --- a/src/org/labkey/test/tests/SiteWideTermsOfUseTest.java +++ b/src/org/labkey/test/tests/SiteWideTermsOfUseTest.java @@ -15,12 +15,10 @@ */ package org.labkey.test.tests; -import org.apache.hc.core5.http.HttpStatus; import org.junit.Before; import org.junit.Test; import org.junit.experimental.categories.Category; import org.labkey.remoteapi.CommandException; -import org.labkey.remoteapi.CommandResponse; import org.labkey.remoteapi.Connection; import org.labkey.remoteapi.SimplePostCommand; import org.labkey.test.BaseWebDriverTest; @@ -99,6 +97,7 @@ public void editTermsAdminConsoleLinkTest() protected void assureSiteWideTermsOfUsePage() { createTermsOfUsePage(null, SITE_WIDE_TERMS_TEXT); + setFrequency(0); } // Test that the site-wide terms appear when you log out, even if you've accepted the terms when logged in @@ -245,7 +244,7 @@ public void testFailedLoginBadPassword() private final static int FREQUENCY_SECONDS = 10; @Test - public void testRememberMeTerms() throws IOException, CommandException + public void testRememberMeTerms() { log("Testing \"Require terms-of-use acceptance\" set to " + FREQUENCY_SECONDS + " seconds"); @@ -291,14 +290,20 @@ public void testRememberMeTerms() throws IOException, CommandException setFrequency(0); } - private void setFrequency(int frequency) throws IOException, CommandException + private void setFrequency(int frequency) { // Use direct API call to set a value that may not appear in the drop-down list Connection conn = createDefaultConnection(); SimplePostCommand frequencyCommand = new SimplePostCommand("admin", "setTermsOfUseFrequency"); frequencyCommand.setParameters(Map.of("seconds", frequency)); - CommandResponse response = frequencyCommand.execute(conn, "/"); - assertEquals(HttpStatus.SC_OK, response.getStatusCode()); + try + { + frequencyCommand.execute(conn, "/"); + } + catch (IOException | CommandException e) + { + throw new RuntimeException(e); + } } protected void signOutWithSiteWideTerms(String termsText, boolean acceptTerms)