diff --git a/core/src/main/java/google/registry/tools/GetPackagePromotionCommand.java b/core/src/main/java/google/registry/tools/GetPackagePromotionCommand.java new file mode 100644 index 000000000..07005d1d2 --- /dev/null +++ b/core/src/main/java/google/registry/tools/GetPackagePromotionCommand.java @@ -0,0 +1,47 @@ +// Copyright 2022 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.tools; + +import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm; +import static google.registry.util.PreconditionsUtils.checkArgumentPresent; + +import com.beust.jcommander.Parameter; +import com.beust.jcommander.Parameters; +import google.registry.model.domain.token.PackagePromotion; +import java.util.List; + +/** Command to show a {@link PackagePromotion} object. */ +@Parameters(separators = " =", commandDescription = "Show package promotion object(s)") +public class GetPackagePromotionCommand extends GetEppResourceCommand { + + @Parameter(description = "Package token(s)", required = true) + private List mainParameters; + + @Override + void runAndPrint() { + for (String token : mainParameters) { + jpaTm() + .transact( + () -> { + PackagePromotion packagePromotion = + checkArgumentPresent( + PackagePromotion.loadByTokenString(token), + "PackagePromotion with package token %s does not exist", + token); + System.out.println(packagePromotion); + }); + } + } +} diff --git a/core/src/main/java/google/registry/tools/RegistryTool.java b/core/src/main/java/google/registry/tools/RegistryTool.java index 25586c24d..dbe6a15e2 100644 --- a/core/src/main/java/google/registry/tools/RegistryTool.java +++ b/core/src/main/java/google/registry/tools/RegistryTool.java @@ -71,6 +71,7 @@ public final class RegistryTool { .put("get_history_entries", GetHistoryEntriesCommand.class) .put("get_host", GetHostCommand.class) .put("get_keyring_secret", GetKeyringSecretCommand.class) + .put("get_package_promotion", GetPackagePromotionCommand.class) .put("get_premium_list", GetPremiumListCommand.class) .put("get_registrar", GetRegistrarCommand.class) .put("get_reserved_list", GetReservedListCommand.class) diff --git a/core/src/test/java/google/registry/tools/GetPackagePromotionCommandTest.java b/core/src/test/java/google/registry/tools/GetPackagePromotionCommandTest.java new file mode 100644 index 000000000..216c9f6d7 --- /dev/null +++ b/core/src/test/java/google/registry/tools/GetPackagePromotionCommandTest.java @@ -0,0 +1,129 @@ +// Copyright 2022 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.tools; + +import static com.google.common.truth.Truth.assertThat; +import static google.registry.persistence.transaction.TransactionManagerFactory.jpaTm; +import static google.registry.testing.DatabaseHelper.persistResource; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import com.beust.jcommander.ParameterException; +import com.google.common.collect.ImmutableSet; +import google.registry.model.billing.BillingEvent.RenewalPriceBehavior; +import google.registry.model.domain.token.AllocationToken; +import google.registry.model.domain.token.AllocationToken.TokenType; +import google.registry.model.domain.token.PackagePromotion; +import org.joda.money.CurrencyUnit; +import org.joda.money.Money; +import org.joda.time.DateTime; +import org.junit.jupiter.api.Test; + +/** Unit tests for {@link GetPackagePromotionCommand}. */ +public class GetPackagePromotionCommandTest extends CommandTestCase { + + @Test + void testSuccess() throws Exception { + AllocationToken token = + persistResource( + new AllocationToken.Builder() + .setToken("abc123") + .setTokenType(TokenType.PACKAGE) + .setCreationTimeForTest(DateTime.parse("2010-11-12T05:00:00Z")) + .setAllowedTlds(ImmutableSet.of("foo")) + .setAllowedRegistrarIds(ImmutableSet.of("TheRegistrar")) + .setRenewalPriceBehavior(RenewalPriceBehavior.SPECIFIED) + .setDiscountFraction(1) + .build()); + PackagePromotion packagePromotion = + new PackagePromotion.Builder() + .setToken(token) + .setMaxDomains(100) + .setMaxCreates(500) + .setPackagePrice(Money.of(CurrencyUnit.USD, 1000)) + .setNextBillingDate(DateTime.parse("2012-11-12T05:00:00Z")) + .setLastNotificationSent(DateTime.parse("2010-11-12T05:00:00Z")) + .build(); + jpaTm().transact(() -> jpaTm().put(packagePromotion)); + runCommand("abc123"); + } + + @Test + void testSuccessMultiplePackages() throws Exception { + AllocationToken token = + persistResource( + new AllocationToken.Builder() + .setToken("abc123") + .setTokenType(TokenType.PACKAGE) + .setCreationTimeForTest(DateTime.parse("2010-11-12T05:00:00Z")) + .setAllowedTlds(ImmutableSet.of("foo")) + .setAllowedRegistrarIds(ImmutableSet.of("TheRegistrar")) + .setRenewalPriceBehavior(RenewalPriceBehavior.SPECIFIED) + .setDiscountFraction(1) + .build()); + jpaTm() + .transact( + () -> + jpaTm() + .put( + new PackagePromotion.Builder() + .setToken(token) + .setMaxDomains(100) + .setMaxCreates(500) + .setPackagePrice(Money.of(CurrencyUnit.USD, 1000)) + .setNextBillingDate(DateTime.parse("2012-11-12T05:00:00Z")) + .setLastNotificationSent(DateTime.parse("2010-11-12T05:00:00Z")) + .build())); + AllocationToken token2 = + persistResource( + new AllocationToken.Builder() + .setToken("123abc") + .setTokenType(TokenType.PACKAGE) + .setCreationTimeForTest(DateTime.parse("2012-11-12T05:00:00Z")) + .setAllowedTlds(ImmutableSet.of("foo")) + .setAllowedRegistrarIds(ImmutableSet.of("TheRegistrar")) + .setRenewalPriceBehavior(RenewalPriceBehavior.SPECIFIED) + .setDiscountFraction(1) + .build()); + jpaTm() + .transact( + () -> + jpaTm() + .put( + new PackagePromotion.Builder() + .setToken(token2) + .setMaxDomains(1000) + .setMaxCreates(700) + .setPackagePrice(Money.of(CurrencyUnit.USD, 3000)) + .setNextBillingDate(DateTime.parse("2014-11-12T05:00:00Z")) + .setLastNotificationSent(DateTime.parse("2013-11-12T05:00:00Z")) + .build())); + + runCommand("abc123", "123abc"); + } + + @Test + void testFailure_packageDoesNotExist() { + IllegalArgumentException thrown = + assertThrows(IllegalArgumentException.class, () -> runCommand("fakeToken")); + assertThat(thrown) + .hasMessageThat() + .isEqualTo("PackagePromotion with package token fakeToken does not exist"); + } + + @Test + void testFailure_noToken() { + assertThrows(ParameterException.class, this::runCommand); + } +}