Centralize RDAP test initialization and login

All RDAP actions inherit from a common RdapActionBase class.

All RDAP search actions inherit from a comman RdapSearchActionBase class, which inherits from RdapActionBase

Each of the base classes has @Before initialization needed for the tests, as well as utility functions (such as login and logout).

Currently, these were copied in all test classes. Instead, we created a similar test inheritance tree to centralize the initialization and place common utility functions.

This way, the @Before of every test only needs to initialize the variables new to the specific action, making the code somewhat clearer.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=217856844
This commit is contained in:
guyben 2018-10-19 05:37:29 -07:00 committed by jianglai
parent b254269d2f
commit 3a3b0b738a
45 changed files with 456 additions and 758 deletions

View file

@ -49,6 +49,7 @@ import google.registry.request.Response;
import google.registry.request.auth.AuthResult; import google.registry.request.auth.AuthResult;
import google.registry.request.auth.UserAuthInfo; import google.registry.request.auth.UserAuthInfo;
import google.registry.ui.server.registrar.AuthenticatedRegistrarAccessor; import google.registry.ui.server.registrar.AuthenticatedRegistrarAccessor;
import google.registry.util.Clock;
import java.io.IOException; import java.io.IOException;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
@ -87,6 +88,7 @@ public abstract class RdapActionBase implements Runnable {
} }
@Inject Response response; @Inject Response response;
@Inject Clock clock;
@Inject @RequestMethod Action.Method requestMethod; @Inject @RequestMethod Action.Method requestMethod;
@Inject @RequestPath String requestPath; @Inject @RequestPath String requestPath;
@Inject @FullServletPath String fullServletPath; @Inject @FullServletPath String fullServletPath;

View file

