package denominator.route53; import com.squareup.okhttp.mockwebserver.MockResponse; import org.junit.Rule; import org.junit.Test; import java.util.Arrays; import denominator.ResourceRecordSetApi; import static denominator.assertj.ModelAssertions.assertThat; import static denominator.model.ResourceRecordSets.a; public class Route53ResourceRecordSetApiMockTest { @Rule public MockRoute53Server server = new MockRoute53Server(); @Test public void weightedRecordSetsAreFilteredOut() throws Exception { server.enqueue(new MockResponse().setBody( "<ListResourceRecordSetsResponse><ResourceRecordSets><ResourceRecordSet><Name>www.denominator.io.</Name><Type>CNAME</Type><SetIdentifier>Route53Service:us-east-1:PLATFORMSERVICE:i-7f0aec0d:20130313205017</SetIdentifier><Weight>1</Weight><TTL>0</TTL><ResourceRecords><ResourceRecord><Value>www1.denominator.io.</Value></ResourceRecord></ResourceRecords></ResourceRecordSet><ResourceRecordSet><Name>www.denominator.io.</Name><Type>CNAME</Type><SetIdentifier>Route53Service:us-east-1:PLATFORMSERVICE:i-fbe41089:20130312203418</SetIdentifier><Weight>1</Weight><TTL>0</TTL><ResourceRecords><ResourceRecord><Value>www2.denominator.io.</Value></ResourceRecord></ResourceRecords></ResourceRecordSet></ResourceRecordSets></ListResourceRecordSetsResponse>")); ResourceRecordSetApi api = server.connect().api().basicRecordSetsInZone("Z1PA6795UKMFR9"); assertThat(api.getByNameAndType("www.denominator.io.", "CNAME")).isNull(); server.assertRequest() .hasPath("/2012-12-12/hostedzone/Z1PA6795UKMFR9/rrset?name=www.denominator.io.&type=CNAME"); } @Test public void putFirstRecordCreatesNewRRSet() throws Exception { server.enqueue(new MockResponse().setBody(noRecords)); server.enqueue(new MockResponse().setBody(changeSynced)); ResourceRecordSetApi api = server.connect().api().basicRecordSetsInZone("Z1PA6795UKMFR9"); api.put(a("www.denominator.io.", 3600, "192.0.2.1")); server.assertRequest() .hasPath("/2012-12-12/hostedzone/Z1PA6795UKMFR9/rrset?name=www.denominator.io.&type=A"); server.assertRequest() .hasMethod("POST") .hasPath("/2012-12-12/hostedzone/Z1PA6795UKMFR9/rrset") .hasXMLBody( "<ChangeResourceRecordSetsRequest xmlns=\"https://route53.amazonaws.com/doc/2012-12-12/\"><ChangeBatch><Changes><Change><Action>CREATE</Action><ResourceRecordSet><Name>www.denominator.io.</Name><Type>A</Type><TTL>3600</TTL><ResourceRecords><ResourceRecord><Value>192.0.2.1</Value></ResourceRecord></ResourceRecords></ResourceRecordSet></Change></Changes></ChangeBatch></ChangeResourceRecordSetsRequest>"); } @Test public void putSameRecordNoOp() throws Exception { server.enqueue(new MockResponse().setBody(oneRecord)); ResourceRecordSetApi api = server.connect().api().basicRecordSetsInZone("Z1PA6795UKMFR9"); api.put(a("www.denominator.io.", 3600, "192.0.2.1")); server.assertRequest() .hasPath("/2012-12-12/hostedzone/Z1PA6795UKMFR9/rrset?name=www.denominator.io.&type=A"); } @Test public void putRecreates_ttlChanged() throws Exception { server.enqueue(new MockResponse().setBody(oneRecord)); server.enqueue(new MockResponse().setBody(changeSynced)); ResourceRecordSetApi api = server.connect().api().basicRecordSetsInZone("Z1PA6795UKMFR9"); api.put(a("www.denominator.io.", 10000000, Arrays.asList("192.0.2.1"))); server.assertRequest() .hasPath("/2012-12-12/hostedzone/Z1PA6795UKMFR9/rrset?name=www.denominator.io.&type=A"); server.assertRequest() .hasMethod("POST") .hasPath("/2012-12-12/hostedzone/Z1PA6795UKMFR9/rrset") .hasXMLBody( "<ChangeResourceRecordSetsRequest xmlns=\"https://route53.amazonaws.com/doc/2012-12-12/\"><ChangeBatch><Changes><Change><Action>DELETE</Action><ResourceRecordSet><Name>www.denominator.io.</Name><Type>A</Type><TTL>3600</TTL><ResourceRecords><ResourceRecord><Value>192.0.2.1</Value></ResourceRecord></ResourceRecords></ResourceRecordSet></Change><Change><Action>CREATE</Action><ResourceRecordSet><Name>www.denominator.io.</Name><Type>A</Type><TTL>10000000</TTL><ResourceRecords><ResourceRecord><Value>192.0.2.1</Value></ResourceRecord></ResourceRecords></ResourceRecordSet></Change></Changes></ChangeBatch></ChangeResourceRecordSetsRequest>"); } @Test public void putRecreates_recordAdded() throws Exception { server.enqueue(new MockResponse().setBody(oneRecord)); server.enqueue(new MockResponse().setBody(changeSynced)); ResourceRecordSetApi api = server.connect().api().basicRecordSetsInZone("Z1PA6795UKMFR9"); api.put(a("www.denominator.io.", 3600, Arrays.asList("192.0.2.1", "198.51.100.1"))); server.assertRequest() .hasPath("/2012-12-12/hostedzone/Z1PA6795UKMFR9/rrset?name=www.denominator.io.&type=A"); server.assertRequest() .hasMethod("POST") .hasPath("/2012-12-12/hostedzone/Z1PA6795UKMFR9/rrset") .hasXMLBody( "<ChangeResourceRecordSetsRequest xmlns=\"https://route53.amazonaws.com/doc/2012-12-12/\"><ChangeBatch><Changes><Change><Action>DELETE</Action><ResourceRecordSet><Name>www.denominator.io.</Name><Type>A</Type><TTL>3600</TTL><ResourceRecords><ResourceRecord><Value>192.0.2.1</Value></ResourceRecord></ResourceRecords></ResourceRecordSet></Change><Change><Action>CREATE</Action><ResourceRecordSet><Name>www.denominator.io.</Name><Type>A</Type><TTL>3600</TTL><ResourceRecords><ResourceRecord><Value>192.0.2.1</Value></ResourceRecord><ResourceRecord><Value>198.51.100.1</Value></ResourceRecord></ResourceRecords></ResourceRecordSet></Change></Changes></ChangeBatch></ChangeResourceRecordSetsRequest>"); } @Test public void putOneRecordReplacesRRSet() throws Exception { server.enqueue(new MockResponse().setBody(twoRecords)); server.enqueue(new MockResponse().setBody(changeSynced)); ResourceRecordSetApi api = server.connect().api().basicRecordSetsInZone("Z1PA6795UKMFR9"); api.put(a("www.denominator.io.", 3600, "192.0.2.1")); server.assertRequest() .hasPath("/2012-12-12/hostedzone/Z1PA6795UKMFR9/rrset?name=www.denominator.io.&type=A"); server.assertRequest() .hasMethod("POST") .hasPath("/2012-12-12/hostedzone/Z1PA6795UKMFR9/rrset") .hasXMLBody( "<ChangeResourceRecordSetsRequest xmlns=\"https://route53.amazonaws.com/doc/2012-12-12/\"><ChangeBatch><Changes><Change><Action>DELETE</Action><ResourceRecordSet><Name>www.denominator.io.</Name><Type>A</Type><TTL>3600</TTL><ResourceRecords><ResourceRecord><Value>192.0.2.1</Value></ResourceRecord><ResourceRecord><Value>198.51.100.1</Value></ResourceRecord></ResourceRecords></ResourceRecordSet></Change><Change><Action>CREATE</Action><ResourceRecordSet><Name>www.denominator.io.</Name><Type>A</Type><TTL>3600</TTL><ResourceRecords><ResourceRecord><Value>192.0.2.1</Value></ResourceRecord></ResourceRecords></ResourceRecordSet></Change></Changes></ChangeBatch></ChangeResourceRecordSetsRequest>"); } @Test public void iterateByNameWhenPresent() throws Exception { server.enqueue(new MockResponse().setBody(twoRecords)); ResourceRecordSetApi api = server.connect().api().basicRecordSetsInZone("Z1PA6795UKMFR9"); assertThat(api.iterateByName("www.denominator.io.")) .contains(a("www.denominator.io.", 3600, Arrays.asList("192.0.2.1", "198.51.100.1"))); server.assertRequest() .hasPath("/2012-12-12/hostedzone/Z1PA6795UKMFR9/rrset?name=www.denominator.io."); } @Test public void iterateByNameWhenAbsent() throws Exception { server.enqueue(new MockResponse().setBody(noRecords)); ResourceRecordSetApi api = server.connect().api().basicRecordSetsInZone("Z1PA6795UKMFR9"); assertThat(api.iterateByName("www.denominator.io.")).isEmpty(); server.assertRequest() .hasPath("/2012-12-12/hostedzone/Z1PA6795UKMFR9/rrset?name=www.denominator.io."); } @Test public void getByNameAndTypeWhenPresent() throws Exception { server.enqueue(new MockResponse().setBody(twoRecords)); ResourceRecordSetApi api = server.connect().api().basicRecordSetsInZone("Z1PA6795UKMFR9"); assertThat(api.getByNameAndType("www.denominator.io.", "A")) .isEqualTo(a("www.denominator.io.", 3600, Arrays.asList("192.0.2.1", "198.51.100.1"))); server.assertRequest() .hasPath("/2012-12-12/hostedzone/Z1PA6795UKMFR9/rrset?name=www.denominator.io.&type=A"); } @Test public void getByNameAndTypeWhenAbsent() throws Exception { server.enqueue(new MockResponse().setBody(noRecords)); ResourceRecordSetApi api = server.connect().api().basicRecordSetsInZone("Z1PA6795UKMFR9"); assertThat(api.getByNameAndType("www.denominator.io.", "A")).isNull(); server.assertRequest() .hasPath("/2012-12-12/hostedzone/Z1PA6795UKMFR9/rrset?name=www.denominator.io.&type=A"); } @Test public void deleteRRSet() throws Exception { server.enqueue(new MockResponse().setBody(twoRecords)); server.enqueue(new MockResponse().setBody(changeSynced)); ResourceRecordSetApi api = server.connect().api().basicRecordSetsInZone("Z1PA6795UKMFR9"); api.deleteByNameAndType("www.denominator.io.", "A"); server.assertRequest() .hasPath("/2012-12-12/hostedzone/Z1PA6795UKMFR9/rrset?name=www.denominator.io.&type=A"); server.assertRequest() .hasMethod("POST") .hasPath("/2012-12-12/hostedzone/Z1PA6795UKMFR9/rrset") .hasXMLBody( "<ChangeResourceRecordSetsRequest xmlns=\"https://route53.amazonaws.com/doc/2012-12-12/\"><ChangeBatch><Changes><Change><Action>DELETE</Action><ResourceRecordSet><Name>www.denominator.io.</Name><Type>A</Type><TTL>3600</TTL><ResourceRecords><ResourceRecord><Value>192.0.2.1</Value></ResourceRecord><ResourceRecord><Value>198.51.100.1</Value></ResourceRecord></ResourceRecords></ResourceRecordSet></Change></Changes></ChangeBatch></ChangeResourceRecordSetsRequest>"); } @Test public void deleteAbsentRRSDoesNothing() throws Exception { server.enqueue(new MockResponse().setBody(oneRecord)); ResourceRecordSetApi api = server.connect().api().basicRecordSetsInZone("Z1PA6795UKMFR9"); api.deleteByNameAndType("www1.denominator.io.", "A"); server.assertRequest() .hasPath("/2012-12-12/hostedzone/Z1PA6795UKMFR9/rrset?name=www1.denominator.io.&type=A"); } String noRecords = "<ListResourceRecordSetsResponse><ResourceRecordSets></ResourceRecordSets></ListResourceRecordSetsResponse>"; String changeSynced = "<GetChangeResponse><ChangeInfo><Id>/change/C2682N5HXP0BZ4</Id><Status>INSYNC</Status><SubmittedAt>2011-09-10T01:36:41.958Z</SubmittedAt></ChangeInfo></GetChangeResponse>"; String oneRecord = "<ListResourceRecordSetsResponse><ResourceRecordSets><ResourceRecordSet><Name>www.denominator.io.</Name><Type>A</Type><TTL>3600</TTL><ResourceRecords><ResourceRecord><Value>192.0.2.1</Value></ResourceRecord></ResourceRecords></ResourceRecordSet></ResourceRecordSets></ListResourceRecordSetsResponse>"; String twoRecords = "<ListResourceRecordSetsResponse><ResourceRecordSets><ResourceRecordSet><Name>www.denominator.io.</Name><Type>A</Type><TTL>3600</TTL><ResourceRecords><ResourceRecord><Value>192.0.2.1</Value></ResourceRecord><ResourceRecord><Value>198.51.100.1</Value></ResourceRecord></ResourceRecords></ResourceRecordSet></ResourceRecordSets></ListResourceRecordSetsResponse>"; }