package denominator;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized.Parameter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import denominator.model.ResourceRecordSet;
import denominator.model.Zone;
import static denominator.assertj.ModelAssertions.assertThat;
import static org.junit.Assume.assumeTrue;
@RunWith(Live.class)
public class ReadOnlyLiveTest {
@Parameter
public DNSApiManager manager;
@Test
public void supportsDuplicateZoneNames() {
Iterator<Zone> zones = manager.api().zones().iterator();
assumeTrue("No zones to test", zones.hasNext());
Zone zone = zones.next();
if (manager.provider().supportsDuplicateZoneNames()) {
assertThat(zone.id())
.isNotNull()
.isNotEqualTo(zone.name());
}
}
@Test
public void iterateZonesByName() {
Iterator<Zone> zones = manager.api().zones().iterator();
assumeTrue("No zones to test", zones.hasNext());
Zone zone = zones.next();
assertThat(manager.api().zones().iterateByName(zone.name())).contains(zone);
}
@Test
public void zoneTtlIsEqualToSOATtl() {
Iterator<Zone> zones = manager.api().zones().iterator();
assumeTrue("No zones to test", zones.hasNext());
Zone zone = zones.next();
ResourceRecordSet<?>
soa =
manager.api().basicRecordSetsInZone(zone.id()).getByNameAndType(zone.name(), "SOA");
assumeTrue("SOA records aren't exposed", soa != null);
assertThat(zone.ttl())
.overridingErrorMessage("zone %s should have the same ttl as soa %s", zone, soa)
.isEqualTo(soa.ttl());
}
@Test
public void iterateZonesByNameWhenNotFound() {
assertThat(manager.api().zones().iterateByName("yesdenominatornodenominator.com")).isEmpty();
}
@Test
public void iterateRRSets() {
for (Zone zone : manager.api().zones()) {
for (ResourceRecordSet<?> rrs : allApi(zone)) {
assertThat(rrs).isValid();
checkIterateByNameAndTypeConsistent(zone, rrs);
if (rrs.qualifier() != null) {
checkGetByNameTypeAndQualifierConsistent(zone, rrs);
}
}
}
}
@Test
public void iterateRRSetsByName() {
for (Zone zone : manager.api().zones()) {
Iterator<ResourceRecordSet<?>> rrsIterator = allApi(zone).iterator();
if (!rrsIterator.hasNext()) {
continue;
}
ResourceRecordSet<?> rrset = rrsIterator.next();
String name = rrset.name();
List<ResourceRecordSet<?>> withName = new ArrayList<ResourceRecordSet<?>>();
withName.add(rrset);
while (rrsIterator.hasNext()) {
rrset = rrsIterator.next();
if (!name.equalsIgnoreCase(rrset.name())) {
break;
}
withName.add(rrset);
}
Iterator<ResourceRecordSet<?>> fromApi = allApi(zone).iterateByName(name);
assertThat(fromApi).containsAll(withName);
break;
}
}
@Test
public void iterateRRSetsByNameWhenNotFound() {
for (Zone zone : manager.api().zones()) {
assertThat(allApi(zone).iterateByName("ARGHH." + zone.name())).isEmpty();
break;
}
}
@Test
public void iterateRRSetsByNameAndTypeWhenEmpty() {
for (Zone zone : manager.api().zones()) {
assertThat(allApi(zone).iterateByNameAndType("ARGHH." + zone.name(), "TXT")).isEmpty();
break;
}
}
@Test
public void getByNameTypeAndGroupWhenAbsent() {
for (Zone zone : manager.api().zones()) {
assertThat(allApi(zone).getByNameTypeAndQualifier("ARGHH." + zone.name(), "TXT", "Mars"))
.isNull();
break;
}
}
// TODO
private void checkGetByNameTypeAndQualifierConsistent(Zone zone, ResourceRecordSet<?> rrs) {
assertThat(allApi(zone).getByNameTypeAndQualifier(rrs.name(), rrs.type(), rrs.qualifier()))
.describedAs("could not lookup by name, type, and qualifier: " + rrs)
.isEqualTo(rrs);
}
private void checkIterateByNameAndTypeConsistent(Zone zone, ResourceRecordSet<?> rrs) {
assertThat(allApi(zone).iterateByNameAndType(rrs.name(), rrs.type()))
.describedAs(rrs + " not found in list by name and type: " + zone)
.contains(rrs);
}
private AllProfileResourceRecordSetApi allApi(Zone zone) {
return manager.api().recordSetsInZone(zone.id());
}
}