@ -29,7 +29,6 @@ import google.registry.request.Action;
import google.registry.request.HttpException.BadRequestException; import google.registry.request.HttpException.BadRequestException;
import google.registry.request.HttpException.NotFoundException; import google.registry.request.HttpException.NotFoundException;
import google.registry.request.auth.Auth; import google.registry.request.auth.Auth;
import google.registry.util.Clock;
import javax.inject.Inject; import javax.inject.Inject;
import org.joda.time.DateTime; import org.joda.time.DateTime;
@ -44,8 +43,7 @@ public class RdapDomainAction extends RdapActionBase {
public static final String PATH = "/rdap/domain/"; public static final String PATH = "/rdap/domain/";
@Inject Clock clock; @Inject public RdapDomainAction() {}
@Inject RdapDomainAction() {}
@Override @Override
public String getHumanReadableObjectTypeName() { public String getHumanReadableObjectTypeName() {

View file

@ -45,7 +45,6 @@ import google.registry.request.HttpException.NotFoundException;
import google.registry.request.HttpException.UnprocessableEntityException; import google.registry.request.HttpException.UnprocessableEntityException;
import google.registry.request.Parameter; import google.registry.request.Parameter;
import google.registry.request.auth.Auth; import google.registry.request.auth.Auth;
import google.registry.util.Clock;
import google.registry.util.Idn; import google.registry.util.Idn;
import google.registry.util.NonFinalForTesting; import google.registry.util.NonFinalForTesting;
import java.net.InetAddress; import java.net.InetAddress;
@ -83,11 +82,10 @@ public class RdapDomainSearchAction extends RdapSearchActionBase {
private static final FluentLogger logger = FluentLogger.forEnclosingClass(); private static final FluentLogger logger = FluentLogger.forEnclosingClass();
@Inject Clock clock;
@Inject @Parameter("name") Optional<String> nameParam; @Inject @Parameter("name") Optional<String> nameParam;
@Inject @Parameter("nsLdhName") Optional<String> nsLdhNameParam; @Inject @Parameter("nsLdhName") Optional<String> nsLdhNameParam;
@Inject @Parameter("nsIp") Optional<String> nsIpParam; @Inject @Parameter("nsIp") Optional<String> nsIpParam;
@Inject RdapDomainSearchAction() {} @Inject public RdapDomainSearchAction() {}
@Override @Override
public String getHumanReadableObjectTypeName() { public String getHumanReadableObjectTypeName() {

View file

@ -31,7 +31,6 @@ import google.registry.request.Action;
import google.registry.request.HttpException.BadRequestException; import google.registry.request.HttpException.BadRequestException;
import google.registry.request.HttpException.NotFoundException; import google.registry.request.HttpException.NotFoundException;
import google.registry.request.auth.Auth; import google.registry.request.auth.Auth;
import google.registry.util.Clock;
import java.util.Optional; import java.util.Optional;
import javax.inject.Inject; import javax.inject.Inject;
import org.joda.time.DateTime; import org.joda.time.DateTime;
@ -58,8 +57,7 @@ public class RdapEntityAction extends RdapActionBase {
private static final Pattern ROID_PATTERN = Pattern.compile("[-_.a-zA-Z0-9]+"); private static final Pattern ROID_PATTERN = Pattern.compile("[-_.a-zA-Z0-9]+");
@Inject Clock clock; @Inject public RdapEntityAction() {}
@Inject RdapEntityAction() {}
@Override @Override
public String getHumanReadableObjectTypeName() { public String getHumanReadableObjectTypeName() {

View file

@ -39,7 +39,6 @@ import google.registry.request.HttpException.NotFoundException;
import google.registry.request.HttpException.UnprocessableEntityException; import google.registry.request.HttpException.UnprocessableEntityException;
import google.registry.request.Parameter; import google.registry.request.Parameter;
import google.registry.request.auth.Auth; import google.registry.request.auth.Auth;
import google.registry.util.Clock;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
@ -84,11 +83,10 @@ public class RdapEntitySearchAction extends RdapSearchActionBase {
public static final String PATH = "/rdap/entities"; public static final String PATH = "/rdap/entities";
@Inject Clock clock;
@Inject @Parameter("fn") Optional<String> fnParam; @Inject @Parameter("fn") Optional<String> fnParam;
@Inject @Parameter("handle") Optional<String> handleParam; @Inject @Parameter("handle") Optional<String> handleParam;
@Inject @Parameter("subtype") Optional<String> subtypeParam; @Inject @Parameter("subtype") Optional<String> subtypeParam;
@Inject RdapEntitySearchAction() {} @Inject public RdapEntitySearchAction() {}
private enum QueryType { private enum QueryType {
FULL_NAME, FULL_NAME,

View file

@ -23,7 +23,6 @@ import google.registry.rdap.RdapJsonFormatter.BoilerplateType;
import google.registry.rdap.RdapMetrics.EndpointType; import google.registry.rdap.RdapMetrics.EndpointType;
import google.registry.request.Action; import google.registry.request.Action;
import google.registry.request.auth.Auth; import google.registry.request.auth.Auth;
import google.registry.util.Clock;
import javax.inject.Inject; import javax.inject.Inject;
/** RDAP (new WHOIS) action for help requests. */ /** RDAP (new WHOIS) action for help requests. */
@ -37,8 +36,7 @@ public class RdapHelpAction extends RdapActionBase {
public static final String PATH = "/rdap/help"; public static final String PATH = "/rdap/help";
@Inject Clock clock; @Inject public RdapHelpAction() {}
@Inject RdapHelpAction() {}
@Override @Override
public String getHumanReadableObjectTypeName() { public String getHumanReadableObjectTypeName() {

View file

@ -29,7 +29,6 @@ import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.collect.Ordering; import com.google.common.collect.Ordering;
import com.google.common.collect.Streams; import com.google.common.collect.Streams;
import com.google.common.flogger.FluentLogger;
import com.google.common.net.InetAddresses; import com.google.common.net.InetAddresses;
import com.googlecode.objectify.Key; import com.googlecode.objectify.Key;
import google.registry.config.RdapNoticeDescriptor; import google.registry.config.RdapNoticeDescriptor;
@ -83,8 +82,6 @@ public class RdapJsonFormatter {
@Inject @Config("rdapHelpMap") ImmutableMap<String, RdapNoticeDescriptor> rdapHelpMap; @Inject @Config("rdapHelpMap") ImmutableMap<String, RdapNoticeDescriptor> rdapHelpMap;
@Inject RdapJsonFormatter() {} @Inject RdapJsonFormatter() {}
private static final FluentLogger logger = FluentLogger.forEnclosingClass();
/** /**
* What type of data to generate. Summary data includes only information about the object itself, * What type of data to generate. Summary data includes only information about the object itself,
* while full data includes associated items (e.g. for domains, full data includes the hosts, * while full data includes associated items (e.g. for domains, full data includes the hosts,

View file

@ -29,7 +29,6 @@ import google.registry.request.Action;
import google.registry.request.HttpException.BadRequestException; import google.registry.request.HttpException.BadRequestException;
import google.registry.request.HttpException.NotFoundException; import google.registry.request.HttpException.NotFoundException;
import google.registry.request.auth.Auth; import google.registry.request.auth.Auth;
import google.registry.util.Clock;
import javax.inject.Inject; import javax.inject.Inject;
import org.joda.time.DateTime; import org.joda.time.DateTime;
@ -44,8 +43,7 @@ public class RdapNameserverAction extends RdapActionBase {
public static final String PATH = "/rdap/nameserver/"; public static final String PATH = "/rdap/nameserver/";
@Inject Clock clock; @Inject public RdapNameserverAction() {}
@Inject RdapNameserverAction() {}
@Override @Override
public String getHumanReadableObjectTypeName() { public String getHumanReadableObjectTypeName() {

View file

@ -38,7 +38,6 @@ import google.registry.request.HttpException.NotFoundException;
import google.registry.request.HttpException.UnprocessableEntityException; import google.registry.request.HttpException.UnprocessableEntityException;
import google.registry.request.Parameter; import google.registry.request.Parameter;
import google.registry.request.auth.Auth; import google.registry.request.auth.Auth;
import google.registry.util.Clock;
import google.registry.util.Idn; import google.registry.util.Idn;
import java.net.InetAddress; import java.net.InetAddress;
import java.util.ArrayList; import java.util.ArrayList;
@ -66,10 +65,9 @@ public class RdapNameserverSearchAction extends RdapSearchActionBase {
public static final String PATH = "/rdap/nameservers"; public static final String PATH = "/rdap/nameservers";
@Inject Clock clock;
@Inject @Parameter("name") Optional<String> nameParam; @Inject @Parameter("name") Optional<String> nameParam;
@Inject @Parameter("ip") Optional<String> ipParam; @Inject @Parameter("ip") Optional<String> ipParam;
@Inject RdapNameserverSearchAction() {} @Inject public RdapNameserverSearchAction() {}
@Override @Override
public String getHumanReadableObjectTypeName() { public String getHumanReadableObjectTypeName() {

View file

@ -0,0 +1,136 @@
// Copyright 2018 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.rdap;
import static google.registry.rdap.RdapAuthorization.Role.ADMINISTRATOR;
import static google.registry.rdap.RdapAuthorization.Role.PUBLIC;
import static google.registry.rdap.RdapAuthorization.Role.REGISTRAR;
import static google.registry.request.Action.Method.GET;
import static google.registry.request.Action.Method.HEAD;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import com.google.appengine.api.users.User;
import google.registry.model.ofy.Ofy;
import google.registry.request.Action;
import google.registry.request.HttpException.ForbiddenException;
import google.registry.request.auth.AuthLevel;
import google.registry.request.auth.AuthResult;
import google.registry.request.auth.UserAuthInfo;
import google.registry.testing.AppEngineRule;
import google.registry.testing.FakeClock;
import google.registry.testing.FakeResponse;
import google.registry.testing.InjectRule;
import google.registry.ui.server.registrar.AuthenticatedRegistrarAccessor;
import google.registry.util.TypeUtils;
import java.util.Optional;
import org.joda.time.DateTime;
import org.json.simple.JSONValue;
import org.junit.Before;
import org.junit.Rule;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/** Common unit test code for actions inheriting {@link RdapActionBase}. */
@RunWith(JUnit4.class)
public class RdapActionBaseTestCase<A extends RdapActionBase> {
@Rule
public final AppEngineRule appEngine = AppEngineRule.builder()
.withDatastore()
.build();
@Rule
public final InjectRule inject = new InjectRule();
protected static final AuthResult AUTH_RESULT =
AuthResult.create(
AuthLevel.USER,
UserAuthInfo.create(new User("rdap.user@user.com", "gmail.com", "12345"), false));
protected static final AuthResult AUTH_RESULT_ADMIN =
AuthResult.create(
AuthLevel.USER,
UserAuthInfo.create(new User("rdap.admin@google.com", "gmail.com", "12345"), true));
protected final AuthenticatedRegistrarAccessor registrarAccessor =
mock(AuthenticatedRegistrarAccessor.class);
protected FakeResponse response = new FakeResponse();
protected final FakeClock clock = new FakeClock(DateTime.parse("2000-01-01TZ"));
protected final RdapMetrics rdapMetrics = mock(RdapMetrics.class);
protected RdapAuthorization.Role metricRole = PUBLIC;
protected A action;
protected final String actionPath;
protected final Class<A> rdapActionClass;
protected RdapActionBaseTestCase(Class<A> rdapActionClass, String actionPath) {
this.rdapActionClass = rdapActionClass;
this.actionPath = actionPath;
}
@Before
public void baseSetUp() {
inject.setStaticField(Ofy.class, "clock", clock);
action = TypeUtils.instantiate(rdapActionClass);
action.registrarAccessor = registrarAccessor;
action.clock = clock;
action.authResult = AUTH_RESULT;
action.includeDeletedParam = Optional.empty();
action.registrarParam = Optional.empty();
action.formatOutputParam = Optional.empty();
action.response = response;
action.rdapJsonFormatter = RdapTestHelper.getTestRdapJsonFormatter();
action.rdapMetrics = rdapMetrics;
action.requestMethod = Action.Method.GET;
action.fullServletPath = "https://example.tld/rdap";
action.rdapWhoisServer = null;
}
protected void login(String clientId) {
when(registrarAccessor.guessClientId()).thenReturn(clientId);
action.authResult = AUTH_RESULT;
metricRole = REGISTRAR;
}
protected void logout() {
when(registrarAccessor.guessClientId()).thenThrow(new ForbiddenException("not logged in"));
action.authResult = AUTH_RESULT;
metricRole = PUBLIC;
}
protected void loginAsAdmin() {
when(registrarAccessor.guessClientId()).thenReturn("irrelevant");
action.authResult = AUTH_RESULT_ADMIN;
metricRole = ADMINISTRATOR;
}
protected Object generateActualJson(String domainName) {
action.requestPath = actionPath + domainName;
action.requestMethod = GET;
action.run();
return JSONValue.parse(response.getPayload());
}
protected String generateHeadPayload(String domainName) {
action.requestPath = actionPath + domainName;
action.fullServletPath = "http://myserver.example.com" + actionPath;
action.requestMethod = HEAD;
action.run();
return response.getPayload();
}
}

View file

@ -25,11 +25,8 @@ import static google.registry.testing.FullFieldsTestEntityHelper.makeHistoryEntr
import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrar; import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrar;
import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrarContacts; import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrarContacts;
import static google.registry.testing.TestDataHelper.loadFile; import static google.registry.testing.TestDataHelper.loadFile;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import com.google.appengine.api.users.User;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
@ -37,7 +34,6 @@ import google.registry.model.contact.ContactResource;
import google.registry.model.domain.DomainBase; import google.registry.model.domain.DomainBase;
import google.registry.model.domain.Period; import google.registry.model.domain.Period;
import google.registry.model.host.HostResource; import google.registry.model.host.HostResource;
import google.registry.model.ofy.Ofy;
import google.registry.model.registrar.Registrar; import google.registry.model.registrar.Registrar;
import google.registry.model.registry.Registry; import google.registry.model.registry.Registry;
import google.registry.model.reporting.HistoryEntry; import google.registry.model.reporting.HistoryEntry;
@ -46,61 +42,28 @@ import google.registry.rdap.RdapMetrics.SearchType;
import google.registry.rdap.RdapMetrics.WildcardType; import google.registry.rdap.RdapMetrics.WildcardType;
import google.registry.rdap.RdapSearchResults.IncompletenessWarningType; import google.registry.rdap.RdapSearchResults.IncompletenessWarningType;
import google.registry.request.Action; import google.registry.request.Action;
import google.registry.request.auth.AuthLevel;
import google.registry.request.auth.AuthResult;
import google.registry.request.auth.UserAuthInfo;
import google.registry.testing.AppEngineRule;
import google.registry.testing.FakeClock;
import google.registry.testing.FakeResponse;
import google.registry.testing.InjectRule;
import google.registry.ui.server.registrar.AuthenticatedRegistrarAccessor;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.joda.time.DateTime;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import org.json.simple.JSONValue; import org.json.simple.JSONValue;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore; import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.junit.runners.JUnit4; import org.junit.runners.JUnit4;
/** Unit tests for {@link RdapDomainAction}. */ /** Unit tests for {@link RdapDomainAction}. */
@RunWith(JUnit4.class) @RunWith(JUnit4.class)
public class RdapDomainActionTest { public class RdapDomainActionTest extends RdapActionBaseTestCase<RdapDomainAction> {
@Rule public RdapDomainActionTest() {
public final AppEngineRule appEngine = AppEngineRule.builder() super(RdapDomainAction.class, RdapDomainAction.PATH);
.withDatastore() }
.build();
@Rule
public final InjectRule inject = new InjectRule();
private final FakeResponse response = new FakeResponse();
private final FakeClock clock = new FakeClock(DateTime.parse("2000-01-01TZ"));
private final AuthenticatedRegistrarAccessor registrarAccessor =
mock(AuthenticatedRegistrarAccessor.class);
private final RdapMetrics rdapMetrics = mock(RdapMetrics.class);
private RdapDomainAction action;
private static final AuthResult AUTH_RESULT =
AuthResult.create(
AuthLevel.USER,
UserAuthInfo.create(new User("rdap.user@user.com", "gmail.com", "12345"), false));
private static final AuthResult AUTH_RESULT_ADMIN =
AuthResult.create(
AuthLevel.USER,
UserAuthInfo.create(new User("rdap.user@google.com", "gmail.com", "12345"), true));
@Before @Before
public void setUp() { public void setUp() {
inject.setStaticField(Ofy.class, "clock", clock);
// lol // lol
createTld("lol"); createTld("lol");
Registrar registrarLol = persistResource(makeRegistrar( Registrar registrarLol = persistResource(makeRegistrar(
@ -265,35 +228,6 @@ public class RdapDomainActionTest {
Period.create(1, Period.Unit.YEARS), Period.create(1, Period.Unit.YEARS),
"deleted", "deleted",
clock.nowUtc().minusMonths(6))); clock.nowUtc().minusMonths(6)));
action = new RdapDomainAction();
action.clock = clock;
action.requestMethod = Action.Method.GET;
action.fullServletPath = "https://example.com/rdap";
action.response = response;
action.registrarParam = Optional.empty();
action.includeDeletedParam = Optional.empty();
action.formatOutputParam = Optional.empty();
action.rdapJsonFormatter = RdapTestHelper.getTestRdapJsonFormatter();
action.rdapWhoisServer = null;
action.registrarAccessor = registrarAccessor;
action.authResult = AUTH_RESULT;
action.rdapMetrics = rdapMetrics;
}
private void login(String clientId) {
when(registrarAccessor.guessClientId()).thenReturn(clientId);
}
private void loginAsAdmin() {
when(registrarAccessor.guessClientId()).thenReturn("irrelevant");
action.authResult = AUTH_RESULT_ADMIN;
}
private Object generateActualJson(String domainName) {
action.requestPath = RdapDomainAction.PATH + domainName;
action.run();
return JSONValue.parse(response.getPayload());
} }
private Object generateExpectedJson( private Object generateExpectedJson(
@ -400,7 +334,7 @@ public class RdapDomainActionTest {
builder, builder,
false, false,
RdapTestHelper.createNotices( RdapTestHelper.createNotices(
"https://example.com/rdap/", "https://example.tld/rdap/",
(contactRoids == null) (contactRoids == null)
? RdapTestHelper.ContactNoticeType.DOMAIN ? RdapTestHelper.ContactNoticeType.DOMAIN
: RdapTestHelper.ContactNoticeType.NONE, : RdapTestHelper.ContactNoticeType.NONE,

View file

@ -16,8 +16,6 @@ package google.registry.rdap;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static google.registry.rdap.RdapAuthorization.Role.ADMINISTRATOR;
import static google.registry.rdap.RdapAuthorization.Role.REGISTRAR;
import static google.registry.request.Action.Method.POST; import static google.registry.request.Action.Method.POST;
import static google.registry.testing.DatastoreHelper.createTld; import static google.registry.testing.DatastoreHelper.createTld;
import static google.registry.testing.DatastoreHelper.persistDomainAsDeleted; import static google.registry.testing.DatastoreHelper.persistDomainAsDeleted;
@ -31,10 +29,7 @@ import static google.registry.testing.FullFieldsTestEntityHelper.makeHistoryEntr
import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrar; import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrar;
import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrarContacts; import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrarContacts;
import static google.registry.testing.TestDataHelper.loadFile; import static google.registry.testing.TestDataHelper.loadFile;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import com.google.appengine.api.users.User;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap; import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
@ -46,7 +41,6 @@ import google.registry.model.contact.ContactResource;
import google.registry.model.domain.DomainResource; import google.registry.model.domain.DomainResource;
import google.registry.model.domain.Period; import google.registry.model.domain.Period;
import google.registry.model.host.HostResource; import google.registry.model.host.HostResource;
import google.registry.model.ofy.Ofy;
import google.registry.model.registrar.Registrar; import google.registry.model.registrar.Registrar;
import google.registry.model.registry.Registry; import google.registry.model.registry.Registry;
import google.registry.model.reporting.HistoryEntry; import google.registry.model.reporting.HistoryEntry;
@ -54,15 +48,7 @@ import google.registry.rdap.RdapMetrics.EndpointType;
import google.registry.rdap.RdapMetrics.SearchType; import google.registry.rdap.RdapMetrics.SearchType;
import google.registry.rdap.RdapMetrics.WildcardType; import google.registry.rdap.RdapMetrics.WildcardType;
import google.registry.rdap.RdapSearchResults.IncompletenessWarningType; import google.registry.rdap.RdapSearchResults.IncompletenessWarningType;
import google.registry.request.Action;
import google.registry.request.auth.AuthLevel;
import google.registry.request.auth.AuthResult;
import google.registry.request.auth.UserAuthInfo;
import google.registry.testing.AppEngineRule;
import google.registry.testing.FakeClock;
import google.registry.testing.FakeResponse; import google.registry.testing.FakeResponse;
import google.registry.testing.InjectRule;
import google.registry.ui.server.registrar.AuthenticatedRegistrarAccessor;
import google.registry.util.Idn; import google.registry.util.Idn;
import java.net.IDN; import java.net.IDN;
import java.net.URLDecoder; import java.net.URLDecoder;
@ -71,42 +57,22 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.joda.time.DateTime;
import org.json.simple.JSONArray; import org.json.simple.JSONArray;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import org.json.simple.JSONValue; import org.json.simple.JSONValue;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore; import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.junit.runners.JUnit4; import org.junit.runners.JUnit4;
/** Unit tests for {@link RdapDomainSearchAction}. */ /** Unit tests for {@link RdapDomainSearchAction}. */
@RunWith(JUnit4.class) @RunWith(JUnit4.class)
public class RdapDomainSearchActionTest extends RdapSearchActionTestCase { public class RdapDomainSearchActionTest extends RdapSearchActionTestCase<RdapDomainSearchAction> {
@Rule public final AppEngineRule appEngine = AppEngineRule.builder().withDatastore().build(); public RdapDomainSearchActionTest() {
super(RdapDomainSearchAction.class, RdapDomainSearchAction.PATH);
@Rule public final InjectRule inject = new InjectRule(); }
private final FakeClock clock = new FakeClock(DateTime.parse("2000-01-01T00:00:00Z"));
private final AuthenticatedRegistrarAccessor registrarAccessor =
mock(AuthenticatedRegistrarAccessor.class);
private final RdapDomainSearchAction action = new RdapDomainSearchAction();
private static final AuthResult AUTH_RESULT =
AuthResult.create(
AuthLevel.USER,
UserAuthInfo.create(new User("rdap.user@user.com", "gmail.com", "12345"), false));
private static final AuthResult AUTH_RESULT_ADMIN =
AuthResult.create(
AuthLevel.USER,
UserAuthInfo.create(new User("rdap.user@google.com", "gmail.com", "12345"), true));
private FakeResponse response = new FakeResponse();
private Registrar registrar; private Registrar registrar;
private DomainResource domainCatLol; private DomainResource domainCatLol;
@ -131,6 +97,7 @@ public class RdapDomainSearchActionTest extends RdapSearchActionTestCase {
private Object generateActualJson( private Object generateActualJson(
RequestType requestType, String paramValue, String cursor) { RequestType requestType, String paramValue, String cursor) {
action.requestPath = RdapDomainSearchAction.PATH; action.requestPath = RdapDomainSearchAction.PATH;
action.requestMethod = POST;
String requestTypeParam = null; String requestTypeParam = null;
switch (requestType) { switch (requestType) {
case NAME: case NAME:
@ -180,7 +147,6 @@ public class RdapDomainSearchActionTest extends RdapSearchActionTestCase {
@Before @Before
public void setUp() { public void setUp() {
RdapDomainSearchAction.maxNameserversInFirstStage = 40; RdapDomainSearchAction.maxNameserversInFirstStage = 40;
inject.setStaticField(Ofy.class, "clock", clock);
// cat.lol and cat2.lol // cat.lol and cat2.lol
createTld("lol"); createTld("lol");
@ -394,34 +360,7 @@ public class RdapDomainSearchActionTest extends RdapSearchActionTestCase {
"created", "created",
clock.nowUtc())); clock.nowUtc()));
action.clock = clock;
action.requestMethod = Action.Method.GET;
action.fullServletPath = "https://example.com/rdap";
action.requestUrl = "https://example.com/rdap/domains";
action.parameterMap = ImmutableListMultimap.of();
action.requestMethod = POST; action.requestMethod = POST;
action.response = response;
action.registrarParam = Optional.empty();
action.includeDeletedParam = Optional.empty();
action.formatOutputParam = Optional.empty();
action.rdapJsonFormatter = RdapTestHelper.getTestRdapJsonFormatter();
action.rdapWhoisServer = null;
action.registrarAccessor = registrarAccessor;
action.authResult = AUTH_RESULT;
action.rdapMetrics = rdapMetrics;
action.cursorTokenParam = Optional.empty();
action.rdapResultSetMaxSize = 4;
}
private void login(String clientId) {
when(registrarAccessor.guessClientId()).thenReturn(clientId);
metricRole = REGISTRAR;
}
private void loginAsAdmin() {
when(registrarAccessor.guessClientId()).thenReturn("irrelevant");
action.authResult = AUTH_RESULT_ADMIN;
metricRole = ADMINISTRATOR;
} }
private Object generateExpectedJsonForTwoDomains() { private Object generateExpectedJsonForTwoDomains() {
@ -562,7 +501,7 @@ public class RdapDomainSearchActionTest extends RdapSearchActionTestCase {
builder.put("domainSearchResults", ImmutableList.of(obj)); builder.put("domainSearchResults", ImmutableList.of(obj));
builder.put("rdapConformance", ImmutableList.of("rdap_level_0")); builder.put("rdapConformance", ImmutableList.of("rdap_level_0"));
RdapTestHelper.addDomainBoilerplateNotices( RdapTestHelper.addDomainBoilerplateNotices(
builder, RdapTestHelper.createNotices("https://example.com/rdap/")); builder, RdapTestHelper.createNotices("https://example.tld/rdap/"));
return new JSONObject(builder.build()); return new JSONObject(builder.build());
} }

View file

@ -25,61 +25,35 @@ import static google.registry.testing.FullFieldsTestEntityHelper.makeHostResourc
import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrar; import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrar;
import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrarContacts; import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrarContacts;
import static google.registry.testing.TestDataHelper.loadFile; import static google.registry.testing.TestDataHelper.loadFile;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import com.google.appengine.api.users.User;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import google.registry.model.contact.ContactResource; import google.registry.model.contact.ContactResource;
import google.registry.model.host.HostResource; import google.registry.model.host.HostResource;
import google.registry.model.ofy.Ofy;
import google.registry.model.registrar.Registrar; import google.registry.model.registrar.Registrar;
import google.registry.rdap.RdapMetrics.EndpointType; import google.registry.rdap.RdapMetrics.EndpointType;
import google.registry.rdap.RdapMetrics.SearchType; import google.registry.rdap.RdapMetrics.SearchType;
import google.registry.rdap.RdapMetrics.WildcardType; import google.registry.rdap.RdapMetrics.WildcardType;
import google.registry.rdap.RdapSearchResults.IncompletenessWarningType; import google.registry.rdap.RdapSearchResults.IncompletenessWarningType;
import google.registry.request.Action; import google.registry.request.Action;
import google.registry.request.auth.AuthLevel;
import google.registry.request.auth.AuthResult;
import google.registry.request.auth.UserAuthInfo;
import google.registry.testing.AppEngineRule;
import google.registry.testing.FakeClock;
import google.registry.testing.FakeResponse;
import google.registry.testing.InjectRule;
import google.registry.ui.server.registrar.AuthenticatedRegistrarAccessor;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.joda.time.DateTime;
import org.json.simple.JSONValue; import org.json.simple.JSONValue;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.junit.runners.JUnit4; import org.junit.runners.JUnit4;
/** Unit tests for {@link RdapEntityAction}. */ /** Unit tests for {@link RdapEntityAction}. */
@RunWith(JUnit4.class) @RunWith(JUnit4.class)
public class RdapEntityActionTest { public class RdapEntityActionTest extends RdapActionBaseTestCase<RdapEntityAction> {
@Rule public RdapEntityActionTest() {
public final AppEngineRule appEngine = AppEngineRule.builder() super(RdapEntityAction.class, RdapEntityAction.PATH);
.withDatastore() }
.build();
@Rule
public final InjectRule inject = new InjectRule();
private final FakeResponse response = new FakeResponse();
private final FakeClock clock = new FakeClock(DateTime.parse("2000-01-01TZ"));
private final AuthenticatedRegistrarAccessor registrarAccessor =
mock(AuthenticatedRegistrarAccessor.class);
private final RdapMetrics rdapMetrics = mock(RdapMetrics.class);
private RdapEntityAction action;
private Registrar registrarLol; private Registrar registrarLol;
private ContactResource registrant; private ContactResource registrant;
@ -88,19 +62,8 @@ public class RdapEntityActionTest {
private ContactResource disconnectedContact; private ContactResource disconnectedContact;
private ContactResource deletedContact; private ContactResource deletedContact;
private static final AuthResult AUTH_RESULT =
AuthResult.create(
AuthLevel.USER,
UserAuthInfo.create(new User("rdap.user@user.com", "gmail.com", "12345"), false));
private static final AuthResult AUTH_RESULT_ADMIN =
AuthResult.create(
AuthLevel.USER,
UserAuthInfo.create(new User("rdap.user@google.com", "gmail.com", "12345"), true));
@Before @Before
public void setUp() { public void setUp() {
inject.setStaticField(Ofy.class, "clock", clock);
// lol // lol
createTld("lol"); createTld("lol");
registrarLol = persistResource(makeRegistrar( registrarLol = persistResource(makeRegistrar(
@ -167,34 +130,6 @@ public class RdapEntityActionTest {
clock.nowUtc().minusYears(1), clock.nowUtc().minusYears(1),
registrarLol, registrarLol,
clock.nowUtc().minusMonths(6)); clock.nowUtc().minusMonths(6));
action = new RdapEntityAction();
action.clock = clock;
action.requestMethod = Action.Method.GET;
action.fullServletPath = "https://example.com/rdap";
action.response = response;
action.registrarParam = Optional.empty();
action.includeDeletedParam = Optional.empty();
action.formatOutputParam = Optional.empty();
action.rdapJsonFormatter = RdapTestHelper.getTestRdapJsonFormatter();
action.rdapWhoisServer = null;
action.registrarAccessor = registrarAccessor;
action.authResult = AUTH_RESULT;
action.rdapMetrics = rdapMetrics;
}
private void login(String registrar) {
when(registrarAccessor.guessClientId()).thenReturn(registrar);
}
private void loginAsAdmin() {
action.authResult = AUTH_RESULT_ADMIN;
when(registrarAccessor.guessClientId()).thenReturn("irrelevant");
}
private Object generateActualJson(String name) {
action.requestPath = RdapEntityAction.PATH + name;
action.run();
return JSONValue.parse(response.getPayload());
} }
private Object generateExpectedJson(String handle, String expectedOutputFile) { private Object generateExpectedJson(String handle, String expectedOutputFile) {
@ -262,7 +197,7 @@ public class RdapEntityActionTest {
RdapTestHelper.addNonDomainBoilerplateNotices( RdapTestHelper.addNonDomainBoilerplateNotices(
builder, builder,
RdapTestHelper.createNotices( RdapTestHelper.createNotices(
"https://example.com/rdap/", "https://example.tld/rdap/",
addNoPersonalDataRemark addNoPersonalDataRemark
? RdapTestHelper.ContactNoticeType.CONTACT ? RdapTestHelper.ContactNoticeType.CONTACT
: RdapTestHelper.ContactNoticeType.NONE, : RdapTestHelper.ContactNoticeType.NONE,

View file

@ -16,8 +16,6 @@ package google.registry.rdap;
import static com.google.common.base.Preconditions.checkNotNull; import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static google.registry.rdap.RdapAuthorization.Role.ADMINISTRATOR;
import static google.registry.rdap.RdapAuthorization.Role.REGISTRAR;
import static google.registry.request.Action.Method.GET; import static google.registry.request.Action.Method.GET;
import static google.registry.testing.DatastoreHelper.createTld; import static google.registry.testing.DatastoreHelper.createTld;
import static google.registry.testing.DatastoreHelper.persistResource; import static google.registry.testing.DatastoreHelper.persistResource;
@ -30,64 +28,44 @@ import static google.registry.testing.FullFieldsTestEntityHelper.makeHistoryEntr
import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrar; import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrar;
import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrarContacts; import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrarContacts;
import static google.registry.testing.TestDataHelper.loadFile; import static google.registry.testing.TestDataHelper.loadFile;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import com.google.appengine.api.users.User;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap; import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import google.registry.model.ImmutableObject; import google.registry.model.ImmutableObject;
import google.registry.model.contact.ContactResource; import google.registry.model.contact.ContactResource;
import google.registry.model.ofy.Ofy;
import google.registry.model.registrar.Registrar; import google.registry.model.registrar.Registrar;
import google.registry.model.reporting.HistoryEntry; import google.registry.model.reporting.HistoryEntry;
import google.registry.rdap.RdapMetrics.EndpointType; import google.registry.rdap.RdapMetrics.EndpointType;
import google.registry.rdap.RdapMetrics.SearchType; import google.registry.rdap.RdapMetrics.SearchType;
import google.registry.rdap.RdapSearchResults.IncompletenessWarningType; import google.registry.rdap.RdapSearchResults.IncompletenessWarningType;
import google.registry.request.Action;
import google.registry.request.auth.AuthLevel;
import google.registry.request.auth.AuthResult;
import google.registry.request.auth.UserAuthInfo;
import google.registry.testing.AppEngineRule;
import google.registry.testing.FakeClock;
import google.registry.testing.FakeResponse; import google.registry.testing.FakeResponse;
import google.registry.testing.InjectRule;
import google.registry.ui.server.registrar.AuthenticatedRegistrarAccessor;
import java.net.URLDecoder; import java.net.URLDecoder;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.joda.time.DateTime;
import org.json.simple.JSONArray; import org.json.simple.JSONArray;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import org.json.simple.JSONValue; import org.json.simple.JSONValue;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.junit.runners.JUnit4; import org.junit.runners.JUnit4;
/** Unit tests for {@link RdapEntitySearchAction}. */ /** Unit tests for {@link RdapEntitySearchAction}. */
@RunWith(JUnit4.class) @RunWith(JUnit4.class)
public class RdapEntitySearchActionTest extends RdapSearchActionTestCase { public class RdapEntitySearchActionTest extends RdapSearchActionTestCase<RdapEntitySearchAction> {
@Rule public final AppEngineRule appEngine = AppEngineRule.builder().withDatastore().build(); public RdapEntitySearchActionTest() {
@Rule public final InjectRule inject = new InjectRule(); super(RdapEntitySearchAction.class, RdapEntitySearchAction.PATH);
}
private enum QueryType { private enum QueryType {
FULL_NAME, FULL_NAME,
HANDLE HANDLE
} }
private final FakeClock clock = new FakeClock(DateTime.parse("2000-01-01T00:00:00Z"));
private final AuthenticatedRegistrarAccessor registrarAccessor =
mock(AuthenticatedRegistrarAccessor.class);
private final RdapEntitySearchAction action = new RdapEntitySearchAction();
private FakeResponse response = new FakeResponse();
private Registrar registrarDeleted; private Registrar registrarDeleted;
private Registrar registrarInactive; private Registrar registrarInactive;
private Registrar registrarTest; private Registrar registrarTest;
@ -128,20 +106,8 @@ public class RdapEntitySearchActionTest extends RdapSearchActionTestCase {
return JSONValue.parse(response.getPayload()); return JSONValue.parse(response.getPayload());
} }
private static final AuthResult AUTH_RESULT =
AuthResult.create(
AuthLevel.USER,
UserAuthInfo.create(new User("rdap.user@user.com", "gmail.com", "12345"), false));
private static final AuthResult AUTH_RESULT_ADMIN =
AuthResult.create(
AuthLevel.USER,
UserAuthInfo.create(new User("rdap.user@google.com", "gmail.com", "12345"), true));
@Before @Before
public void setUp() { public void setUp() {
inject.setStaticField(Ofy.class, "clock", clock);
createTld("tld"); createTld("tld");
// deleted // deleted
@ -187,37 +153,9 @@ public class RdapEntitySearchActionTest extends RdapSearchActionTestCase {
registrarDeleted, registrarDeleted,
clock.nowUtc().minusMonths(6)); clock.nowUtc().minusMonths(6));
action.clock = clock;
action.requestMethod = Action.Method.GET;
action.fullServletPath = "https://example.com/rdap";
action.requestUrl = "https://example.com/rdap/entities";
action.requestPath = RdapEntitySearchAction.PATH;
action.parameterMap = ImmutableListMultimap.of();
action.response = response;
action.rdapJsonFormatter = RdapTestHelper.getTestRdapJsonFormatter();
action.rdapResultSetMaxSize = 4;
action.rdapWhoisServer = null;
action.fnParam = Optional.empty(); action.fnParam = Optional.empty();
action.handleParam = Optional.empty(); action.handleParam = Optional.empty();
action.subtypeParam = Optional.empty(); action.subtypeParam = Optional.empty();
action.registrarParam = Optional.empty();
action.includeDeletedParam = Optional.empty();
action.formatOutputParam = Optional.empty();
action.registrarAccessor = registrarAccessor;
action.authResult = AUTH_RESULT;
action.rdapMetrics = rdapMetrics;
action.cursorTokenParam = Optional.empty();
}
private void login(String registrar) {
when(registrarAccessor.guessClientId()).thenReturn(registrar);
metricRole = REGISTRAR;
}
private void loginAsAdmin() {
action.authResult = AUTH_RESULT_ADMIN;
when(registrarAccessor.guessClientId()).thenReturn("irrelevant");
metricRole = ADMINISTRATOR;
} }
private Object generateExpectedJson(String expectedOutputFile) { private Object generateExpectedJson(String expectedOutputFile) {
@ -269,7 +207,7 @@ public class RdapEntitySearchActionTest extends RdapSearchActionTestCase {
builder.put("entitySearchResults", ImmutableList.of(obj)); builder.put("entitySearchResults", ImmutableList.of(obj));
builder.put("rdapConformance", ImmutableList.of("rdap_level_0")); builder.put("rdapConformance", ImmutableList.of("rdap_level_0"));
RdapTestHelper.addNonDomainBoilerplateNotices( RdapTestHelper.addNonDomainBoilerplateNotices(
builder, RdapTestHelper.createNotices("https://example.com/rdap/")); builder, RdapTestHelper.createNotices("https://example.tld/rdap/"));
return new JSONObject(builder.build()); return new JSONObject(builder.build());
} }

View file

@ -16,73 +16,22 @@ package google.registry.rdap;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static google.registry.testing.TestDataHelper.loadFile; import static google.registry.testing.TestDataHelper.loadFile;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import com.google.appengine.api.users.User;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import google.registry.model.ofy.Ofy;
import google.registry.rdap.RdapMetrics.EndpointType; import google.registry.rdap.RdapMetrics.EndpointType;
import google.registry.rdap.RdapMetrics.SearchType; import google.registry.rdap.RdapMetrics.SearchType;
import google.registry.rdap.RdapMetrics.WildcardType; import google.registry.rdap.RdapMetrics.WildcardType;
import google.registry.rdap.RdapSearchResults.IncompletenessWarningType; import google.registry.rdap.RdapSearchResults.IncompletenessWarningType;
import google.registry.request.Action; import google.registry.request.Action;
import google.registry.request.auth.AuthLevel;
import google.registry.request.auth.AuthResult;
import google.registry.request.auth.UserAuthInfo;
import google.registry.testing.FakeClock;
import google.registry.testing.FakeResponse;
import google.registry.testing.InjectRule;
import google.registry.ui.server.registrar.AuthenticatedRegistrarAccessor;
import java.util.Optional;
import org.joda.time.DateTime;
import org.json.simple.JSONValue; import org.json.simple.JSONValue;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
/** Unit tests for {@link RdapHelpAction}. */ /** Unit tests for {@link RdapHelpAction}. */
@RunWith(JUnit4.class) public class RdapHelpActionTest extends RdapActionBaseTestCase<RdapHelpAction> {
public class RdapHelpActionTest {
@Rule public RdapHelpActionTest() {
public final InjectRule inject = new InjectRule(); super(RdapHelpAction.class, RdapHelpAction.PATH);
private final FakeResponse response = new FakeResponse();
private final FakeClock clock = new FakeClock(DateTime.parse("2000-01-01TZ"));
private final AuthenticatedRegistrarAccessor registrarAccessor =
mock(AuthenticatedRegistrarAccessor.class);
private final User user = new User("rdap.user@example.com", "gmail.com", "12345");
private final UserAuthInfo userAuthInfo = UserAuthInfo.create(user, false);
private final RdapMetrics rdapMetrics = mock(RdapMetrics.class);
private RdapHelpAction action;
@Before
public void setUp() {
inject.setStaticField(Ofy.class, "clock", clock);
action = new RdapHelpAction();
action.clock = clock;
action.fullServletPath = "https://example.tld/rdap";
action.requestMethod = Action.Method.GET;
action.registrarAccessor = registrarAccessor;
action.authResult = AuthResult.create(AuthLevel.USER, userAuthInfo);
action.includeDeletedParam = Optional.empty();
action.registrarParam = Optional.empty();
action.formatOutputParam = Optional.empty();
action.response = response;
action.rdapJsonFormatter = RdapTestHelper.getTestRdapJsonFormatter();
action.rdapWhoisServer = null;
action.rdapMetrics = rdapMetrics;
}
private Object generateActualJson(String helpPath) {
action.requestPath = RdapHelpAction.PATH + helpPath;
action.run();
return JSONValue.parse(response.getPayload());
} }
private Object generateExpectedJson(String name, String expectedOutputFile) { private Object generateExpectedJson(String name, String expectedOutputFile) {

View file

@ -20,72 +20,36 @@ import static google.registry.testing.DatastoreHelper.persistResource;
import static google.registry.testing.FullFieldsTestEntityHelper.makeAndPersistHostResource; import static google.registry.testing.FullFieldsTestEntityHelper.makeAndPersistHostResource;
import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrar; import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrar;
import static google.registry.testing.TestDataHelper.loadFile; import static google.registry.testing.TestDataHelper.loadFile;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import com.google.appengine.api.users.User;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSet;
import google.registry.model.ofy.Ofy;
import google.registry.model.registrar.Registrar; import google.registry.model.registrar.Registrar;
import google.registry.rdap.RdapMetrics.EndpointType; import google.registry.rdap.RdapMetrics.EndpointType;
import google.registry.rdap.RdapMetrics.SearchType; import google.registry.rdap.RdapMetrics.SearchType;
import google.registry.rdap.RdapMetrics.WildcardType; import google.registry.rdap.RdapMetrics.WildcardType;
import google.registry.rdap.RdapSearchResults.IncompletenessWarningType; import google.registry.rdap.RdapSearchResults.IncompletenessWarningType;
import google.registry.request.Action; import google.registry.request.Action;
import google.registry.request.HttpException.ForbiddenException;
import google.registry.request.auth.AuthLevel;
import google.registry.request.auth.AuthResult;
import google.registry.request.auth.UserAuthInfo;
import google.registry.testing.AppEngineRule;
import google.registry.testing.FakeClock;
import google.registry.testing.FakeResponse;
import google.registry.testing.InjectRule;
import google.registry.ui.server.registrar.AuthenticatedRegistrarAccessor;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.joda.time.DateTime;
import org.json.simple.JSONValue; import org.json.simple.JSONValue;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.junit.runners.JUnit4; import org.junit.runners.JUnit4;
/** Unit tests for {@link RdapNameserverAction}. */ /** Unit tests for {@link RdapNameserverAction}. */
@RunWith(JUnit4.class) @RunWith(JUnit4.class)
public class RdapNameserverActionTest { public class RdapNameserverActionTest extends RdapActionBaseTestCase<RdapNameserverAction> {
@Rule public RdapNameserverActionTest() {
public final AppEngineRule appEngine = AppEngineRule.builder() super(RdapNameserverAction.class, RdapNameserverAction.PATH);
.withDatastore() }
.build();
@Rule
public final InjectRule inject = new InjectRule();
private final FakeResponse response = new FakeResponse();
private final FakeClock clock = new FakeClock(DateTime.parse("2000-01-01TZ"));
private final AuthenticatedRegistrarAccessor registrarAccessor =
mock(AuthenticatedRegistrarAccessor.class);
private final RdapMetrics rdapMetrics = mock(RdapMetrics.class);
private static final AuthResult AUTH_RESULT =
AuthResult.create(
AuthLevel.USER,
UserAuthInfo.create(new User("rdap.user@user.com", "gmail.com", "12345"), false));
private static final AuthResult AUTH_RESULT_ADMIN =
AuthResult.create(
AuthLevel.USER,
UserAuthInfo.create(new User("rdap.user@google.com", "gmail.com", "12345"), true));
@Before @Before
public void setUp() { public void setUp() {
inject.setStaticField(Ofy.class, "clock", clock);
// normal // normal
createTld("lol"); createTld("lol");
makeAndPersistHostResource( makeAndPersistHostResource(
@ -111,43 +75,6 @@ public class RdapNameserverActionTest {
makeAndPersistHostResource("ns1.domain.external", "9.10.11.12", clock.nowUtc().minusYears(1)); makeAndPersistHostResource("ns1.domain.external", "9.10.11.12", clock.nowUtc().minusYears(1));
} }
private RdapNameserverAction newRdapNameserverAction(
String input, Optional<String> desiredRegistrar, Optional<Boolean> includeDeleted) {
return newRdapNameserverAction(input, desiredRegistrar, includeDeleted, AUTH_RESULT);
}
private RdapNameserverAction newRdapNameserverAction(
String input,
Optional<String> desiredRegistrar,
Optional<Boolean> includeDeleted,
AuthResult authResult) {
RdapNameserverAction action = new RdapNameserverAction();
action.clock = clock;
action.requestMethod = Action.Method.GET;
action.fullServletPath = "https://example.tld/rdap";
action.response = response;
action.requestPath = RdapNameserverAction.PATH.concat(input);
action.registrarParam = desiredRegistrar;
action.includeDeletedParam = includeDeleted;
action.formatOutputParam = Optional.empty();
action.rdapJsonFormatter = RdapTestHelper.getTestRdapJsonFormatter();
action.rdapWhoisServer = null;
action.authResult = authResult;
action.registrarAccessor = registrarAccessor;
action.rdapMetrics = rdapMetrics;
return action;
}
private Object generateActualJson(String name) {
return generateActualJson(name, Optional.empty(), Optional.empty());
}
private Object generateActualJson(
String name, Optional<String> desiredRegistrar, Optional<Boolean> includeDeleted) {
newRdapNameserverAction(name, desiredRegistrar, includeDeleted).run();
return JSONValue.parse(response.getPayload());
}
private Object generateExpectedJson( private Object generateExpectedJson(
String name, String name,
@Nullable ImmutableMap<String, String> otherSubstitutions, @Nullable ImmutableMap<String, String> otherSubstitutions,
@ -328,9 +255,8 @@ public class RdapNameserverActionTest {
@Test @Test
public void testNameserver_found_sameRegistrarRequested() { public void testNameserver_found_sameRegistrarRequested() {
assertThat( action.registrarParam = Optional.of("TheRegistrar");
generateActualJson( assertThat(generateActualJson("ns1.cat.lol"))
"ns1.cat.lol", Optional.of("TheRegistrar"), Optional.empty()))
.isEqualTo( .isEqualTo(
generateExpectedJsonWithTopLevelEntries( generateExpectedJsonWithTopLevelEntries(
"ns1.cat.lol", "ns1.cat.lol",
@ -345,7 +271,9 @@ public class RdapNameserverActionTest {
@Test @Test
public void testNameserver_notFound_differentRegistrarRequested() { public void testNameserver_notFound_differentRegistrarRequested() {
generateActualJson("ns1.cat.lol", Optional.of("otherregistrar"), Optional.of(false)); action.registrarParam = Optional.of("otherregistrar");
action.includeDeletedParam = Optional.of(false);
generateActualJson("ns1.cat.lol");
assertThat(response.getStatus()).isEqualTo(404); assertThat(response.getStatus()).isEqualTo(404);
} }
@ -357,29 +285,32 @@ public class RdapNameserverActionTest {
@Test @Test
public void testDeletedNameserver_notFound_includeDeletedSetFalse() { public void testDeletedNameserver_notFound_includeDeletedSetFalse() {
generateActualJson("nsdeleted.cat.lol", Optional.empty(), Optional.of(false)); action.includeDeletedParam = Optional.of(false);
generateActualJson("nsdeleted.cat.lol");
assertThat(response.getStatus()).isEqualTo(404); assertThat(response.getStatus()).isEqualTo(404);
} }
@Test @Test
public void testDeletedNameserver_notFound_notLoggedIn() { public void testDeletedNameserver_notFound_notLoggedIn() {
when(registrarAccessor.guessClientId()).thenThrow(new ForbiddenException("blah")); logout();
generateActualJson("nsdeleted.cat.lol", Optional.empty(), Optional.of(true)); action.includeDeletedParam = Optional.of(true);
generateActualJson("nsdeleted.cat.lol");
assertThat(response.getStatus()).isEqualTo(404); assertThat(response.getStatus()).isEqualTo(404);
} }
@Test @Test
public void testDeletedNameserver_notFound_loggedInAsDifferentRegistrar() { public void testDeletedNameserver_notFound_loggedInAsDifferentRegistrar() {
when(registrarAccessor.guessClientId()).thenReturn("otherregistrar"); login("otherregistrar");
generateActualJson("nsdeleted.cat.lol", Optional.empty(), Optional.of(true)); action.includeDeletedParam = Optional.of(true);
generateActualJson("nsdeleted.cat.lol");
assertThat(response.getStatus()).isEqualTo(404); assertThat(response.getStatus()).isEqualTo(404);
} }
@Test @Test
public void testDeletedNameserver_found_loggedInAsCorrectRegistrar() { public void testDeletedNameserver_found_loggedInAsCorrectRegistrar() {
when(registrarAccessor.guessClientId()).thenReturn("TheRegistrar"); login("TheRegistrar");
assertThat( action.includeDeletedParam = Optional.of(true);
generateActualJson("nsdeleted.cat.lol", Optional.empty(), Optional.of(true))) assertThat(generateActualJson("nsdeleted.cat.lol"))
.isEqualTo( .isEqualTo(
generateExpectedJsonWithTopLevelEntries( generateExpectedJsonWithTopLevelEntries(
"nsdeleted.cat.lol", "nsdeleted.cat.lol",
@ -394,14 +325,9 @@ public class RdapNameserverActionTest {
@Test @Test
public void testDeletedNameserver_found_loggedInAsAdmin() { public void testDeletedNameserver_found_loggedInAsAdmin() {
when(registrarAccessor.guessClientId()).thenReturn("irrelevant"); loginAsAdmin();
newRdapNameserverAction( action.includeDeletedParam = Optional.of(true);
"nsdeleted.cat.lol", assertThat(generateActualJson("nsdeleted.cat.lol"))
Optional.empty(),
Optional.of(true),
AUTH_RESULT_ADMIN)
.run();
assertThat(JSONValue.parse(response.getPayload()))
.isEqualTo( .isEqualTo(
generateExpectedJsonWithTopLevelEntries( generateExpectedJsonWithTopLevelEntries(
"nsdeleted.cat.lol", "nsdeleted.cat.lol",
@ -416,9 +342,10 @@ public class RdapNameserverActionTest {
@Test @Test
public void testDeletedNameserver_found_sameRegistrarRequested() { public void testDeletedNameserver_found_sameRegistrarRequested() {
when(registrarAccessor.guessClientId()).thenReturn("TheRegistrar"); login("TheRegistrar");
assertThat( action.registrarParam = Optional.of("TheRegistrar");
generateActualJson("nsdeleted.cat.lol", Optional.of("TheRegistrar"), Optional.of(true))) action.includeDeletedParam = Optional.of(true);
assertThat(generateActualJson("nsdeleted.cat.lol"))
.isEqualTo( .isEqualTo(
generateExpectedJsonWithTopLevelEntries( generateExpectedJsonWithTopLevelEntries(
"nsdeleted.cat.lol", "nsdeleted.cat.lol",
@ -433,8 +360,10 @@ public class RdapNameserverActionTest {
@Test @Test
public void testDeletedNameserver_notFound_differentRegistrarRequested() { public void testDeletedNameserver_notFound_differentRegistrarRequested() {
when(registrarAccessor.guessClientId()).thenReturn("TheRegistrar"); login("TheRegistrar");
generateActualJson("ns1.cat.lol", Optional.of("otherregistrar"), Optional.of(false)); action.registrarParam = Optional.of("otherregistrar");
action.includeDeletedParam = Optional.of(false);
generateActualJson("ns1.cat.lol");
assertThat(response.getStatus()).isEqualTo(404); assertThat(response.getStatus()).isEqualTo(404);
} }

View file

@ -15,8 +15,6 @@
package google.registry.rdap; package google.registry.rdap;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static google.registry.rdap.RdapAuthorization.Role.ADMINISTRATOR;
import static google.registry.rdap.RdapAuthorization.Role.REGISTRAR;
import static google.registry.request.Action.Method.GET; import static google.registry.request.Action.Method.GET;
import static google.registry.testing.DatastoreHelper.createTld; import static google.registry.testing.DatastoreHelper.createTld;
import static google.registry.testing.DatastoreHelper.persistResource; import static google.registry.testing.DatastoreHelper.persistResource;
@ -29,10 +27,7 @@ import static google.registry.testing.FullFieldsTestEntityHelper.makeHostResourc
import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrar; import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrar;
import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrarContacts; import static google.registry.testing.FullFieldsTestEntityHelper.makeRegistrarContacts;
import static google.registry.testing.TestDataHelper.loadFile; import static google.registry.testing.TestDataHelper.loadFile;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import com.google.appengine.api.users.User;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableListMultimap; import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
@ -40,58 +35,31 @@ import com.google.common.collect.ImmutableSet;
import com.googlecode.objectify.Key; import com.googlecode.objectify.Key;
import google.registry.model.domain.DomainResource; import google.registry.model.domain.DomainResource;
import google.registry.model.host.HostResource; import google.registry.model.host.HostResource;
import google.registry.model.ofy.Ofy;
import google.registry.model.registrar.Registrar; import google.registry.model.registrar.Registrar;
import google.registry.rdap.RdapMetrics.EndpointType; import google.registry.rdap.RdapMetrics.EndpointType;
import google.registry.rdap.RdapMetrics.SearchType; import google.registry.rdap.RdapMetrics.SearchType;
import google.registry.rdap.RdapMetrics.WildcardType; import google.registry.rdap.RdapMetrics.WildcardType;
import google.registry.rdap.RdapSearchResults.IncompletenessWarningType; import google.registry.rdap.RdapSearchResults.IncompletenessWarningType;
import google.registry.request.Action;
import google.registry.request.auth.AuthLevel;
import google.registry.request.auth.AuthResult;
import google.registry.request.auth.UserAuthInfo;
import google.registry.testing.AppEngineRule;
import google.registry.testing.FakeClock;
import google.registry.testing.FakeResponse; import google.registry.testing.FakeResponse;
import google.registry.testing.InjectRule;
import google.registry.ui.server.registrar.AuthenticatedRegistrarAccessor;
import java.net.URLDecoder; import java.net.URLDecoder;
import java.util.Optional; import java.util.Optional;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.joda.time.DateTime;
import org.json.simple.JSONArray; import org.json.simple.JSONArray;
import org.json.simple.JSONObject; import org.json.simple.JSONObject;
import org.json.simple.JSONValue; import org.json.simple.JSONValue;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.junit.runners.JUnit4; import org.junit.runners.JUnit4;
/** Unit tests for {@link RdapNameserverSearchAction}. */ /** Unit tests for {@link RdapNameserverSearchAction}. */
@RunWith(JUnit4.class) @RunWith(JUnit4.class)
public class RdapNameserverSearchActionTest extends RdapSearchActionTestCase { public class RdapNameserverSearchActionTest
extends RdapSearchActionTestCase<RdapNameserverSearchAction> {
@Rule public final AppEngineRule appEngine = AppEngineRule.builder().withDatastore().build();
@Rule public final InjectRule inject = new InjectRule();
private FakeResponse response = new FakeResponse();
private final FakeClock clock = new FakeClock(DateTime.parse("2000-01-01T00:00:00Z"));
private final AuthenticatedRegistrarAccessor registrarAccessor =
mock(AuthenticatedRegistrarAccessor.class);
private final RdapNameserverSearchAction action = new RdapNameserverSearchAction();
private static final AuthResult AUTH_RESULT =
AuthResult.create(
AuthLevel.USER,
UserAuthInfo.create(new User("rdap.user@user.com", "gmail.com", "12345"), false));
private static final AuthResult AUTH_RESULT_ADMIN =
AuthResult.create(
AuthLevel.USER,
UserAuthInfo.create(new User("rdap.user@google.com", "gmail.com", "12345"), true));
public RdapNameserverSearchActionTest() {
super(RdapNameserverSearchAction.class, RdapNameserverSearchAction.PATH);
}
private DomainResource domainCatLol; private DomainResource domainCatLol;
private HostResource hostNs1CatLol; private HostResource hostNs1CatLol;
@ -184,36 +152,8 @@ public class RdapNameserverSearchActionTest extends RdapSearchActionTestCase {
persistResource( persistResource(
hostNs2CatLol.asBuilder().setSuperordinateDomain(Key.create(domainCatLol)).build()); hostNs2CatLol.asBuilder().setSuperordinateDomain(Key.create(domainCatLol)).build());
inject.setStaticField(Ofy.class, "clock", clock);
action.clock = clock;
action.fullServletPath = "https://example.tld/rdap";
action.requestUrl = "https://example.tld/rdap/nameservers";
action.requestPath = RdapNameserverSearchAction.PATH;
action.parameterMap = ImmutableListMultimap.of();
action.requestMethod = Action.Method.GET;
action.response = response;
action.rdapJsonFormatter = RdapTestHelper.getTestRdapJsonFormatter();
action.rdapResultSetMaxSize = 4;
action.rdapWhoisServer = null;
action.ipParam = Optional.empty(); action.ipParam = Optional.empty();
action.nameParam = Optional.empty(); action.nameParam = Optional.empty();
action.registrarParam = Optional.empty();
action.includeDeletedParam = Optional.empty();
action.formatOutputParam = Optional.empty();
action.authResult = AUTH_RESULT;
action.registrarAccessor = registrarAccessor;
action.rdapMetrics = rdapMetrics;
action.cursorTokenParam = Optional.empty();
}
private void login(String clientId) {
when(registrarAccessor.guessClientId()).thenReturn(clientId);
metricRole = REGISTRAR;
}
private void loginAsAdmin() {
when(registrarAccessor.guessClientId()).thenReturn("irrelevant");
action.authResult = AUTH_RESULT_ADMIN;
metricRole = ADMINISTRATOR;
} }
private Object generateExpectedJson(String expectedOutputFile) { private Object generateExpectedJson(String expectedOutputFile) {

View file

@ -14,26 +14,39 @@
package google.registry.rdap; package google.registry.rdap;
import static google.registry.rdap.RdapAuthorization.Role.PUBLIC;
import static javax.servlet.http.HttpServletResponse.SC_OK; import static javax.servlet.http.HttpServletResponse.SC_OK;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import com.google.common.collect.ImmutableListMultimap;
import google.registry.rdap.RdapMetrics.EndpointType; import google.registry.rdap.RdapMetrics.EndpointType;
import google.registry.rdap.RdapMetrics.SearchType; import google.registry.rdap.RdapMetrics.SearchType;
import google.registry.rdap.RdapMetrics.WildcardType; import google.registry.rdap.RdapMetrics.WildcardType;
import google.registry.rdap.RdapSearchResults.IncompletenessWarningType; import google.registry.rdap.RdapSearchResults.IncompletenessWarningType;
import google.registry.request.Action; import google.registry.request.Action;
import java.util.Optional; import java.util.Optional;
import org.junit.Before;
public class RdapSearchActionTestCase { /** Common unit test code for actions inheriting {@link RdapSearchActionBase}. */
public class RdapSearchActionTestCase<A extends RdapSearchActionBase>
extends RdapActionBaseTestCase<A> {
protected RdapSearchActionTestCase(Class<A> rdapActionClass, String path) {
super(rdapActionClass, path);
}
RdapAuthorization.Role metricRole = PUBLIC;
SearchType metricSearchType = SearchType.NONE; SearchType metricSearchType = SearchType.NONE;
WildcardType metricWildcardType = WildcardType.INVALID; WildcardType metricWildcardType = WildcardType.INVALID;
int metricPrefixLength = 0; int metricPrefixLength = 0;
int metricStatusCode = SC_OK; int metricStatusCode = SC_OK;
final RdapMetrics rdapMetrics = mock(RdapMetrics.class);
@Before
public void initRdapSearchActionTestCase() {
action.parameterMap = ImmutableListMultimap.of();
action.cursorTokenParam = Optional.empty();
action.rdapResultSetMaxSize = 4;
action.requestUrl = "https://example.tld" + actionPath;
action.requestPath = actionPath;
}
void rememberWildcardType(String queryString) { void rememberWildcardType(String queryString) {
try { try {

View file

@ -5,9 +5,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/%NAME%", "value" : "https://example.tld/rdap/entity/%NAME%",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/%NAME%", "href": "https://example.tld/rdap/entity/%NAME%",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -5,9 +5,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/%NAME%", "value" : "https://example.tld/rdap/entity/%NAME%",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/%NAME%", "href": "https://example.tld/rdap/entity/%NAME%",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -5,9 +5,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/%NAME%", "value" : "https://example.tld/rdap/entity/%NAME%",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/%NAME%", "href": "https://example.tld/rdap/entity/%NAME%",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -5,9 +5,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/%NAME%", "value" : "https://example.tld/rdap/entity/%NAME%",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/%NAME%", "href": "https://example.tld/rdap/entity/%NAME%",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -5,9 +5,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/%NAME%", "value" : "https://example.tld/rdap/entity/%NAME%",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/%NAME%", "href": "https://example.tld/rdap/entity/%NAME%",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -8,10 +8,10 @@
"handle": "%HANDLE%", "handle": "%HANDLE%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%NAME%", "href": "https://example.tld/rdap/domain/%NAME%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%NAME%" "value": "https://example.tld/rdap/domain/%NAME%"
} }
], ],
"events": [ "events": [
@ -42,10 +42,10 @@
"handle": "%NAMESERVER1ROID%", "handle": "%NAMESERVER1ROID%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/nameserver/%NAMESERVER1NAME%", "href": "https://example.tld/rdap/nameserver/%NAMESERVER1NAME%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/nameserver/%NAMESERVER1NAME%" "value": "https://example.tld/rdap/nameserver/%NAMESERVER1NAME%"
} }
], ],
"ldhName": "%NAMESERVER1NAME%", "ldhName": "%NAMESERVER1NAME%",
@ -74,10 +74,10 @@
"roles": [ "registrar" ], "roles": [ "registrar" ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/1", "href": "https://example.tld/rdap/entity/1",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/1" "value": "https://example.tld/rdap/entity/1"
} }
], ],
"vcardArray" : [ "vcardArray" : [
@ -129,10 +129,10 @@
"handle": "%NAMESERVER2ROID%", "handle": "%NAMESERVER2ROID%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/nameserver/%NAMESERVER2NAME%", "href": "https://example.tld/rdap/nameserver/%NAMESERVER2NAME%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/nameserver/%NAMESERVER2NAME%" "value": "https://example.tld/rdap/nameserver/%NAMESERVER2NAME%"
} }
], ],
"ldhName": "%NAMESERVER2NAME%", "ldhName": "%NAMESERVER2NAME%",
@ -161,10 +161,10 @@
"roles": [ "registrar" ], "roles": [ "registrar" ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/1", "href": "https://example.tld/rdap/entity/1",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/1" "value": "https://example.tld/rdap/entity/1"
} }
], ],
"vcardArray" : [ "vcardArray" : [
@ -222,10 +222,10 @@
], ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/%CONTACT1ROID%", "href": "https://example.tld/rdap/entity/%CONTACT1ROID%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/%CONTACT1ROID%" "value": "https://example.tld/rdap/entity/%CONTACT1ROID%"
} }
], ],
"events": [ "events": [
@ -315,10 +315,10 @@
], ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/%CONTACT2ROID%", "href": "https://example.tld/rdap/entity/%CONTACT2ROID%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/%CONTACT2ROID%" "value": "https://example.tld/rdap/entity/%CONTACT2ROID%"
} }
], ],
"events": [ "events": [
@ -408,10 +408,10 @@
], ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/%CONTACT3ROID%", "href": "https://example.tld/rdap/entity/%CONTACT3ROID%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/%CONTACT3ROID%" "value": "https://example.tld/rdap/entity/%CONTACT3ROID%"
} }
], ],
"events": [ "events": [
@ -497,10 +497,10 @@
"roles": [ "registrar" ], "roles": [ "registrar" ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/1", "href": "https://example.tld/rdap/entity/1",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/1" "value": "https://example.tld/rdap/entity/1"
} }
], ],
"vcardArray" : [ "vcardArray" : [

View file

@ -8,10 +8,10 @@
"handle": "%HANDLE%", "handle": "%HANDLE%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%NAME%", "href": "https://example.tld/rdap/domain/%NAME%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%NAME%" "value": "https://example.tld/rdap/domain/%NAME%"
} }
], ],
"events": [ "events": [
@ -42,10 +42,10 @@
"handle": "%NAMESERVER1ROID%", "handle": "%NAMESERVER1ROID%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/nameserver/%NAMESERVER1NAME%", "href": "https://example.tld/rdap/nameserver/%NAMESERVER1NAME%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/nameserver/%NAMESERVER1NAME%" "value": "https://example.tld/rdap/nameserver/%NAMESERVER1NAME%"
} }
], ],
"ldhName": "%NAMESERVER1NAME%", "ldhName": "%NAMESERVER1NAME%",
@ -74,10 +74,10 @@
"roles": [ "registrar" ], "roles": [ "registrar" ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/1", "href": "https://example.tld/rdap/entity/1",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/1" "value": "https://example.tld/rdap/entity/1"
} }
], ],
"vcardArray" : [ "vcardArray" : [
@ -129,10 +129,10 @@
"handle": "%NAMESERVER2ROID%", "handle": "%NAMESERVER2ROID%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/nameserver/%NAMESERVER2NAME%", "href": "https://example.tld/rdap/nameserver/%NAMESERVER2NAME%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/nameserver/%NAMESERVER2NAME%" "value": "https://example.tld/rdap/nameserver/%NAMESERVER2NAME%"
} }
], ],
"ldhName": "%NAMESERVER2NAME%", "ldhName": "%NAMESERVER2NAME%",
@ -161,10 +161,10 @@
"roles": [ "registrar" ], "roles": [ "registrar" ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/1", "href": "https://example.tld/rdap/entity/1",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/1" "value": "https://example.tld/rdap/entity/1"
} }
], ],
"vcardArray" : [ "vcardArray" : [
@ -222,10 +222,10 @@
], ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/%CONTACT1ROID%", "href": "https://example.tld/rdap/entity/%CONTACT1ROID%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/%CONTACT1ROID%" "value": "https://example.tld/rdap/entity/%CONTACT1ROID%"
} }
], ],
"events": [ "events": [
@ -315,10 +315,10 @@
], ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/%CONTACT2ROID%", "href": "https://example.tld/rdap/entity/%CONTACT2ROID%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/%CONTACT2ROID%" "value": "https://example.tld/rdap/entity/%CONTACT2ROID%"
} }
], ],
"events": [ "events": [
@ -408,10 +408,10 @@
], ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/%CONTACT3ROID%", "href": "https://example.tld/rdap/entity/%CONTACT3ROID%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/%CONTACT3ROID%" "value": "https://example.tld/rdap/entity/%CONTACT3ROID%"
} }
], ],
"events": [ "events": [
@ -497,10 +497,10 @@
"roles": [ "registrar" ], "roles": [ "registrar" ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/1", "href": "https://example.tld/rdap/entity/1",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/1" "value": "https://example.tld/rdap/entity/1"
} }
], ],
"vcardArray" : [ "vcardArray" : [

View file

@ -9,10 +9,10 @@
"handle": "%HANDLE%", "handle": "%HANDLE%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%NAME%", "href": "https://example.tld/rdap/domain/%NAME%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%NAME%" "value": "https://example.tld/rdap/domain/%NAME%"
} }
], ],
"events": [ "events": [
@ -48,10 +48,10 @@
"handle": "%NAMESERVER1ROID%", "handle": "%NAMESERVER1ROID%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/nameserver/%NAMESERVER1NAME%", "href": "https://example.tld/rdap/nameserver/%NAMESERVER1NAME%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/nameserver/%NAMESERVER1NAME%" "value": "https://example.tld/rdap/nameserver/%NAMESERVER1NAME%"
} }
], ],
"ldhName": "%NAMESERVER1NAME%", "ldhName": "%NAMESERVER1NAME%",
@ -80,10 +80,10 @@
"roles": [ "registrar" ], "roles": [ "registrar" ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/1", "href": "https://example.tld/rdap/entity/1",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/1" "value": "https://example.tld/rdap/entity/1"
} }
], ],
"vcardArray" : [ "vcardArray" : [
@ -134,10 +134,10 @@
"handle": "%NAMESERVER2ROID%", "handle": "%NAMESERVER2ROID%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/nameserver/%NAMESERVER2NAME%", "href": "https://example.tld/rdap/nameserver/%NAMESERVER2NAME%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/nameserver/%NAMESERVER2NAME%" "value": "https://example.tld/rdap/nameserver/%NAMESERVER2NAME%"
} }
], ],
"ldhName": "%NAMESERVER2NAME%", "ldhName": "%NAMESERVER2NAME%",
@ -166,10 +166,10 @@
"roles": [ "registrar" ], "roles": [ "registrar" ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/1", "href": "https://example.tld/rdap/entity/1",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/1" "value": "https://example.tld/rdap/entity/1"
} }
], ],
"vcardArray" : [ "vcardArray" : [
@ -226,10 +226,10 @@
], ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/%CONTACT1ROID%", "href": "https://example.tld/rdap/entity/%CONTACT1ROID%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/%CONTACT1ROID%" "value": "https://example.tld/rdap/entity/%CONTACT1ROID%"
} }
], ],
"events": [ "events": [
@ -318,10 +318,10 @@
], ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/%CONTACT2ROID%", "href": "https://example.tld/rdap/entity/%CONTACT2ROID%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/%CONTACT2ROID%" "value": "https://example.tld/rdap/entity/%CONTACT2ROID%"
} }
], ],
"events": [ "events": [
@ -410,10 +410,10 @@
], ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/%CONTACT3ROID%", "href": "https://example.tld/rdap/entity/%CONTACT3ROID%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/%CONTACT3ROID%" "value": "https://example.tld/rdap/entity/%CONTACT3ROID%"
} }
], ],
"events": [ "events": [
@ -499,10 +499,10 @@
"roles": [ "registrar" ], "roles": [ "registrar" ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/1", "href": "https://example.tld/rdap/entity/1",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/1" "value": "https://example.tld/rdap/entity/1"
} }
], ],
"vcardArray" : [ "vcardArray" : [

View file

@ -10,10 +10,10 @@
], ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%NAME%", "href": "https://example.tld/rdap/domain/%NAME%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%NAME%" "value": "https://example.tld/rdap/domain/%NAME%"
} }
], ],
"events": [ "events": [
@ -44,10 +44,10 @@
"handle": "%NAMESERVER1ROID%", "handle": "%NAMESERVER1ROID%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/nameserver/%NAMESERVER1NAME%", "href": "https://example.tld/rdap/nameserver/%NAMESERVER1NAME%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/nameserver/%NAMESERVER1NAME%" "value": "https://example.tld/rdap/nameserver/%NAMESERVER1NAME%"
} }
], ],
"ldhName": "%NAMESERVER1NAME%", "ldhName": "%NAMESERVER1NAME%",
@ -76,10 +76,10 @@
"roles": [ "registrar" ], "roles": [ "registrar" ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/1", "href": "https://example.tld/rdap/entity/1",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/1" "value": "https://example.tld/rdap/entity/1"
} }
], ],
"vcardArray" : [ "vcardArray" : [
@ -131,10 +131,10 @@
"handle": "%NAMESERVER2ROID%", "handle": "%NAMESERVER2ROID%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/nameserver/%NAMESERVER2NAME%", "href": "https://example.tld/rdap/nameserver/%NAMESERVER2NAME%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/nameserver/%NAMESERVER2NAME%" "value": "https://example.tld/rdap/nameserver/%NAMESERVER2NAME%"
} }
], ],
"ldhName": "%NAMESERVER2NAME%", "ldhName": "%NAMESERVER2NAME%",
@ -163,10 +163,10 @@
"roles": [ "registrar" ], "roles": [ "registrar" ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/1", "href": "https://example.tld/rdap/entity/1",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/1" "value": "https://example.tld/rdap/entity/1"
} }
], ],
"vcardArray" : [ "vcardArray" : [
@ -220,9 +220,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/1", "value" : "https://example.tld/rdap/entity/1",
"rel" : "self", "rel" : "self",
"href" : "https://example.com/rdap/entity/1", "href" : "https://example.tld/rdap/entity/1",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -10,10 +10,10 @@
], ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%NAME%", "href": "https://example.tld/rdap/domain/%NAME%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%NAME%" "value": "https://example.tld/rdap/domain/%NAME%"
} }
], ],
"events": [ "events": [
@ -44,10 +44,10 @@
"handle": "%NAMESERVER1ROID%", "handle": "%NAMESERVER1ROID%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/nameserver/%NAMESERVER1NAME%", "href": "https://example.tld/rdap/nameserver/%NAMESERVER1NAME%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/nameserver/%NAMESERVER1NAME%" "value": "https://example.tld/rdap/nameserver/%NAMESERVER1NAME%"
} }
], ],
"ldhName": "%NAMESERVER1NAME%", "ldhName": "%NAMESERVER1NAME%",
@ -76,10 +76,10 @@
"roles": [ "registrar" ], "roles": [ "registrar" ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/1", "href": "https://example.tld/rdap/entity/1",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/1" "value": "https://example.tld/rdap/entity/1"
} }
], ],
"vcardArray" : [ "vcardArray" : [
@ -131,10 +131,10 @@
"handle": "%NAMESERVER2ROID%", "handle": "%NAMESERVER2ROID%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/nameserver/%NAMESERVER2NAME%", "href": "https://example.tld/rdap/nameserver/%NAMESERVER2NAME%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/nameserver/%NAMESERVER2NAME%" "value": "https://example.tld/rdap/nameserver/%NAMESERVER2NAME%"
} }
], ],
"ldhName": "%NAMESERVER2NAME%", "ldhName": "%NAMESERVER2NAME%",
@ -163,10 +163,10 @@
"roles": [ "registrar" ], "roles": [ "registrar" ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/1", "href": "https://example.tld/rdap/entity/1",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/1" "value": "https://example.tld/rdap/entity/1"
} }
], ],
"vcardArray" : [ "vcardArray" : [
@ -220,9 +220,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/1", "value" : "https://example.tld/rdap/entity/1",
"rel" : "self", "rel" : "self",
"href" : "https://example.com/rdap/entity/1", "href" : "https://example.tld/rdap/entity/1",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -9,10 +9,10 @@
"handle": "%HANDLE%", "handle": "%HANDLE%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%PUNYCODENAME%", "href": "https://example.tld/rdap/domain/%PUNYCODENAME%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%PUNYCODENAME%" "value": "https://example.tld/rdap/domain/%PUNYCODENAME%"
} }
], ],
"events": [ "events": [
@ -44,11 +44,11 @@
"links": [ "links": [
{ {
"href": "href":
"https://example.com/rdap/nameserver/%NAMESERVER1PUNYCODENAME%", "https://example.tld/rdap/nameserver/%NAMESERVER1PUNYCODENAME%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "value":
"https://example.com/rdap/nameserver/%NAMESERVER1PUNYCODENAME%" "https://example.tld/rdap/nameserver/%NAMESERVER1PUNYCODENAME%"
} }
], ],
"ldhName": "%NAMESERVER1PUNYCODENAME%", "ldhName": "%NAMESERVER1PUNYCODENAME%",
@ -77,10 +77,10 @@
"roles": [ "registrar" ], "roles": [ "registrar" ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/1", "href": "https://example.tld/rdap/entity/1",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/1" "value": "https://example.tld/rdap/entity/1"
} }
], ],
"vcardArray" : [ "vcardArray" : [
@ -133,11 +133,11 @@
"links": [ "links": [
{ {
"href": "href":
"https://example.com/rdap/nameserver/%NAMESERVER2PUNYCODENAME%", "https://example.tld/rdap/nameserver/%NAMESERVER2PUNYCODENAME%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "value":
"https://example.com/rdap/nameserver/%NAMESERVER2PUNYCODENAME%" "https://example.tld/rdap/nameserver/%NAMESERVER2PUNYCODENAME%"
} }
], ],
"ldhName": "%NAMESERVER2PUNYCODENAME%", "ldhName": "%NAMESERVER2PUNYCODENAME%",
@ -166,10 +166,10 @@
"roles": [ "registrar" ], "roles": [ "registrar" ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/1", "href": "https://example.tld/rdap/entity/1",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/1" "value": "https://example.tld/rdap/entity/1"
} }
], ],
"vcardArray" : [ "vcardArray" : [
@ -227,10 +227,10 @@
], ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/%CONTACT1ROID%", "href": "https://example.tld/rdap/entity/%CONTACT1ROID%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/%CONTACT1ROID%" "value": "https://example.tld/rdap/entity/%CONTACT1ROID%"
} }
], ],
"events": [ "events": [
@ -320,10 +320,10 @@
], ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/%CONTACT2ROID%", "href": "https://example.tld/rdap/entity/%CONTACT2ROID%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/%CONTACT2ROID%" "value": "https://example.tld/rdap/entity/%CONTACT2ROID%"
} }
], ],
"events": [ "events": [
@ -413,10 +413,10 @@
], ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/%CONTACT3ROID%", "href": "https://example.tld/rdap/entity/%CONTACT3ROID%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/%CONTACT3ROID%" "value": "https://example.tld/rdap/entity/%CONTACT3ROID%"
} }
], ],
"events": [ "events": [
@ -502,10 +502,10 @@
"roles": [ "registrar" ], "roles": [ "registrar" ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/1", "href": "https://example.tld/rdap/entity/1",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/1" "value": "https://example.tld/rdap/entity/1"
} }
], ],
"vcardArray" : [ "vcardArray" : [

View file

@ -11,10 +11,10 @@
], ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%PUNYCODENAME%", "href": "https://example.tld/rdap/domain/%PUNYCODENAME%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%PUNYCODENAME%" "value": "https://example.tld/rdap/domain/%PUNYCODENAME%"
} }
], ],
"events": [ "events": [
@ -45,10 +45,10 @@
"handle": "%NAMESERVER1ROID%", "handle": "%NAMESERVER1ROID%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/nameserver/%NAMESERVER1PUNYCODENAME%", "href": "https://example.tld/rdap/nameserver/%NAMESERVER1PUNYCODENAME%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/nameserver/%NAMESERVER1PUNYCODENAME%" "value": "https://example.tld/rdap/nameserver/%NAMESERVER1PUNYCODENAME%"
} }
], ],
"ldhName": "%NAMESERVER1PUNYCODENAME%", "ldhName": "%NAMESERVER1PUNYCODENAME%",
@ -78,10 +78,10 @@
"roles": [ "registrar" ], "roles": [ "registrar" ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/1", "href": "https://example.tld/rdap/entity/1",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/1" "value": "https://example.tld/rdap/entity/1"
} }
], ],
"vcardArray" : [ "vcardArray" : [
@ -133,10 +133,10 @@
"handle": "%NAMESERVER2ROID%", "handle": "%NAMESERVER2ROID%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/nameserver/%NAMESERVER2PUNYCODENAME%", "href": "https://example.tld/rdap/nameserver/%NAMESERVER2PUNYCODENAME%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/nameserver/%NAMESERVER2PUNYCODENAME%" "value": "https://example.tld/rdap/nameserver/%NAMESERVER2PUNYCODENAME%"
} }
], ],
"ldhName": "%NAMESERVER2PUNYCODENAME%", "ldhName": "%NAMESERVER2PUNYCODENAME%",
@ -166,10 +166,10 @@
"roles": [ "registrar" ], "roles": [ "registrar" ],
"links": [ "links": [
{ {
"href": "https://example.com/rdap/entity/1", "href": "https://example.tld/rdap/entity/1",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/entity/1" "value": "https://example.tld/rdap/entity/1"
} }
], ],
"vcardArray" : [ "vcardArray" : [
@ -223,9 +223,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/1", "value" : "https://example.tld/rdap/entity/1",
"rel" : "self", "rel" : "self",
"href" : "https://example.com/rdap/entity/1", "href" : "https://example.tld/rdap/entity/1",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -10,10 +10,10 @@
"handle": "%DOMAINHANDLE1%", "handle": "%DOMAINHANDLE1%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%DOMAINNAME1%", "href": "https://example.tld/rdap/domain/%DOMAINNAME1%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%DOMAINNAME1%" "value": "https://example.tld/rdap/domain/%DOMAINNAME1%"
} }
], ],
"ldhName": "%DOMAINNAME1%", "ldhName": "%DOMAINNAME1%",
@ -38,10 +38,10 @@
"handle": "%DOMAINHANDLE2%", "handle": "%DOMAINHANDLE2%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%DOMAINNAME2%", "href": "https://example.tld/rdap/domain/%DOMAINNAME2%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%DOMAINNAME2%" "value": "https://example.tld/rdap/domain/%DOMAINNAME2%"
} }
], ],
"ldhName": "%DOMAINNAME2%", "ldhName": "%DOMAINNAME2%",
@ -66,10 +66,10 @@
"handle": "%DOMAINHANDLE3%", "handle": "%DOMAINHANDLE3%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%DOMAINNAME3%", "href": "https://example.tld/rdap/domain/%DOMAINNAME3%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%DOMAINNAME3%" "value": "https://example.tld/rdap/domain/%DOMAINNAME3%"
} }
], ],
"ldhName": "%DOMAINNAME3%", "ldhName": "%DOMAINNAME3%",
@ -94,10 +94,10 @@
"handle": "%DOMAINHANDLE4%", "handle": "%DOMAINHANDLE4%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%DOMAINNAME4%", "href": "https://example.tld/rdap/domain/%DOMAINNAME4%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%DOMAINNAME4%" "value": "https://example.tld/rdap/domain/%DOMAINNAME4%"
} }
], ],
"ldhName": "%DOMAINNAME4%", "ldhName": "%DOMAINNAME4%",
@ -134,7 +134,7 @@
{ {
"type" : "application/rdap+json", "type" : "application/rdap+json",
"rel" : "next", "rel" : "next",
"href" : "https://example.com/rdap/domains?%NEXT_QUERY%" "href" : "https://example.tld/rdap/domains?%NEXT_QUERY%"
} }
] ]
}, },
@ -156,7 +156,7 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.tld/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.tld/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"

