package denominator.clouddns;
import com.squareup.okhttp.mockwebserver.MockResponse;
import org.junit.Rule;
import org.junit.Test;
import java.util.Iterator;
import denominator.ResourceRecordSetApi;
import denominator.model.ResourceRecordSet;
import denominator.model.rdata.AData;
import denominator.model.rdata.SOAData;
import static denominator.assertj.ModelAssertions.assertThat;
import static denominator.clouddns.RackspaceApisTest.domainId;
import static denominator.clouddns.RackspaceApisTest.soaResponse;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNull;
public class CloudDNSResourceRecordSetApiMockTest {
@Rule
public final MockCloudDNSServer server = new MockCloudDNSServer();
String
records =
"{\"records\":[{\"name\":\"www.denominator.io\",\"id\":\"A-9872761\",\"type\":\"A\",\"data\":\"1.2.3.4\",\"ttl\":600000,\"updated\":\"2013-04-13T14:42:00.000+0000\",\"created\":\"2013-04-13T14:42:00.000+0000\"},{\"name\":\"www.denominator.io\",\"id\":\"NS-8703385\",\"type\":\"NS\",\"data\":\"dns1.stabletransit.com\",\"ttl\":600000,\"updated\":\"2013-04-13T14:42:00.000+0000\",\"created\":\"2013-04-13T14:42:00.000+0000\"},{\"name\":\"www.denominator.io\",\"id\":\"NS-8703386\",\"type\":\"NS\",\"data\":\"dns2.stabletransit.com\",\"ttl\":600000,\"updated\":\"2013-04-13T14:42:00.000+0000\",\"created\":\"2013-04-13T14:42:00.000+0000\"}],\"totalEntries\":3}";
String
recordsPage1 =
"{\"records\":[{\"name\":\"www.denominator.io\",\"id\":\"A-9872761\",\"type\":\"A\",\"data\":\"1.2.3.4\",\"ttl\":600000,\"updated\":\"2013-04-13T14:42:00.000+0000\",\"created\":\"2013-04-13T14:42:00.000+0000\"},{\"name\":\"www.denominator.io\",\"id\":\"NS-8703385\",\"type\":\"NS\",\"data\":\"dns1.stabletransit.com\",\"ttl\":600000,\"updated\":\"2013-04-13T14:42:00.000+0000\",\"created\":\"2013-04-13T14:42:00.000+0000\"},{\"name\":\"www.denominator.io\",\"id\":\"NS-8703386\",\"type\":\"NS\",\"data\":\"dns2.stabletransit.com\",\"ttl\":600000,\"updated\":\"2013-04-13T14:42:00.000+0000\",\"created\":\"2013-04-13T14:42:00.000+0000\"}],\"totalEntries\":3,\"links\":[{\"href\":\"URL/v1.0/123123/domains/1234/records?limit=3&offset=3\",\"rel\":\"next\"}]}";
String
recordsPage2 =
"{\"records\":[{\"name\":\"www.denominator.io\",\"id\":\"A-9872761\",\"type\":\"A\",\"data\":\"1.2.3.4\",\"ttl\":600000,\"updated\":\"2013-04-13T14:42:00.000+0000\",\"created\":\"2013-04-13T14:42:00.000+0000\"},{\"name\":\"www.denominator.io\",\"id\":\"NS-8703385\",\"type\":\"NS\",\"data\":\"dns1.stabletransit.com\",\"ttl\":600000,\"updated\":\"2013-04-13T14:42:00.000+0000\",\"created\":\"2013-04-13T14:42:00.000+0000\"},{\"name\":\"www.denominator.io\",\"id\":\"NS-8703386\",\"type\":\"NS\",\"data\":\"dns2.stabletransit.com\",\"ttl\":600000,\"updated\":\"2013-04-13T14:42:00.000+0000\",\"created\":\"2013-04-13T14:42:00.000+0000\"}],\"totalEntries\":3,\"links\":[{\"href\":\"URL/v1.0/123123/domains/1234/records?limit=3&offset=0\",\"rel\":\"previous\"}]}";
String
recordsByName =
"{\"records\":[{\"name\":\"www.denominator.io\",\"id\":\"A-9872761\",\"type\":\"A\",\"data\":\"1.2.3.4\",\"ttl\":600000,\"updated\":\"2013-04-13T14:42:00.000+0000\",\"created\":\"2013-04-13T14:42:00.000+0000\"},{\"name\":\"www.denominator.io\",\"id\":\"NS-8703385\",\"type\":\"NS\",\"data\":\"dns1.stabletransit.com\",\"ttl\":600000,\"updated\":\"2013-04-13T14:42:00.000+0000\",\"created\":\"2013-04-13T14:42:00.000+0000\"},{\"name\":\"www.denominator.io\",\"id\":\"NS-8703386\",\"type\":\"NS\",\"data\":\"dns2.stabletransit.com\",\"ttl\":600000,\"updated\":\"2013-04-13T14:42:00.000+0000\",\"created\":\"2013-04-13T14:42:00.000+0000\"}],\"totalEntries\":3}";
String
recordsByNameAndType =
"{\"records\":[{\"name\":\"www.denominator.io\",\"id\":\"A-9872761\",\"type\":\"A\",\"data\":\"1.2.3.4\",\"ttl\":600000,\"updated\":\"2013-04-13T14:42:00.000+0000\",\"created\":\"2013-04-13T14:42:00.000+0000\"},{\"name\":\"www.denominator.io\",\"id\":\"A-9883329\",\"type\":\"A\",\"data\":\"5.6.7.8\",\"ttl\":600000,\"updated\":\"2013-04-16T22:09:09.000+0000\",\"created\":\"2013-04-16T22:09:09.000+0000\"}]}";
@Test
public void listWhenPresent() throws Exception {
server.enqueueAuthResponse();
server.enqueue(new MockResponse().setBody(records));
ResourceRecordSetApi api = server.connect().api().basicRecordSetsInZone(domainId + "");
Iterator<ResourceRecordSet<?>> records = api.iterator();
while (records.hasNext()) {
assertThat(records.next())
.hasName("www.denominator.io")
.hasTtl(600000);
}
server.assertAuthRequest();
server.assertRequest()
.hasMethod("GET")
.hasPath("/v1.0/123123/domains/1234/records");
}
@Test
public void listWhenAbsent() throws Exception {
server.enqueueAuthResponse();
server.enqueue(new MockResponse().setResponseCode(404).setBody(
"{\"message\":\"Not Found\",\"code\":404,\"details\":\"\"}"));
ResourceRecordSetApi api = server.connect().api().basicRecordSetsInZone(domainId + "");
assertFalse(api.iterator().hasNext());
server.assertAuthRequest();
server.assertRequest()
.hasMethod("GET")
.hasPath("/v1.0/123123/domains/1234/records");
}
@Test
public void listPagesWhenPresent() throws Exception {
server.enqueueAuthResponse();
server.enqueue(new MockResponse().setBody(recordsPage1.replace("URL", server.url())));
server.enqueue(new MockResponse().setBody(recordsPage2.replace("URL", server.url())));
ResourceRecordSetApi api = server.connect().api().basicRecordSetsInZone(domainId + "");
Iterator<ResourceRecordSet<?>> records = api.iterator();
while (records.hasNext()) {
assertThat(records.next())
.hasName("www.denominator.io")
.hasTtl(600000);
}
server.assertAuthRequest();
server.assertRequest()
.hasMethod("GET")
.hasPath("/v1.0/123123/domains/1234/records");
server.assertRequest()
.hasMethod("GET")
.hasPath("/v1.0/123123/domains/1234/records?limit=3&offset=3");
}
@Test
public void iterateByNameWhenPresent() throws Exception {
server.enqueueAuthResponse();
server.enqueue(new MockResponse().setBody(recordsByName));
ResourceRecordSetApi api = server.connect().api().basicRecordSetsInZone(domainId + "");
Iterator<ResourceRecordSet<?>> records = api.iterateByName("www.denominator.io");
while (records.hasNext()) {
assertThat(records.next())
.hasName("www.denominator.io")
.hasTtl(600000);
}
server.assertAuthRequest();
server.assertRequest()
.hasMethod("GET")
.hasPath("/v1.0/123123/domains/1234/records");
}
@Test
public void iterateByNameWhenAbsent() throws Exception {
server.enqueueAuthResponse();
server.enqueue(new MockResponse().setResponseCode(404).setBody(
"{\"message\":\"Not Found\",\"code\":404,\"details\":\"\"}"));
ResourceRecordSetApi api = server.connect().api().basicRecordSetsInZone(domainId + "");
assertFalse(api.iterateByName("www.denominator.io").hasNext());
server.assertAuthRequest();
server.assertRequest()
.hasMethod("GET")
.hasPath("/v1.0/123123/domains/1234/records");
}
@Test
public void getByNameAndTypeWhenPresent() throws Exception {
server.enqueueAuthResponse();
server.enqueue(new MockResponse().setBody(recordsByNameAndType));
ResourceRecordSetApi api = server.connect().api().basicRecordSetsInZone(domainId + "");
assertThat(api.getByNameAndType("www.denominator.io", "A"))
.hasName("www.denominator.io")
.hasType("A")
.hasTtl(600000)
.containsExactlyRecords(AData.create("1.2.3.4"), AData.create("5.6.7.8"));
server.assertAuthRequest();
server.assertRequest()
.hasMethod("GET")
.hasPath("/v1.0/123123/domains/1234/records?name=www.denominator.io&type=A");
}
@Test
public void getByNameAndType_SOA() throws Exception {
server.enqueueAuthResponse();
server.enqueue(new MockResponse().setBody(soaResponse));
ResourceRecordSetApi api = server.connect().api().basicRecordSetsInZone(domainId + "");
assertThat(api.getByNameAndType("denominator.io", "SOA"))
.hasName("denominator.io")
.hasType("SOA")
.hasTtl(3601)
.containsExactlyRecords(SOAData.builder()
.mname("ns.rackspace.com")
.rname("nil@denominator.io")
.serial(1427817447)
.refresh(3601).retry(3601)
.expire(3601).minimum(3601).build());
server.assertAuthRequest();
server.assertRequest()
.hasMethod("GET")
.hasPath("/v1.0/123123/domains/1234/records?name=denominator.io&type=SOA");
}
@Test
public void getByNameAndTypeWhenAbsent() throws Exception {
server.enqueueAuthResponse();
server.enqueue(new MockResponse().setResponseCode(404).setBody(
"{\"message\":\"Not Found\",\"code\":404,\"details\":\"\"}"));
ResourceRecordSetApi api = server.connect().api().basicRecordSetsInZone(domainId + "");
assertNull(api.getByNameAndType("www.denominator.io", "A"));
server.assertAuthRequest();
server.assertRequest()
.hasMethod("GET")
.hasPath("/v1.0/123123/domains/1234/records?name=www.denominator.io&type=A");
}
}