From 7a4abd93dcbb1bdb74e54dcfb5caa59c9d7f5553 Mon Sep 17 00:00:00 2001 From: Juan Celhay Date: Tue, 1 Oct 2024 18:20:21 -0400 Subject: [PATCH] Add discount price param to GenerateAllocationTokens command (#2578) * Add discount price param to GenerateAlloCationTokens command * add discount price param to UpdateAllocationTokens command --- .../GenerateAllocationTokensCommand.java | 13 ++++++ .../tools/UpdateAllocationTokensCommand.java | 13 ++++++ .../GenerateAllocationTokensCommandTest.java | 42 +++++++++++++++++++ .../UpdateAllocationTokensCommandTest.java | 10 +++++ 4 files changed, 78 insertions(+) diff --git a/core/src/main/java/google/registry/tools/GenerateAllocationTokensCommand.java b/core/src/main/java/google/registry/tools/GenerateAllocationTokensCommand.java index 7a0abb45d20..1b226e14990 100644 --- a/core/src/main/java/google/registry/tools/GenerateAllocationTokensCommand.java +++ b/core/src/main/java/google/registry/tools/GenerateAllocationTokensCommand.java @@ -47,6 +47,7 @@ import google.registry.model.domain.token.AllocationToken.TokenStatus; import google.registry.model.domain.token.AllocationToken.TokenType; import google.registry.persistence.VKey; +import google.registry.tools.params.MoneyParameter; import google.registry.tools.params.TransitionListParameter.TokenStatusTransitions; import google.registry.util.CollectionUtils; import google.registry.util.DomainNameUtils; @@ -140,6 +141,17 @@ class GenerateAllocationTokensCommand implements Command { arity = 1) private Boolean discountPremiums; + @Parameter( + names = {"--discount_price"}, + description = + "A discount that allows the setting of promotional prices. This field is different from " + + "{@code discountFraction} because the price set here is treated as the domain " + + "price, versus {@code discountFraction} that applies a fraction discount to the " + + "domain base price. Use CURRENCY PRICE format, example: USD 777.99", + converter = MoneyParameter.class, + validateWith = MoneyParameter.class) + private Money discountPrice; + @Parameter( names = {"--discount_years"}, description = "The number of years the discount applies for. Default is 1, max value is 10.") @@ -233,6 +245,7 @@ public void run() throws IOException { .collect(toImmutableSet())); Optional.ofNullable(discountFraction).ifPresent(token::setDiscountFraction); Optional.ofNullable(discountPremiums).ifPresent(token::setDiscountPremiums); + Optional.ofNullable(discountPrice).ifPresent(token::setDiscountPrice); Optional.ofNullable(discountYears).ifPresent(token::setDiscountYears); Optional.ofNullable(tokenStatusTransitions) .ifPresent(token::setTokenStatusTransitions); diff --git a/core/src/main/java/google/registry/tools/UpdateAllocationTokensCommand.java b/core/src/main/java/google/registry/tools/UpdateAllocationTokensCommand.java index 7958327f5ea..4c9d32a2948 100644 --- a/core/src/main/java/google/registry/tools/UpdateAllocationTokensCommand.java +++ b/core/src/main/java/google/registry/tools/UpdateAllocationTokensCommand.java @@ -34,6 +34,7 @@ import google.registry.model.domain.token.AllocationToken.RegistrationBehavior; import google.registry.model.domain.token.AllocationToken.TokenStatus; import google.registry.model.domain.token.AllocationToken.TokenType; +import google.registry.tools.params.MoneyParameter; import google.registry.tools.params.StringListParameter; import google.registry.tools.params.TransitionListParameter.TokenStatusTransitions; import java.util.List; @@ -91,6 +92,17 @@ final class UpdateAllocationTokensCommand extends UpdateOrDeleteAllocationTokens arity = 1) private Boolean discountPremiums; + @Parameter( + names = {"--discount_price"}, + description = + "A discount that allows the setting of promotional prices. This field is different from " + + "{@code discountFraction} because the price set here is treated as the domain " + + "price, versus {@code discountFraction} that applies a fraction discount to the " + + "domain base price. Use CURRENCY PRICE format, example: USD 777.99", + converter = MoneyParameter.class, + validateWith = MoneyParameter.class) + private Money discountPrice; + @Parameter( names = {"-y", "--discount_years"}, description = "The number of years the discount applies for. Default is 1, max value is 10.") @@ -203,6 +215,7 @@ private AllocationToken updateToken(AllocationToken original) { .collect(toImmutableSet()))); Optional.ofNullable(discountFraction).ifPresent(builder::setDiscountFraction); Optional.ofNullable(discountPremiums).ifPresent(builder::setDiscountPremiums); + Optional.ofNullable(discountPrice).ifPresent(builder::setDiscountPrice); Optional.ofNullable(discountYears).ifPresent(builder::setDiscountYears); Optional.ofNullable(tokenStatusTransitions).ifPresent(builder::setTokenStatusTransitions); diff --git a/core/src/test/java/google/registry/tools/GenerateAllocationTokensCommandTest.java b/core/src/test/java/google/registry/tools/GenerateAllocationTokensCommandTest.java index 9f967cf1e05..070f78c0063 100644 --- a/core/src/test/java/google/registry/tools/GenerateAllocationTokensCommandTest.java +++ b/core/src/test/java/google/registry/tools/GenerateAllocationTokensCommandTest.java @@ -164,6 +164,48 @@ void testSuccess_promotionToken() throws Exception { .build()); } + @Test + void testSuccess_promotionToken_withDiscountPrice() throws Exception { + DateTime promoStart = DateTime.now(UTC); + DateTime promoEnd = promoStart.plusMonths(1); + runCommand( + "--number", + "1", + "--prefix", + "promo", + "--type", + "UNLIMITED_USE", + "--allowed_client_ids", + "TheRegistrar,NewRegistrar", + "--allowed_tlds", + "tld,example", + "--allowed_epp_actions", + "CREATE,RENEW", + "--discount_price", + "USD 3", + "--discount_years", + "6", + "--token_status_transitions", + String.format("%s=NOT_STARTED,%s=VALID,%s=ENDED", START_OF_TIME, promoStart, promoEnd)); + assertAllocationTokens( + new AllocationToken.Builder() + .setToken("promo123456789ABCDEFG") + .setTokenType(UNLIMITED_USE) + .setAllowedRegistrarIds(ImmutableSet.of("TheRegistrar", "NewRegistrar")) + .setAllowedTlds(ImmutableSet.of("tld", "example")) + .setAllowedEppActions(ImmutableSet.of(CommandName.CREATE, CommandName.RENEW)) + .setDiscountPrice(Money.of(CurrencyUnit.USD, 3)) + .setDiscountPremiums(false) + .setDiscountYears(6) + .setTokenStatusTransitions( + ImmutableSortedMap.naturalOrder() + .put(START_OF_TIME, TokenStatus.NOT_STARTED) + .put(promoStart, TokenStatus.VALID) + .put(promoEnd, TokenStatus.ENDED) + .build()) + .build()); + } + @Test void testSuccess_specifyTokens() throws Exception { runCommand("--tokens", "foobar,foobaz"); diff --git a/core/src/test/java/google/registry/tools/UpdateAllocationTokensCommandTest.java b/core/src/test/java/google/registry/tools/UpdateAllocationTokensCommandTest.java index 1ec37cd0b73..56b8c8d5282 100644 --- a/core/src/test/java/google/registry/tools/UpdateAllocationTokensCommandTest.java +++ b/core/src/test/java/google/registry/tools/UpdateAllocationTokensCommandTest.java @@ -141,6 +141,16 @@ void testUpdateDiscountFraction() throws Exception { assertThat(reloadResource(token).getDiscountFraction()).isEqualTo(0.15); } + @Test + void testUpdateDiscountPrice() throws Exception { + AllocationToken token = + persistResource( + builderWithPromo().setDiscountPrice(Money.of(CurrencyUnit.USD, 10)).build()); + runCommandForced("--prefix", "token", "--discount_price", "USD 2.15"); + assertThat(reloadResource(token).getDiscountPrice().get()) + .isEqualTo(Money.of(CurrencyUnit.USD, 2.15)); + } + @Test void testUpdateDiscountPremiums() throws Exception { AllocationToken token =