View file

@ -10,10 +10,10 @@
"handle": "%DOMAINHANDLE1%", "handle": "%DOMAINHANDLE1%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%DOMAINNAME1%", "href": "https://example.tld/rdap/domain/%DOMAINNAME1%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%DOMAINNAME1%" "value": "https://example.tld/rdap/domain/%DOMAINNAME1%"
} }
], ],
"ldhName": "%DOMAINNAME1%", "ldhName": "%DOMAINNAME1%",
@ -38,10 +38,10 @@
"handle": "%DOMAINHANDLE2%", "handle": "%DOMAINHANDLE2%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%DOMAINNAME2%", "href": "https://example.tld/rdap/domain/%DOMAINNAME2%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%DOMAINNAME2%" "value": "https://example.tld/rdap/domain/%DOMAINNAME2%"
} }
], ],
"ldhName": "%DOMAINNAME2%", "ldhName": "%DOMAINNAME2%",
@ -66,10 +66,10 @@
"handle": "%DOMAINHANDLE3%", "handle": "%DOMAINHANDLE3%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%DOMAINNAME3%", "href": "https://example.tld/rdap/domain/%DOMAINNAME3%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%DOMAINNAME3%" "value": "https://example.tld/rdap/domain/%DOMAINNAME3%"
} }
], ],
"ldhName": "%DOMAINNAME3%", "ldhName": "%DOMAINNAME3%",
@ -94,10 +94,10 @@
"handle": "%DOMAINHANDLE4%", "handle": "%DOMAINHANDLE4%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%DOMAINPUNYCODENAME4%", "href": "https://example.tld/rdap/domain/%DOMAINPUNYCODENAME4%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%DOMAINPUNYCODENAME4%" "value": "https://example.tld/rdap/domain/%DOMAINPUNYCODENAME4%"
} }
], ],
"ldhName": "%DOMAINPUNYCODENAME4%", "ldhName": "%DOMAINPUNYCODENAME4%",
@ -137,7 +137,7 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.tld/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.tld/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"

