mirror of
https://github.com/google/nomulus.git
synced 2025-05-14 00:17:20 +02:00
Handle missing expected fee type in domain create
Also added a couple of more tests to make sure that we cover all edge cases. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=195872013
This commit is contained in:
parent
297b8df6a1
commit
e5538cfe35
3 changed files with 146 additions and 8 deletions
|
@ -42,6 +42,7 @@ import static google.registry.util.DomainNameUtils.ACE_PREFIX;
|
|||
import com.google.common.base.CharMatcher;
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.base.Splitter;
|
||||
import com.google.common.base.Strings;
|
||||
import com.google.common.collect.ImmutableList;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.common.collect.ImmutableMultimap;
|
||||
|
@ -698,9 +699,6 @@ public class DomainFlowUtils {
|
|||
if (!feeTotal.getCurrencyUnit().equals(feesAndCredits.getCurrency())) {
|
||||
throw new CurrencyUnitMismatchException();
|
||||
}
|
||||
if (!feeTotal.equals(feesAndCredits.getTotalCost())) {
|
||||
throw new FeesMismatchException(feesAndCredits.getTotalCost());
|
||||
}
|
||||
// If more than one fees are required, always validate individual fees.
|
||||
ImmutableMap<FeeType, Money> expectedFeeMap =
|
||||
buildFeeMap(feesAndCredits.getFees(), feesAndCredits.getCurrency());
|
||||
|
@ -708,13 +706,20 @@ public class DomainFlowUtils {
|
|||
ImmutableMap<FeeType, Money> providedFeeMap =
|
||||
buildFeeMap(feeCommand.get().getFees(), feeCommand.get().getCurrency());
|
||||
for (FeeType type : expectedFeeMap.keySet()) {
|
||||
Money providedCost = providedFeeMap.get(type);
|
||||
if (!providedFeeMap.containsKey(type)) {
|
||||
throw new FeesMismatchException(type);
|
||||
}
|
||||
Money expectedCost = expectedFeeMap.get(type);
|
||||
if (!providedCost.isEqual(expectedCost)) {
|
||||
if (!providedFeeMap.get(type).isEqual(expectedCost)) {
|
||||
throw new FeesMismatchException(type, expectedCost);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Checking if total amount is expected. Extra fees that we are not expecting may be passed in.
|
||||
// Or if there is only a single fee type expected.
|
||||
if (!feeTotal.equals(feesAndCredits.getTotalCost())) {
|
||||
throw new FeesMismatchException(feesAndCredits.getTotalCost());
|
||||
}
|
||||
}
|
||||
|
||||
private static FeeType getOrParseType(Fee fee) throws ParameterValuePolicyErrorException {
|
||||
|
@ -1333,6 +1338,13 @@ public class DomainFlowUtils {
|
|||
correctFee));
|
||||
}
|
||||
|
||||
public FeesMismatchException(FeeType type) {
|
||||
super(
|
||||
String.format(
|
||||
"The fees passed in the transform command do not contain expected fee type \"%s\"",
|
||||
type));
|
||||
}
|
||||
|
||||
public FeesMismatchException(FeeType type, Money correctFee) {
|
||||
super(
|
||||
String.format(
|
||||
|
@ -1346,9 +1358,12 @@ public class DomainFlowUtils {
|
|||
public static class FeeDescriptionParseException extends ParameterValuePolicyErrorException {
|
||||
public FeeDescriptionParseException(String description) {
|
||||
super(
|
||||
String.format(
|
||||
"The fee description \"%s\" passed in the transform command cannot be parsed",
|
||||
description == null ? "" : description));
|
||||
(Strings.isNullOrEmpty(description)
|
||||
? "No fee description is present in the command, "
|
||||
: "The fee description \""
|
||||
+ description
|
||||
+ "\" passed in the command cannot be parsed, ")
|
||||
+ "please perform a domain check to obtain expected fee descriptions.");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2245,6 +2245,7 @@ public class DomainCreateFlowTest extends ResourceFlowTestCase<DomainCreateFlow,
|
|||
Money.of(USD, 0)))
|
||||
.build());
|
||||
EppException thrown = assertThrows(FeeDescriptionParseException.class, this::runFlow);
|
||||
assertThat(thrown).hasMessageThat().contains("No fee description");
|
||||
assertAboutEppExceptions().that(thrown).marshalsToXml();
|
||||
}
|
||||
|
||||
|
@ -2277,6 +2278,98 @@ public class DomainCreateFlowTest extends ResourceFlowTestCase<DomainCreateFlow,
|
|||
assertAboutEppExceptions().that(thrown).marshalsToXml();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testFailure_eapFee_totalAmountNotMatched() throws Exception {
|
||||
setEppInput(
|
||||
"domain_create_extra_fees.xml",
|
||||
new ImmutableMap.Builder<String, String>()
|
||||
.put("FEE_VERSION", "0.6")
|
||||
.put("DESCRIPTION_1", "create")
|
||||
.put("FEE_1", "26")
|
||||
.put("DESCRIPTION_2", "Early Access Period")
|
||||
.put("FEE_2", "100")
|
||||
.put("DESCRIPTION_3", "renew")
|
||||
.put("FEE_3", "55")
|
||||
.build());
|
||||
persistContactsAndHosts();
|
||||
persistResource(
|
||||
Registry.get("tld")
|
||||
.asBuilder()
|
||||
.setEapFeeSchedule(
|
||||
ImmutableSortedMap.of(
|
||||
START_OF_TIME,
|
||||
Money.of(USD, 0),
|
||||
clock.nowUtc().minusDays(1),
|
||||
Money.of(USD, 100),
|
||||
clock.nowUtc().plusDays(1),
|
||||
Money.of(USD, 0)))
|
||||
.build());
|
||||
EppException thrown = assertThrows(FeesMismatchException.class, this::runFlow);
|
||||
assertThat(thrown).hasMessageThat().contains("expected total of USD 126.00");
|
||||
assertAboutEppExceptions().that(thrown).marshalsToXml();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSuccess_eapFee_multipleEAPfees_doNotAddToExpectedValue() throws Exception {
|
||||
setEppInput(
|
||||
"domain_create_extra_fees.xml",
|
||||
new ImmutableMap.Builder<String, String>()
|
||||
.put("FEE_VERSION", "0.6")
|
||||
.put("DESCRIPTION_1", "create")
|
||||
.put("FEE_1", "26")
|
||||
.put("DESCRIPTION_2", "Early Access Period")
|
||||
.put("FEE_2", "55")
|
||||
.put("DESCRIPTION_3", "Early Access Period")
|
||||
.put("FEE_3", "55")
|
||||
.build());
|
||||
persistContactsAndHosts();
|
||||
persistResource(
|
||||
Registry.get("tld")
|
||||
.asBuilder()
|
||||
.setEapFeeSchedule(
|
||||
ImmutableSortedMap.of(
|
||||
START_OF_TIME,
|
||||
Money.of(USD, 0),
|
||||
clock.nowUtc().minusDays(1),
|
||||
Money.of(USD, 100),
|
||||
clock.nowUtc().plusDays(1),
|
||||
Money.of(USD, 0)))
|
||||
.build());
|
||||
EppException thrown = assertThrows(FeesMismatchException.class, this::runFlow);
|
||||
assertThat(thrown).hasMessageThat().contains("expected fee of USD 100.00");
|
||||
assertAboutEppExceptions().that(thrown).marshalsToXml();
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSuccess_eapFee_multipleEAPfees_addToExpectedValue() throws Exception {
|
||||
setEppInput(
|
||||
"domain_create_extra_fees.xml",
|
||||
new ImmutableMap.Builder<String, String>()
|
||||
.put("FEE_VERSION", "0.6")
|
||||
.put("DESCRIPTION_1", "create")
|
||||
.put("FEE_1", "26")
|
||||
.put("DESCRIPTION_2", "Early Access Period")
|
||||
.put("FEE_2", "55")
|
||||
.put("DESCRIPTION_3", "Early Access Period")
|
||||
.put("FEE_3", "45")
|
||||
.build());
|
||||
persistContactsAndHosts();
|
||||
persistResource(
|
||||
Registry.get("tld")
|
||||
.asBuilder()
|
||||
.setEapFeeSchedule(
|
||||
ImmutableSortedMap.of(
|
||||
START_OF_TIME,
|
||||
Money.of(USD, 0),
|
||||
clock.nowUtc().minusDays(1),
|
||||
Money.of(USD, 100),
|
||||
clock.nowUtc().plusDays(1),
|
||||
Money.of(USD, 0)))
|
||||
.build());
|
||||
doSuccessfulTest(
|
||||
"tld", "domain_create_response_eap_fee.xml", ImmutableMap.of("FEE_VERSION", "0.6"));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testSuccess_eapFee_fullDescription_includingArbitraryExpiryTime() throws Exception {
|
||||
setEppInput(
|
||||
|
|
30
javatests/google/registry/flows/domain/testdata/domain_create_extra_fees.xml
vendored
Normal file
30
javatests/google/registry/flows/domain/testdata/domain_create_extra_fees.xml
vendored
Normal file
|
@ -0,0 +1,30 @@
|
|||
<epp xmlns="urn:ietf:params:xml:ns:epp-1.0">
|
||||
<command>
|
||||
<create>
|
||||
<domain:create
|
||||
xmlns:domain="urn:ietf:params:xml:ns:domain-1.0">
|
||||
<domain:name>example.tld</domain:name>
|
||||
<domain:period unit="y">2</domain:period>
|
||||
<domain:ns>
|
||||
<domain:hostObj>ns1.example.net</domain:hostObj>
|
||||
<domain:hostObj>ns2.example.net</domain:hostObj>
|
||||
</domain:ns>
|
||||
<domain:registrant>jd1234</domain:registrant>
|
||||
<domain:contact type="admin">sh8013</domain:contact>
|
||||
<domain:contact type="tech">sh8013</domain:contact>
|
||||
<domain:authInfo>
|
||||
<domain:pw>2fooBAR</domain:pw>
|
||||
</domain:authInfo>
|
||||
</domain:create>
|
||||
</create>
|
||||
<extension>
|
||||
<fee:create xmlns:fee="urn:ietf:params:xml:ns:fee-%FEE_VERSION%">
|
||||
<fee:currency>USD</fee:currency>
|
||||
<fee:fee description="%DESCRIPTION_1%">%FEE_1%</fee:fee>
|
||||
<fee:fee description="%DESCRIPTION_2%">%FEE_2%</fee:fee>
|
||||
<fee:fee description="%DESCRIPTION_3%">%FEE_3%</fee:fee>
|
||||
</fee:create>
|
||||
</extension>
|
||||
<clTRID>ABC-12345</clTRID>
|
||||
</command>
|
||||
</epp>
|
Loading…
Add table
Add a link
Reference in a new issue