From 2df583df1a067236afbf479c221cea0bb76d3a2f Mon Sep 17 00:00:00 2001 From: Ben McIlwain Date: Tue, 9 Apr 2024 12:27:26 -0400 Subject: [PATCH] Statically import Truth.assertThat() in tests (#2395) This also involved breaking out an improperly done assertThat() helper overload method for JsonObjects into a proper Subject that doesn't further overload assertThat(). --- .../registry/bsa/api/BsaCredentialTest.java | 4 +- .../flows/EppLifecycleDomainTest.java | 5 +- .../flows/domain/DomainRenewFlowTest.java | 3 +- .../registry/model/console/UserDaoTest.java | 6 +- .../transaction/TransactionManagerTest.java | 5 +- .../registry/rdap/RdapDomainActionTest.java | 32 +-- .../rdap/RdapDomainSearchActionTest.java | 87 ++++++--- .../registry/rdap/RdapEntityActionTest.java | 19 +- .../rdap/RdapEntitySearchActionTest.java | 76 +++++--- .../registry/rdap/RdapJsonFormatterTest.java | 75 ++++--- .../rdap/RdapNameserverActionTest.java | 183 ++++++++++-------- .../rdap/RdapNameserverSearchActionTest.java | 77 +++++--- .../google/registry/rdap/RdapTestHelper.java | 80 -------- .../rde/PendingDepositCheckerTest.java | 7 +- .../reporting/ReportingModuleTest.java | 10 +- .../google/registry/testing/GsonSubject.java | 118 +++++++++++ .../tools/GetEppResourceCommandTest.java | 4 +- .../UpdateBulkPricingPackageCommandTest.java | 45 +++-- .../RegistrarSettingsActionTestCase.java | 4 +- 19 files changed, 497 insertions(+), 343 deletions(-) create mode 100644 core/src/test/java/google/registry/testing/GsonSubject.java diff --git a/core/src/test/java/google/registry/bsa/api/BsaCredentialTest.java b/core/src/test/java/google/registry/bsa/api/BsaCredentialTest.java index ac750f5a2..c2ae04a5c 100644 --- a/core/src/test/java/google/registry/bsa/api/BsaCredentialTest.java +++ b/core/src/test/java/google/registry/bsa/api/BsaCredentialTest.java @@ -28,7 +28,6 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; -import com.google.common.truth.Truth; import google.registry.keyring.api.Keyring; import google.registry.request.UrlConnectionService; import google.registry.testing.FakeClock; @@ -117,8 +116,7 @@ class BsaCredentialTest { void fetchNewAuthToken_whenStatusIsNotOK_throwsRetriableException() throws Exception { setupHttp(); when(connection.getResponseCode()).thenReturn(202); - Truth.assertThat( - assertThrows(BsaException.class, () -> credential.getAuthToken()).isRetriable()) + assertThat(assertThrows(BsaException.class, () -> credential.getAuthToken()).isRetriable()) .isTrue(); } diff --git a/core/src/test/java/google/registry/flows/EppLifecycleDomainTest.java b/core/src/test/java/google/registry/flows/EppLifecycleDomainTest.java index 1202c2466..ac226f007 100644 --- a/core/src/test/java/google/registry/flows/EppLifecycleDomainTest.java +++ b/core/src/test/java/google/registry/flows/EppLifecycleDomainTest.java @@ -14,6 +14,7 @@ package google.registry.flows; +import static com.google.common.truth.Truth.assertThat; import static google.registry.model.EppResourceUtils.loadByForeignKey; import static google.registry.model.eppoutput.Result.Code.SUCCESS; import static google.registry.model.eppoutput.Result.Code.SUCCESS_AND_CLOSE; @@ -35,7 +36,6 @@ import static org.joda.money.CurrencyUnit.USD; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSortedMap; import com.google.common.collect.Ordering; -import com.google.common.truth.Truth; import com.google.re2j.Matcher; import com.google.re2j.Pattern; import google.registry.model.billing.BillingBase.Reason; @@ -494,8 +494,7 @@ class EppLifecycleDomainTest extends EppTestCase { // Make sure that in the future, the domain expiration is unchanged after deletion Domain clonedDomain = domain.cloneProjectedAtTime(deleteTime.plusYears(5)); - Truth.assertThat(clonedDomain.getRegistrationExpirationTime()) - .isEqualTo(createTime.plusYears(2)); + assertThat(clonedDomain.getRegistrationExpirationTime()).isEqualTo(createTime.plusYears(2)); } @Test diff --git a/core/src/test/java/google/registry/flows/domain/DomainRenewFlowTest.java b/core/src/test/java/google/registry/flows/domain/DomainRenewFlowTest.java index 92087cd1c..5f863633f 100644 --- a/core/src/test/java/google/registry/flows/domain/DomainRenewFlowTest.java +++ b/core/src/test/java/google/registry/flows/domain/DomainRenewFlowTest.java @@ -51,7 +51,6 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSortedMap; import com.google.common.collect.Iterables; -import com.google.common.truth.Truth; import google.registry.flows.EppException; import google.registry.flows.EppRequestSource; import google.registry.flows.FlowUtils.NotLoggedInException; @@ -1348,7 +1347,7 @@ class DomainRenewFlowTest extends ResourceFlowTestCase // We still need to verify that the bulk token is removed as it's not being tested as a part of // doSuccessfulTest Domain domain = reloadResourceByForeignKey(); - Truth.assertThat(domain.getCurrentBulkToken()).isEmpty(); + assertThat(domain.getCurrentBulkToken()).isEmpty(); } @Test diff --git a/core/src/test/java/google/registry/model/console/UserDaoTest.java b/core/src/test/java/google/registry/model/console/UserDaoTest.java index d168b65ca..f7bea44ba 100644 --- a/core/src/test/java/google/registry/model/console/UserDaoTest.java +++ b/core/src/test/java/google/registry/model/console/UserDaoTest.java @@ -14,11 +14,11 @@ package google.registry.model.console; +import static com.google.common.truth.Truth.assertThat; import static google.registry.model.ImmutableObjectSubject.assertAboutImmutableObjects; import static google.registry.persistence.transaction.TransactionManagerFactory.tm; import static org.junit.jupiter.api.Assertions.assertThrows; -import com.google.common.truth.Truth; import google.registry.model.EntityTestCase; import org.junit.jupiter.api.Test; @@ -57,10 +57,10 @@ public class UserDaoTest extends EntityTestCase { UserDao.saveUser(user); User fromDb = UserDao.loadUser("email@email.com").get(); // nonexistent one should never exist - Truth.assertThat(UserDao.loadUser("nonexistent@email.com")).isEmpty(); + assertThat(UserDao.loadUser("nonexistent@email.com")).isEmpty(); // now try deleting the one that does exist tm().transact(() -> tm().delete(fromDb)); - Truth.assertThat(UserDao.loadUser("email@email.com")).isEmpty(); + assertThat(UserDao.loadUser("email@email.com")).isEmpty(); } @Test diff --git a/core/src/test/java/google/registry/persistence/transaction/TransactionManagerTest.java b/core/src/test/java/google/registry/persistence/transaction/TransactionManagerTest.java index b324d5eb5..7ea6bbd61 100644 --- a/core/src/test/java/google/registry/persistence/transaction/TransactionManagerTest.java +++ b/core/src/test/java/google/registry/persistence/transaction/TransactionManagerTest.java @@ -22,7 +22,6 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import com.google.common.collect.ImmutableList; import com.google.common.collect.Maps; -import com.google.common.truth.Truth; import google.registry.model.ImmutableObject; import google.registry.persistence.VKey; import google.registry.persistence.transaction.JpaTestExtensions.JpaUnitTestExtension; @@ -328,10 +327,10 @@ public class TransactionManagerTest { @Test void loadSingleton_returnsValue_orEmpty() { assertEntityNotExist(theEntity); - Truth.assertThat(tm().transact(() -> tm().loadSingleton(TestEntity.class))).isEmpty(); + assertThat(tm().transact(() -> tm().loadSingleton(TestEntity.class))).isEmpty(); tm().transact(() -> tm().insert(theEntity)); - Truth.assertThat(tm().transact(() -> tm().loadSingleton(TestEntity.class))).hasValue(theEntity); + assertThat(tm().transact(() -> tm().loadSingleton(TestEntity.class))).hasValue(theEntity); } @Test diff --git a/core/src/test/java/google/registry/rdap/RdapDomainActionTest.java b/core/src/test/java/google/registry/rdap/RdapDomainActionTest.java index fb04d0bde..1972d73b3 100644 --- a/core/src/test/java/google/registry/rdap/RdapDomainActionTest.java +++ b/core/src/test/java/google/registry/rdap/RdapDomainActionTest.java @@ -15,7 +15,6 @@ package google.registry.rdap; import static com.google.common.truth.Truth.assertThat; -import static google.registry.rdap.RdapTestHelper.assertThat; import static google.registry.testing.DatabaseHelper.createTld; import static google.registry.testing.DatabaseHelper.persistResource; import static google.registry.testing.DatabaseHelper.persistSimpleResources; @@ -24,6 +23,7 @@ import static google.registry.testing.FullFieldsTestEntityHelper.makeDomain; import static google.registry.testing.FullFieldsTestEntityHelper.makeHistoryEntry; import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrar; import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrarPocs; +import static google.registry.testing.GsonSubject.assertAboutJson; import static org.mockito.Mockito.verify; import com.google.gson.JsonObject; @@ -221,7 +221,8 @@ class RdapDomainActionTest extends RdapActionBaseTestCase { } private void assertProperResponseForCatLol(String queryString, String expectedOutputFile) { - assertThat(generateActualJson(queryString)) + assertAboutJson() + .that(generateActualJson(queryString)) .isEqualTo( addBoilerplate( jsonFileBuilder() @@ -238,7 +239,8 @@ class RdapDomainActionTest extends RdapActionBaseTestCase { @Test void testInvalidDomain_returns400() { - assertThat(generateActualJson("invalid/domain/name")) + assertAboutJson() + .that(generateActualJson("invalid/domain/name")) .isEqualTo( generateExpectedJsonError( "invalid/domain/name is not a valid domain name: Domain names can only contain a-z," @@ -249,7 +251,8 @@ class RdapDomainActionTest extends RdapActionBaseTestCase { @Test void testUnknownDomain_returns400() { - assertThat(generateActualJson("missingdomain.com")) + assertAboutJson() + .that(generateActualJson("missingdomain.com")) .isEqualTo( generateExpectedJsonError( "missingdomain.com is not a valid domain name: Domain name is under tld com which" @@ -299,7 +302,8 @@ class RdapDomainActionTest extends RdapActionBaseTestCase { @Test void testIdnDomain_works() { login("idnregistrar"); - assertThat(generateActualJson("cat.みんな")) + assertAboutJson() + .that(generateActualJson("cat.みんな")) .isEqualTo( addBoilerplate( jsonFileBuilder() @@ -317,7 +321,8 @@ class RdapDomainActionTest extends RdapActionBaseTestCase { @Test void testIdnDomainWithPercentEncoding_works() { login("idnregistrar"); - assertThat(generateActualJson("cat.%E3%81%BF%E3%82%93%E3%81%AA")) + assertAboutJson() + .that(generateActualJson("cat.%E3%81%BF%E3%82%93%E3%81%AA")) .isEqualTo( addBoilerplate( jsonFileBuilder() @@ -335,7 +340,8 @@ class RdapDomainActionTest extends RdapActionBaseTestCase { @Test void testPunycodeDomain_works() { login("idnregistrar"); - assertThat(generateActualJson("cat.xn--q9jyb4c")) + assertAboutJson() + .that(generateActualJson("cat.xn--q9jyb4c")) .isEqualTo( addBoilerplate( jsonFileBuilder() @@ -353,7 +359,8 @@ class RdapDomainActionTest extends RdapActionBaseTestCase { @Test void testMultilevelDomain_works() { login("1tldregistrar"); - assertThat(generateActualJson("cat.1.tld")) + assertAboutJson() + .that(generateActualJson("cat.1.tld")) .isEqualTo( addBoilerplate( jsonFileBuilder() @@ -379,7 +386,8 @@ class RdapDomainActionTest extends RdapActionBaseTestCase { @Test void testDeletedDomain_notFound() { - assertThat(generateActualJson("dodo.lol")) + assertAboutJson() + .that(generateActualJson("dodo.lol")) .isEqualTo(generateExpectedJsonError("dodo.lol not found", 404)); assertThat(response.getStatus()).isEqualTo(404); } @@ -410,7 +418,8 @@ class RdapDomainActionTest extends RdapActionBaseTestCase { void testDeletedDomain_works_loggedInAsCorrectRegistrar() { login("evilregistrar"); action.includeDeletedParam = Optional.of(true); - assertThat(generateActualJson("dodo.lol")) + assertAboutJson() + .that(generateActualJson("dodo.lol")) .isEqualTo( addBoilerplate( jsonFileBuilder() @@ -429,7 +438,8 @@ class RdapDomainActionTest extends RdapActionBaseTestCase { void testDeletedDomain_works_loggedInAsAdmin() { loginAsAdmin(); action.includeDeletedParam = Optional.of(true); - assertThat(generateActualJson("dodo.lol")) + assertAboutJson() + .that(generateActualJson("dodo.lol")) .isEqualTo( addBoilerplate( jsonFileBuilder() diff --git a/core/src/test/java/google/registry/rdap/RdapDomainSearchActionTest.java b/core/src/test/java/google/registry/rdap/RdapDomainSearchActionTest.java index 8c2dbd81d..d21033ad2 100644 --- a/core/src/test/java/google/registry/rdap/RdapDomainSearchActionTest.java +++ b/core/src/test/java/google/registry/rdap/RdapDomainSearchActionTest.java @@ -15,7 +15,6 @@ package google.registry.rdap; import static com.google.common.truth.Truth.assertThat; -import static google.registry.rdap.RdapTestHelper.assertThat; import static google.registry.rdap.RdapTestHelper.parseJsonObject; import static google.registry.request.Action.Method.POST; import static google.registry.testing.DatabaseHelper.createTld; @@ -27,6 +26,7 @@ import static google.registry.testing.FullFieldsTestEntityHelper.makeDomain; import static google.registry.testing.FullFieldsTestEntityHelper.makeHistoryEntry; import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrar; import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrarPocs; +import static google.registry.testing.GsonSubject.assertAboutJson; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableListMultimap; @@ -481,7 +481,9 @@ class RdapDomainSearchActionTest extends RdapSearchActionTestCase { String rdapStatus, String address, String fileName) { - assertThat(generateActualJson(handleQuery)) + assertAboutJson() + .that(generateActualJson(handleQuery)) .isEqualTo( generateExpectedJsonWithTopLevelEntries( handleQuery, fullName, rdapStatus, address, fileName)); @@ -178,7 +179,8 @@ class RdapEntityActionTest extends RdapActionBaseTestCase { } private void runNotFoundTest(String handleQuery) { - assertThat(generateActualJson(handleQuery)) + assertAboutJson() + .that(generateActualJson(handleQuery)) .isEqualTo(generateExpectedJsonError(handleQuery + " not found", 404)); assertThat(response.getStatus()).isEqualTo(404); } @@ -305,7 +307,8 @@ class RdapEntityActionTest extends RdapActionBaseTestCase { @Test void testRegistrarByName_found() { - assertThat(generateActualJson("IDN%20Registrar")) + assertAboutJson() + .that(generateActualJson("IDN%20Registrar")) .isEqualTo( generateExpectedJsonWithTopLevelEntries( "102", "IDN Registrar", "active", null, "rdap_registrar.json")); @@ -364,9 +367,11 @@ class RdapEntityActionTest extends RdapActionBaseTestCase { @Test void testQueryParameter_ignored() { login("evilregistrar"); - assertThat(generateActualJson(techContact.getRepoId() + "?key=value")).isEqualTo( - generateExpectedJsonWithTopLevelEntries( - techContact.getRepoId(), "rdap_associated_contact.json")); + assertAboutJson() + .that(generateActualJson(techContact.getRepoId() + "?key=value")) + .isEqualTo( + generateExpectedJsonWithTopLevelEntries( + techContact.getRepoId(), "rdap_associated_contact.json")); assertThat(response.getStatus()).isEqualTo(200); } diff --git a/core/src/test/java/google/registry/rdap/RdapEntitySearchActionTest.java b/core/src/test/java/google/registry/rdap/RdapEntitySearchActionTest.java index 4f7245bc6..02bb8a948 100644 --- a/core/src/test/java/google/registry/rdap/RdapEntitySearchActionTest.java +++ b/core/src/test/java/google/registry/rdap/RdapEntitySearchActionTest.java @@ -15,7 +15,6 @@ package google.registry.rdap; import static com.google.common.truth.Truth.assertThat; -import static google.registry.rdap.RdapTestHelper.assertThat; import static google.registry.rdap.RdapTestHelper.loadJsonFile; import static google.registry.rdap.RdapTestHelper.parseJsonObject; import static google.registry.request.Action.Method.GET; @@ -27,6 +26,7 @@ import static google.registry.testing.FullFieldsTestEntityHelper.makeAndPersistD import static google.registry.testing.FullFieldsTestEntityHelper.makeHistoryEntry; import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrar; import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrarPocs; +import static google.registry.testing.GsonSubject.assertAboutJson; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableListMultimap; @@ -285,14 +285,16 @@ class RdapEntitySearchActionTest extends RdapSearchActionTestCase= jsonArray.size()) { - return null; - } - return jsonArray.get(index); - } - - /** Writes down a human-readable diff between actual and expected into the StringBuilder. */ - private void diff( - String name, JsonElement actual, JsonElement expected, StringBuilder builder) { - if (Objects.equals(actual, expected)) { - return; - } - if (actual == null) { - builder.append(String.format("Missing: %s ->%s\n\n", name, jsonifyAndIndent(expected))); - return; - } - if (expected == null) { - builder.append(String.format("Unexpected: %s -> %s\n\n", name, jsonifyAndIndent(actual))); - return; - } - if (actual.isJsonObject() && expected.isJsonObject()) { - // We put the "expected" first in the union so that the "expected" keys will all be first - // and in order - for (String key : - Sets.union(expected.getAsJsonObject().keySet(), actual.getAsJsonObject().keySet())) { - diff( - name + "." + key, - actual.getAsJsonObject().get(key), - expected.getAsJsonObject().get(key), - builder); - } - return; - } - if (actual.isJsonArray() && expected.isJsonArray()) { - int commonSize = Math.max(actual.getAsJsonArray().size(), expected.getAsJsonArray().size()); - for (int i = 0; i < commonSize; i++) { - diff( - String.format("%s[%s]", name, i), - getOrNull(actual.getAsJsonArray(), i), - getOrNull(expected.getAsJsonArray(), i), - builder); - } - return; - } - builder.append( - String.format( - "Actual: %s -> %s\nExpected: %s\n\n", - name, jsonifyAndIndent(actual), jsonifyAndIndent(expected))); - } - } - - static GsonSubject assertThat(JsonObject actual) { - return new GsonSubject(actual); - } } diff --git a/core/src/test/java/google/registry/rde/PendingDepositCheckerTest.java b/core/src/test/java/google/registry/rde/PendingDepositCheckerTest.java index eb65044c3..702c0fa0c 100644 --- a/core/src/test/java/google/registry/rde/PendingDepositCheckerTest.java +++ b/core/src/test/java/google/registry/rde/PendingDepositCheckerTest.java @@ -28,7 +28,6 @@ import static org.joda.time.DateTimeConstants.TUESDAY; import static org.joda.time.Duration.standardDays; import com.google.common.collect.ImmutableSetMultimap; -import com.google.common.truth.Truth; import google.registry.model.common.Cursor; import google.registry.model.common.Cursor.CursorType; import google.registry.model.tld.Tld; @@ -95,7 +94,7 @@ public class PendingDepositCheckerTest { createTldWithEscrowEnabled("lol"); clock.advanceOneMilli(); Tld registry = Tld.get("lol"); - Truth.assertThat(loadByKeyIfPresent(Cursor.createScopedVKey(RDE_STAGING, registry))).isEmpty(); + assertThat(loadByKeyIfPresent(Cursor.createScopedVKey(RDE_STAGING, registry))).isEmpty(); checker.getTldsAndWatermarksPendingDepositForRdeAndBrda(); assertThat(loadByKey(Cursor.createScopedVKey(RDE_STAGING, registry)).getCursorTime()) .isEqualTo(DateTime.parse("2000-01-01TZ")); @@ -122,9 +121,9 @@ public class PendingDepositCheckerTest { clock.advanceOneMilli(); setCursor(registry, RDE_STAGING, DateTime.parse("2000-01-02TZ")); // assume rde is already done clock.advanceOneMilli(); - Truth.assertThat(loadByKeyIfPresent(Cursor.createScopedVKey(BRDA, registry))).isEmpty(); + assertThat(loadByKeyIfPresent(Cursor.createScopedVKey(BRDA, registry))).isEmpty(); assertThat(checker.getTldsAndWatermarksPendingDepositForRdeAndBrda()).isEmpty(); - Truth.assertThat(loadByKeyIfPresent(Cursor.createScopedVKey(BRDA, registry))).isEmpty(); + assertThat(loadByKeyIfPresent(Cursor.createScopedVKey(BRDA, registry))).isEmpty(); } @Test diff --git a/core/src/test/java/google/registry/reporting/ReportingModuleTest.java b/core/src/test/java/google/registry/reporting/ReportingModuleTest.java index d1c579014..363dfe333 100644 --- a/core/src/test/java/google/registry/reporting/ReportingModuleTest.java +++ b/core/src/test/java/google/registry/reporting/ReportingModuleTest.java @@ -19,7 +19,6 @@ import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; -import com.google.common.truth.Truth; import google.registry.request.HttpException.BadRequestException; import google.registry.testing.FakeClock; import google.registry.util.Clock; @@ -45,14 +44,13 @@ class ReportingModuleTest { @Test void testEmptyYearMonthParameter_returnsEmptyYearMonthOptional() { when(req.getParameter("yearMonth")).thenReturn(""); - Truth.assertThat(ReportingModule.provideYearMonthOptional(req)).isEmpty(); + assertThat(ReportingModule.provideYearMonthOptional(req)).isEmpty(); } @Test void testValidYearMonthParameter_returnsThatMonth() { when(req.getParameter("yearMonth")).thenReturn("2017-05"); - Truth.assertThat(ReportingModule.provideYearMonthOptional(req)) - .hasValue(new YearMonth(2017, 5)); + assertThat(ReportingModule.provideYearMonthOptional(req)).hasValue(new YearMonth(2017, 5)); } @Test @@ -83,13 +81,13 @@ class ReportingModuleTest { @Test void testEmptyDateParameter_returnsEmptyDateOptional() { when(req.getParameter("date")).thenReturn(""); - Truth.assertThat(ReportingModule.provideDateOptional(req)).isEmpty(); + assertThat(ReportingModule.provideDateOptional(req)).isEmpty(); } @Test void testValidDateParameter_returnsThatDate() { when(req.getParameter("date")).thenReturn("2017-05-13"); - Truth.assertThat(ReportingModule.provideDateOptional(req)).hasValue(new LocalDate(2017, 5, 13)); + assertThat(ReportingModule.provideDateOptional(req)).hasValue(new LocalDate(2017, 5, 13)); } @Test diff --git a/core/src/test/java/google/registry/testing/GsonSubject.java b/core/src/test/java/google/registry/testing/GsonSubject.java new file mode 100644 index 000000000..85eb2de76 --- /dev/null +++ b/core/src/test/java/google/registry/testing/GsonSubject.java @@ -0,0 +1,118 @@ +// Copyright 2017 The Nomulus Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package google.registry.testing; + +import static com.google.common.truth.Truth.assertAbout; + +import com.google.common.collect.Sets; +import com.google.common.truth.FailureMetadata; +import com.google.common.truth.SimpleSubjectBuilder; +import com.google.common.truth.Subject; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import java.util.Objects; +import java.util.Optional; + +/** A Truth subject to show nicer "huge JSON" diffs. */ +public class GsonSubject extends Subject { + + private JsonObject actual; + + private static final Gson GSON = + new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create(); + + private String customDisplaySubject; + + public GsonSubject(FailureMetadata failureMetadata, JsonObject actual) { + super(failureMetadata, actual); + this.actual = actual; + } + + @Override + protected String actualCustomStringRepresentation() { + return Optional.ofNullable(customDisplaySubject).orElse(String.valueOf(actual)); + } + + public GsonSubject withCustomDisplaySubject(String customDisplaySubject) { + this.customDisplaySubject = customDisplaySubject; + return this; + } + + private String jsonifyAndIndent(JsonElement element) { + String json = GSON.toJson(element); + return json.replaceAll("\n", "\n "); + } + + private JsonElement getOrNull(JsonArray jsonArray, int index) { + if (index >= jsonArray.size()) { + return null; + } + return jsonArray.get(index); + } + + /** Writes down a human-readable diff between actual and expected into the StringBuilder. */ + private void diff(String name, JsonElement actual, JsonElement expected, StringBuilder builder) { + if (Objects.equals(actual, expected)) { + return; + } + if (actual == null) { + builder.append(String.format("Missing: %s ->%s\n\n", name, jsonifyAndIndent(expected))); + return; + } + if (expected == null) { + builder.append(String.format("Unexpected: %s -> %s\n\n", name, jsonifyAndIndent(actual))); + return; + } + if (actual.isJsonObject() && expected.isJsonObject()) { + // We put the "expected" first in the union so that the "expected" keys will all be first + // and in order + for (String key : + Sets.union(expected.getAsJsonObject().keySet(), actual.getAsJsonObject().keySet())) { + diff( + name + "." + key, + actual.getAsJsonObject().get(key), + expected.getAsJsonObject().get(key), + builder); + } + return; + } + if (actual.isJsonArray() && expected.isJsonArray()) { + int commonSize = Math.max(actual.getAsJsonArray().size(), expected.getAsJsonArray().size()); + for (int i = 0; i < commonSize; i++) { + diff( + String.format("%s[%s]", name, i), + getOrNull(actual.getAsJsonArray(), i), + getOrNull(expected.getAsJsonArray(), i), + builder); + } + return; + } + builder.append( + String.format( + "Actual: %s -> %s\nExpected: %s\n\n", + name, jsonifyAndIndent(actual), jsonifyAndIndent(expected))); + } + + public static SimpleSubjectBuilder assertAboutJson() { + return assertAbout(jsonObject()); + } + + public static Factory jsonObject() { + return GsonSubject::new; + } +} diff --git a/core/src/test/java/google/registry/tools/GetEppResourceCommandTest.java b/core/src/test/java/google/registry/tools/GetEppResourceCommandTest.java index 73e5b405d..402165548 100644 --- a/core/src/test/java/google/registry/tools/GetEppResourceCommandTest.java +++ b/core/src/test/java/google/registry/tools/GetEppResourceCommandTest.java @@ -14,9 +14,9 @@ package google.registry.tools; +import static com.google.common.truth.Truth.assertThat; import static org.junit.Assert.assertThrows; -import com.google.common.truth.Truth; import google.registry.testing.FakeClock; import org.joda.time.DateTime; import org.joda.time.DateTimeZone; @@ -53,6 +53,6 @@ public class GetEppResourceCommandTest { @Test public void readTimestampNotProvided_setToNow_noException() { commandUnderTest.run(); - Truth.assertThat(commandUnderTest.readTimestamp).isEqualTo(clock.nowUtc()); + assertThat(commandUnderTest.readTimestamp).isEqualTo(clock.nowUtc()); } } diff --git a/core/src/test/java/google/registry/tools/UpdateBulkPricingPackageCommandTest.java b/core/src/test/java/google/registry/tools/UpdateBulkPricingPackageCommandTest.java index 73716ac5e..f94830062 100644 --- a/core/src/test/java/google/registry/tools/UpdateBulkPricingPackageCommandTest.java +++ b/core/src/test/java/google/registry/tools/UpdateBulkPricingPackageCommandTest.java @@ -20,7 +20,6 @@ import static google.registry.testing.DatabaseHelper.persistResource; import static org.junit.jupiter.api.Assertions.assertThrows; import com.google.common.collect.ImmutableSet; -import com.google.common.truth.Truth; import google.registry.model.billing.BillingBase.RenewalPriceBehavior; import google.registry.model.domain.fee.FeeQueryCommandExtensionItem.CommandName; import google.registry.model.domain.token.AllocationToken; @@ -77,10 +76,10 @@ public class UpdateBulkPricingPackageCommandTest tm().transact(() -> BulkPricingPackage.loadByTokenString("abc123")); assertThat(bulkPricingPackageOptional).isPresent(); BulkPricingPackage bulkPricingPackage = bulkPricingPackageOptional.get(); - Truth.assertThat(bulkPricingPackage.getMaxDomains()).isEqualTo(200); - Truth.assertThat(bulkPricingPackage.getMaxCreates()).isEqualTo(1000); - Truth.assertThat(bulkPricingPackage.getBulkPrice()).isEqualTo(Money.of(CurrencyUnit.USD, 2000)); - Truth.assertThat(bulkPricingPackage.getNextBillingDate()) + assertThat(bulkPricingPackage.getMaxDomains()).isEqualTo(200); + assertThat(bulkPricingPackage.getMaxCreates()).isEqualTo(1000); + assertThat(bulkPricingPackage.getBulkPrice()).isEqualTo(Money.of(CurrencyUnit.USD, 2000)); + assertThat(bulkPricingPackage.getNextBillingDate()) .isEqualTo(DateTime.parse("2013-03-17T00:00:00Z")); assertThat(bulkPricingPackage.getLastNotificationSent()).isEmpty(); } @@ -108,7 +107,7 @@ public class UpdateBulkPricingPackageCommandTest "--price=USD 1000.00", "--next_billing_date=2012-03-17T00:00:00Z", "nullPackage")); - Truth.assertThat(thrown.getMessage()) + assertThat(thrown.getMessage()) .isEqualTo("BulkPricingPackage with token nullPackage does not exist"); } @@ -125,10 +124,10 @@ public class UpdateBulkPricingPackageCommandTest tm().transact(() -> BulkPricingPackage.loadByTokenString("abc123")); assertThat(bulkPricingPackageOptional).isPresent(); BulkPricingPackage bulkPricingPackage = bulkPricingPackageOptional.get(); - Truth.assertThat(bulkPricingPackage.getMaxDomains()).isEqualTo(100); - Truth.assertThat(bulkPricingPackage.getMaxCreates()).isEqualTo(1000); - Truth.assertThat(bulkPricingPackage.getBulkPrice()).isEqualTo(Money.of(CurrencyUnit.USD, 2000)); - Truth.assertThat(bulkPricingPackage.getNextBillingDate()) + assertThat(bulkPricingPackage.getMaxDomains()).isEqualTo(100); + assertThat(bulkPricingPackage.getMaxCreates()).isEqualTo(1000); + assertThat(bulkPricingPackage.getBulkPrice()).isEqualTo(Money.of(CurrencyUnit.USD, 2000)); + assertThat(bulkPricingPackage.getNextBillingDate()) .isEqualTo(DateTime.parse("2013-03-17T00:00:00Z")); assertThat(bulkPricingPackage.getLastNotificationSent()).isEmpty(); } @@ -146,10 +145,10 @@ public class UpdateBulkPricingPackageCommandTest tm().transact(() -> BulkPricingPackage.loadByTokenString("abc123")); assertThat(bulkPricingPackageOptional).isPresent(); BulkPricingPackage bulkPricingPackage = bulkPricingPackageOptional.get(); - Truth.assertThat(bulkPricingPackage.getMaxDomains()).isEqualTo(200); - Truth.assertThat(bulkPricingPackage.getMaxCreates()).isEqualTo(1000); - Truth.assertThat(bulkPricingPackage.getBulkPrice()).isEqualTo(Money.of(CurrencyUnit.USD, 2000)); - Truth.assertThat(bulkPricingPackage.getNextBillingDate()) + assertThat(bulkPricingPackage.getMaxDomains()).isEqualTo(200); + assertThat(bulkPricingPackage.getMaxCreates()).isEqualTo(1000); + assertThat(bulkPricingPackage.getBulkPrice()).isEqualTo(Money.of(CurrencyUnit.USD, 2000)); + assertThat(bulkPricingPackage.getNextBillingDate()) .isEqualTo(DateTime.parse("2012-11-12T05:00:00Z")); assertThat(bulkPricingPackage.getLastNotificationSent()).isEmpty(); } @@ -167,10 +166,10 @@ public class UpdateBulkPricingPackageCommandTest tm().transact(() -> BulkPricingPackage.loadByTokenString("abc123")); assertThat(bulkPricingPackageOptional).isPresent(); BulkPricingPackage bulkPricingPackage = bulkPricingPackageOptional.get(); - Truth.assertThat(bulkPricingPackage.getMaxDomains()).isEqualTo(200); - Truth.assertThat(bulkPricingPackage.getMaxCreates()).isEqualTo(1000); - Truth.assertThat(bulkPricingPackage.getBulkPrice()).isEqualTo(Money.of(CurrencyUnit.USD, 1000)); - Truth.assertThat(bulkPricingPackage.getNextBillingDate()) + assertThat(bulkPricingPackage.getMaxDomains()).isEqualTo(200); + assertThat(bulkPricingPackage.getMaxCreates()).isEqualTo(1000); + assertThat(bulkPricingPackage.getBulkPrice()).isEqualTo(Money.of(CurrencyUnit.USD, 1000)); + assertThat(bulkPricingPackage.getNextBillingDate()) .isEqualTo(DateTime.parse("2013-03-17T00:00:00Z")); assertThat(bulkPricingPackage.getLastNotificationSent()).isEmpty(); } @@ -183,12 +182,12 @@ public class UpdateBulkPricingPackageCommandTest tm().transact(() -> BulkPricingPackage.loadByTokenString("abc123")); assertThat(bulkPricingPackageOptional).isPresent(); BulkPricingPackage bulkPricingPackage = bulkPricingPackageOptional.get(); - Truth.assertThat(bulkPricingPackage.getMaxDomains()).isEqualTo(200); - Truth.assertThat(bulkPricingPackage.getMaxCreates()).isEqualTo(1000); - Truth.assertThat(bulkPricingPackage.getBulkPrice()).isEqualTo(Money.of(CurrencyUnit.USD, 2000)); - Truth.assertThat(bulkPricingPackage.getNextBillingDate()) + assertThat(bulkPricingPackage.getMaxDomains()).isEqualTo(200); + assertThat(bulkPricingPackage.getMaxCreates()).isEqualTo(1000); + assertThat(bulkPricingPackage.getBulkPrice()).isEqualTo(Money.of(CurrencyUnit.USD, 2000)); + assertThat(bulkPricingPackage.getNextBillingDate()) .isEqualTo(DateTime.parse("2012-11-12T05:00:00Z")); - Truth.assertThat(bulkPricingPackage.getLastNotificationSent().get()) + assertThat(bulkPricingPackage.getLastNotificationSent().get()) .isEqualTo(DateTime.parse("2010-11-12T05:00:00.000Z")); } } diff --git a/core/src/test/java/google/registry/ui/server/registrar/RegistrarSettingsActionTestCase.java b/core/src/test/java/google/registry/ui/server/registrar/RegistrarSettingsActionTestCase.java index 19b7567db..905a1fec0 100644 --- a/core/src/test/java/google/registry/ui/server/registrar/RegistrarSettingsActionTestCase.java +++ b/core/src/test/java/google/registry/ui/server/registrar/RegistrarSettingsActionTestCase.java @@ -15,6 +15,7 @@ package google.registry.ui.server.registrar; import static com.google.common.collect.Iterables.getOnlyElement; +import static com.google.common.truth.Truth.assertThat; import static com.google.monitoring.metrics.contrib.LongMetricSubject.assertThat; import static google.registry.request.auth.AuthenticatedRegistrarAccessor.Role.ADMIN; import static google.registry.request.auth.AuthenticatedRegistrarAccessor.Role.OWNER; @@ -32,7 +33,6 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSetMultimap; import com.google.common.collect.ImmutableSortedMap; -import com.google.common.truth.Truth; import google.registry.flows.certs.CertificateChecker; import google.registry.groups.GmailClient; import google.registry.model.registrar.RegistrarPoc; @@ -167,7 +167,7 @@ public abstract class RegistrarSettingsActionTestCase { void verifyNotificationEmailsSent() throws Exception { ArgumentCaptor captor = ArgumentCaptor.forClass(EmailMessage.class); verify(gmailClient).sendEmail(captor.capture()); - Truth.assertThat(captor.getValue().recipients()) + assertThat(captor.getValue().recipients()) .containsExactly( new InternetAddress("notification@test.example"), new InternetAddress("notification2@test.example"),