View file

@ -10,10 +10,10 @@
"handle": "%DOMAINHANDLE1%", "handle": "%DOMAINHANDLE1%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%DOMAINPUNYCODENAME1%", "href": "https://example.tld/rdap/domain/%DOMAINPUNYCODENAME1%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%DOMAINPUNYCODENAME1%" "value": "https://example.tld/rdap/domain/%DOMAINPUNYCODENAME1%"
} }
], ],
"ldhName": "%DOMAINPUNYCODENAME1%", "ldhName": "%DOMAINPUNYCODENAME1%",
@ -38,10 +38,10 @@
"handle": "%DOMAINHANDLE2%", "handle": "%DOMAINHANDLE2%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%DOMAINPUNYCODENAME2%", "href": "https://example.tld/rdap/domain/%DOMAINPUNYCODENAME2%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%DOMAINPUNYCODENAME2%" "value": "https://example.tld/rdap/domain/%DOMAINPUNYCODENAME2%"
} }
], ],
"ldhName": "%DOMAINPUNYCODENAME2%", "ldhName": "%DOMAINPUNYCODENAME2%",
@ -66,10 +66,10 @@
"handle": "%DOMAINHANDLE3%", "handle": "%DOMAINHANDLE3%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%DOMAINPUNYCODENAME3%", "href": "https://example.tld/rdap/domain/%DOMAINPUNYCODENAME3%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%DOMAINPUNYCODENAME3%" "value": "https://example.tld/rdap/domain/%DOMAINPUNYCODENAME3%"
} }
], ],
"ldhName": "%DOMAINPUNYCODENAME3%", "ldhName": "%DOMAINPUNYCODENAME3%",
@ -94,10 +94,10 @@
"handle": "%DOMAINHANDLE4%", "handle": "%DOMAINHANDLE4%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%DOMAINPUNYCODENAME4%", "href": "https://example.tld/rdap/domain/%DOMAINPUNYCODENAME4%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%DOMAINPUNYCODENAME4%" "value": "https://example.tld/rdap/domain/%DOMAINPUNYCODENAME4%"
} }
], ],
"ldhName": "%DOMAINPUNYCODENAME4%", "ldhName": "%DOMAINPUNYCODENAME4%",
@ -135,7 +135,7 @@
{ {
"type" : "application/rdap+json", "type" : "application/rdap+json",
"rel" : "next", "rel" : "next",
"href" : "https://example.com/rdap/domains?%NEXT_QUERY%" "href" : "https://example.tld/rdap/domains?%NEXT_QUERY%"
} }
] ]
}, },
@ -157,7 +157,7 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.tld/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.tld/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"

View file

@ -10,10 +10,10 @@
"handle": "%DOMAINHANDLE1%", "handle": "%DOMAINHANDLE1%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%DOMAINNAME1%", "href": "https://example.tld/rdap/domain/%DOMAINNAME1%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%DOMAINNAME1%" "value": "https://example.tld/rdap/domain/%DOMAINNAME1%"
} }
], ],
"ldhName": "%DOMAINNAME1%", "ldhName": "%DOMAINNAME1%",
@ -38,10 +38,10 @@
"handle": "%DOMAINHANDLE2%", "handle": "%DOMAINHANDLE2%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%DOMAINNAME2%", "href": "https://example.tld/rdap/domain/%DOMAINNAME2%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%DOMAINNAME2%" "value": "https://example.tld/rdap/domain/%DOMAINNAME2%"
} }
], ],
"ldhName": "%DOMAINNAME2%", "ldhName": "%DOMAINNAME2%",
@ -80,7 +80,7 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.tld/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.tld/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"

View file

@ -7,8 +7,8 @@
[ [
{ {
"rel":"self", "rel":"self",
"href":"https://example.com/rdap/domain/%DOMAINNAME1%", "href":"https://example.tld/rdap/domain/%DOMAINNAME1%",
"value":"https://example.com/rdap/domain/%DOMAINNAME1%", "value":"https://example.tld/rdap/domain/%DOMAINNAME1%",
"type":"application/rdap+json" "type":"application/rdap+json"
} }
], ],
@ -39,8 +39,8 @@
[ [
{ {
"rel":"self", "rel":"self",
"href":"https://example.com/rdap/domain/%DOMAINNAME2%", "href":"https://example.tld/rdap/domain/%DOMAINNAME2%",
"value":"https://example.com/rdap/domain/%DOMAINNAME2%", "value":"https://example.tld/rdap/domain/%DOMAINNAME2%",
"type":"application/rdap+json" "type":"application/rdap+json"
} }
], ],
@ -71,8 +71,8 @@
[ [
{ {
"rel":"self", "rel":"self",
"href":"https://example.com/rdap/domain/%DOMAINNAME3%", "href":"https://example.tld/rdap/domain/%DOMAINNAME3%",
"value":"https://example.com/rdap/domain/%DOMAINNAME3%", "value":"https://example.tld/rdap/domain/%DOMAINNAME3%",
"type":"application/rdap+json" "type":"application/rdap+json"
} }
], ],
@ -127,7 +127,7 @@
{ {
"rel":"alternate", "rel":"alternate",
"href":"https://www.registry.tld/about/rdap/tos.html", "href":"https://www.registry.tld/about/rdap/tos.html",
"value":"https://example.com/rdap/help/tos", "value":"https://example.tld/rdap/help/tos",
"type":"text/html" "type":"text/html"
} }
], ],

View file

@ -20,10 +20,10 @@
"handle":"%DOMAINHANDLE1%", "handle":"%DOMAINHANDLE1%",
"links":[ "links":[
{ {
"value":"https://example.com/rdap/domain/%DOMAINNAME1%", "value":"https://example.tld/rdap/domain/%DOMAINNAME1%",
"type":"application/rdap+json", "type":"application/rdap+json",
"rel":"self", "rel":"self",
"href":"https://example.com/rdap/domain/%DOMAINNAME1%" "href":"https://example.tld/rdap/domain/%DOMAINNAME1%"
} }
], ],
"objectClassName":"domain" "objectClassName":"domain"
@ -48,10 +48,10 @@
"handle":"%DOMAINHANDLE2%", "handle":"%DOMAINHANDLE2%",
"links":[ "links":[
{ {
"value":"https://example.com/rdap/domain/%DOMAINNAME2%", "value":"https://example.tld/rdap/domain/%DOMAINNAME2%",
"type":"application/rdap+json", "type":"application/rdap+json",
"rel":"self", "rel":"self",
"href":"https://example.com/rdap/domain/%DOMAINNAME2%" "href":"https://example.tld/rdap/domain/%DOMAINNAME2%"
} }
], ],
"objectClassName":"domain" "objectClassName":"domain"
@ -81,7 +81,7 @@
], ],
"links":[ "links":[
{ {
"value":"https://example.com/rdap/help/tos", "value":"https://example.tld/rdap/help/tos",
"type":"text/html", "type":"text/html",
"rel":"alternate", "rel":"alternate",
"href":"https://www.registry.tld/about/rdap/tos.html" "href":"https://www.registry.tld/about/rdap/tos.html"

View file

@ -8,9 +8,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/2-ROID", "value" : "https://example.tld/rdap/entity/2-ROID",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/2-ROID", "href": "https://example.tld/rdap/entity/2-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -55,9 +55,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/2-Registrar", "value" : "https://example.tld/rdap/entity/2-Registrar",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/2-Registrar", "href": "https://example.tld/rdap/entity/2-Registrar",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -122,7 +122,7 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.tld/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.tld/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"

View file

@ -8,9 +8,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/4-ROID", "value" : "https://example.tld/rdap/entity/4-ROID",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/4-ROID", "href": "https://example.tld/rdap/entity/4-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -54,9 +54,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/2-ROID", "value" : "https://example.tld/rdap/entity/2-ROID",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/2-ROID", "href": "https://example.tld/rdap/entity/2-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -115,7 +115,7 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.tld/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.tld/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"

View file

@ -8,9 +8,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/0001-ROID", "value" : "https://example.tld/rdap/entity/0001-ROID",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/0001-ROID", "href": "https://example.tld/rdap/entity/0001-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -54,9 +54,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/0002-ROID", "value" : "https://example.tld/rdap/entity/0002-ROID",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/0002-ROID", "href": "https://example.tld/rdap/entity/0002-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -100,9 +100,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/0003-ROID", "value" : "https://example.tld/rdap/entity/0003-ROID",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/0003-ROID", "href": "https://example.tld/rdap/entity/0003-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -146,9 +146,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/0004-ROID", "value" : "https://example.tld/rdap/entity/0004-ROID",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/0004-ROID", "href": "https://example.tld/rdap/entity/0004-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -207,7 +207,7 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.tld/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.tld/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"

View file

@ -10,10 +10,10 @@
"handle": "%DOMAINHANDLE1%", "handle": "%DOMAINHANDLE1%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%DOMAINNAME1%", "href": "https://example.tld/rdap/domain/%DOMAINNAME1%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%DOMAINNAME1%" "value": "https://example.tld/rdap/domain/%DOMAINNAME1%"
} }
], ],
"ldhName": "%DOMAINNAME1%", "ldhName": "%DOMAINNAME1%",
@ -38,10 +38,10 @@
"handle": "%DOMAINHANDLE2%", "handle": "%DOMAINHANDLE2%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%DOMAINNAME2%", "href": "https://example.tld/rdap/domain/%DOMAINNAME2%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%DOMAINNAME2%" "value": "https://example.tld/rdap/domain/%DOMAINNAME2%"
} }
], ],
"ldhName": "%DOMAINNAME2%", "ldhName": "%DOMAINNAME2%",
@ -66,10 +66,10 @@
"handle": "%DOMAINHANDLE3%", "handle": "%DOMAINHANDLE3%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%DOMAINNAME3%", "href": "https://example.tld/rdap/domain/%DOMAINNAME3%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%DOMAINNAME3%" "value": "https://example.tld/rdap/domain/%DOMAINNAME3%"
} }
], ],
"ldhName": "%DOMAINNAME3%", "ldhName": "%DOMAINNAME3%",
@ -94,10 +94,10 @@
"handle": "%DOMAINHANDLE4%", "handle": "%DOMAINHANDLE4%",
"links": [ "links": [
{ {
"href": "https://example.com/rdap/domain/%DOMAINNAME4%", "href": "https://example.tld/rdap/domain/%DOMAINNAME4%",
"type": "application/rdap+json", "type": "application/rdap+json",
"rel": "self", "rel": "self",
"value": "https://example.com/rdap/domain/%DOMAINNAME4%" "value": "https://example.tld/rdap/domain/%DOMAINNAME4%"
} }
], ],
"ldhName": "%DOMAINNAME4%", "ldhName": "%DOMAINNAME4%",
@ -136,7 +136,7 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.tld/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.tld/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"

View file

@ -8,9 +8,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/301", "value" : "https://example.tld/rdap/entity/301",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/301", "href": "https://example.tld/rdap/entity/301",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -61,9 +61,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/302", "value" : "https://example.tld/rdap/entity/302",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/302", "href": "https://example.tld/rdap/entity/302",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -114,9 +114,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/303", "value" : "https://example.tld/rdap/entity/303",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/303", "href": "https://example.tld/rdap/entity/303",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -167,9 +167,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/304", "value" : "https://example.tld/rdap/entity/304",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/304", "href": "https://example.tld/rdap/entity/304",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -235,7 +235,7 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.tld/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.tld/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"

View file

@ -6,9 +6,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/%NAME%", "value" : "https://example.tld/rdap/entity/%NAME%",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/%NAME%", "href": "https://example.tld/rdap/entity/%NAME%",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],

View file

@ -8,9 +8,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/0001-ROID", "value" : "https://example.tld/rdap/entity/0001-ROID",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/0001-ROID", "href": "https://example.tld/rdap/entity/0001-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -54,9 +54,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/0002-ROID", "value" : "https://example.tld/rdap/entity/0002-ROID",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/0002-ROID", "href": "https://example.tld/rdap/entity/0002-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -100,9 +100,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/0003-ROID", "value" : "https://example.tld/rdap/entity/0003-ROID",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/0003-ROID", "href": "https://example.tld/rdap/entity/0003-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -146,9 +146,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/0004-ROID", "value" : "https://example.tld/rdap/entity/0004-ROID",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/0004-ROID", "href": "https://example.tld/rdap/entity/0004-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -203,7 +203,7 @@
[ [
{ {
"type" : "application/rdap+json", "type" : "application/rdap+json",
"href" : "https://example.com/rdap/entities?%NAME%", "href" : "https://example.tld/rdap/entities?%NAME%",
"rel" : "next" "rel" : "next"
} }
], ],
@ -227,7 +227,7 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.tld/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.tld/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"

View file

@ -8,9 +8,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/0001-ROID", "value" : "https://example.tld/rdap/entity/0001-ROID",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/0001-ROID", "href": "https://example.tld/rdap/entity/0001-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -54,9 +54,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/0002-ROID", "value" : "https://example.tld/rdap/entity/0002-ROID",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/0002-ROID", "href": "https://example.tld/rdap/entity/0002-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -100,9 +100,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/0003-ROID", "value" : "https://example.tld/rdap/entity/0003-ROID",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/0003-ROID", "href": "https://example.tld/rdap/entity/0003-ROID",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -146,9 +146,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/301", "value" : "https://example.tld/rdap/entity/301",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/301", "href": "https://example.tld/rdap/entity/301",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -210,7 +210,7 @@
[ [
{ {
"type" : "application/rdap+json", "type" : "application/rdap+json",
"href" : "https://example.com/rdap/entities?%NAME%", "href" : "https://example.tld/rdap/entities?%NAME%",
"rel" : "next" "rel" : "next"
} }
], ],
@ -234,7 +234,7 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.tld/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.tld/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"

View file

@ -8,9 +8,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/301", "value" : "https://example.tld/rdap/entity/301",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/301", "href": "https://example.tld/rdap/entity/301",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -61,9 +61,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/302", "value" : "https://example.tld/rdap/entity/302",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/302", "href": "https://example.tld/rdap/entity/302",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -114,9 +114,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/303", "value" : "https://example.tld/rdap/entity/303",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/303", "href": "https://example.tld/rdap/entity/303",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -167,9 +167,9 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/entity/304", "value" : "https://example.tld/rdap/entity/304",
"rel" : "self", "rel" : "self",
"href": "https://example.com/rdap/entity/304", "href": "https://example.tld/rdap/entity/304",
"type" : "application/rdap+json" "type" : "application/rdap+json"
} }
], ],
@ -231,7 +231,7 @@
[ [
{ {
"type" : "application/rdap+json", "type" : "application/rdap+json",
"href" : "https://example.com/rdap/entities?%NAME%", "href" : "https://example.tld/rdap/entities?%NAME%",
"rel" : "next" "rel" : "next"
} }
], ],
@ -255,7 +255,7 @@
"links" : "links" :
[ [
{ {
"value" : "https://example.com/rdap/help/tos", "value" : "https://example.tld/rdap/help/tos",
"rel" : "alternate", "rel" : "alternate",
"href" : "https://www.registry.tld/about/rdap/tos.html", "href" : "https://www.registry.tld/about/rdap/tos.html",
"type" : "text/html" "type" : "text/html"