Skip to content

Commit

Permalink
Cleaned up tests, using json directly.
Browse files Browse the repository at this point in the history
  • Loading branch information
vteague committed Apr 7, 2024
1 parent 364e054 commit 0aac304
Show file tree
Hide file tree
Showing 3 changed files with 216 additions and 194 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -67,9 +67,9 @@ public GetAssertionsRequest(String contestName, List<String> candidates, BigDeci
* Set the risk limit. Used for deserialization.
* @param riskLimit the risk limit as a BigDecimal.
*/
public void setRiskLimit(BigDecimal riskLimit) {
this.riskLimit = riskLimit;
}
public void setRiskLimit(BigDecimal riskLimit) {
this.riskLimit = riskLimit;
}

/**
* Validates the request to retrieve assertions for the contest, checking that the contest exists
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,6 @@ the raire assertion generation engine (https://github.com/DemocracyDevelopers/ra
import static au.org.democracydevelopers.raireservice.util.StringUtils.containsIgnoreCase;
import static org.junit.jupiter.api.Assertions.assertTrue;

import au.org.democracydevelopers.raireservice.request.GenerateAssertionsRequest;
import com.google.gson.Gson;
import java.util.List;
import java.util.Objects;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
Expand Down Expand Up @@ -63,20 +59,13 @@ the raire assertion generation engine (https://github.com/DemocracyDevelopers/ra
@DirtiesContext(classMode = ClassMode.AFTER_CLASS)
public class GenerateAssertionsAPITests {

private final Gson gson = new Gson();
private final static HttpHeaders httpHeaders = new HttpHeaders();

private final static String baseURL = "http://localhost:";
private final static String generateAssertionsEndpoint = "/raire/generate-assertions";
private final static String ballina = "Ballina Mayoral";
private final static String invalidMixed = "Invalid Mixed Contest";
private final static String validPlurality = "Valid Plurality Contest";

@LocalServerPort
private int port;



@Autowired
private TestRestTemplate restTemplate;

Expand All @@ -97,15 +86,12 @@ void contextLoads() {
public void testTrivialGenerateAssertionsExample() {
String url = "http://localhost:" +port + generateAssertionsEndpoint;

GenerateAssertionsRequest generateAssertions = new GenerateAssertionsRequest(
ballina,
100,
5,
List.of("Alice","Bob")
);
String requestAsJson =
"{\"timeLimitSeconds\":10.0,\"totalAuditableBallots\":100,"
+"\"contestName\":\"Ballina Mayoral\",\"candidates\":[\"Alice\",\"Bob\"]}";

HttpEntity<String> request = new HttpEntity<>(gson.toJson(generateAssertions), httpHeaders);
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class );
HttpEntity<String> request = new HttpEntity<>(requestAsJson, httpHeaders);
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);

assertTrue(response.getStatusCode().is2xxSuccessful());
}
Expand Down Expand Up @@ -143,51 +129,42 @@ public void testGenerateAssertionsBadRequest() {
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);

assertTrue(response.getStatusCode().is4xxClientError());
assertTrue(Objects.requireNonNull(response.getBody()).contains("Bad Request"));
assertTrue(containsIgnoreCase(response.getBody(), "Bad request"));
}


/**
* The generateAssertions endpoint, called with a nonexistent contest, returns a meaningful error.
*/
@Test
public void generateAssertionsWithNonExistentContestIsAnError() {
String url = baseURL + port + generateAssertionsEndpoint;

GenerateAssertionsRequest generateAssertions = new GenerateAssertionsRequest(
"NonExistentContest",
100,
5,
List.of("Alice", "Bob")
);
String requestAsJson =
"{\"timeLimitSeconds\":10.0,\"totalAuditableBallots\":100,"
+"\"contestName\":\"NonExistentContest\",\"candidates\":[\"Alice\",\"Bob\"]}";

HttpEntity<String> request = new HttpEntity<>(gson.toJson(generateAssertions), httpHeaders);
HttpEntity<String> request = new HttpEntity<>(requestAsJson, httpHeaders);
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);

assertTrue(response.getStatusCode().is4xxClientError());
assertTrue(Objects.requireNonNull(response.getBody()).contains("No such contest"));
assertTrue(containsIgnoreCase(response.getBody(), "No such contest"));
}

/**
* The generateAssertions endpoint, called with a valid plurality contest, returns a meaningful error.
*/
@Test
public void generateAssertionsWithPluralityContestIsAnError() {
String url = baseURL + port + generateAssertionsEndpoint;

GenerateAssertionsRequest generateAssertions = new GenerateAssertionsRequest(
validPlurality,
100,
5,
List.of("Alice", "Bob")
);
String requestAsJson =
"{\"timeLimitSeconds\":10.0,\"totalAuditableBallots\":100,"
+"\"contestName\":\"Valid Plurality Contest\",\"candidates\":[\"Alice\",\"Bob\"]}";

HttpEntity<String> request = new HttpEntity<>(gson.toJson(generateAssertions), httpHeaders);
HttpEntity<String> request = new HttpEntity<>(requestAsJson, httpHeaders);
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);

assertTrue(response.getStatusCode().is4xxClientError());
assertTrue(Objects.requireNonNull(response.getBody()).contains("Not all IRV"));
assertTrue(containsIgnoreCase(response.getBody(), "Not all IRV"));
}

Expand All @@ -198,37 +175,65 @@ public void generateAssertionsWithPluralityContestIsAnError() {
public void generateAssertionsWithMixedIRVPluralityContestIsAnError() {
String url = baseURL + port + generateAssertionsEndpoint;

GenerateAssertionsRequest generateAssertions = new GenerateAssertionsRequest(
invalidMixed,
100,
5,
List.of("Alice", "Bob")
);
String requestAsJson =
"{\"timeLimitSeconds\":10.0,\"totalAuditableBallots\":100,"
+"\"contestName\":\"Invalid Mixed Contest\",\"candidates\":[\"Alice\",\"Bob\"]}";

HttpEntity<String> request = new HttpEntity<>(gson.toJson(generateAssertions), httpHeaders);
HttpEntity<String> request = new HttpEntity<>(requestAsJson, httpHeaders);
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);

assertTrue(response.getStatusCode().is4xxClientError());
assertTrue(Objects.requireNonNull(response.getBody()).toLowerCase()
.contains("Not all IRV".toLowerCase()));
assertTrue(containsIgnoreCase(response.getBody(), "Not all IRV"));
}

/**
* The generateAssertions endpoint, called with a missing contest name, returns a meaningful error.
*/
@Test
public void generateAssertionsWithMissingContestNameIsAnError() {
String url = baseURL + port + generateAssertionsEndpoint;

String requestAsJson =
"{\"timeLimitSeconds\":10.0,\"totalAuditableBallots\":100,"
+"\"candidates\":[\"Alice\",\"Bob\"]}";

HttpEntity<String> request = new HttpEntity<>(requestAsJson, httpHeaders);
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);

assertTrue(response.getStatusCode().is4xxClientError());
assertTrue(containsIgnoreCase(response.getBody(), "No contest name"));
}

/**
* The generateAssertions endpoint, called with a null contest name, returns a meaningful error.
*/
@Test
public void generateAssertionsWithNullContestNameIsAnError() {
String url = baseURL + port + generateAssertionsEndpoint;

String requestAsJson =
"{\"timeLimitSeconds\":10.0,\"totalAuditableBallots\":100,"
+"\"contestName\":null,\"candidates\":[\"Alice\",\"Bob\"]}";

HttpEntity<String> request = new HttpEntity<>(requestAsJson, httpHeaders);
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);

assertTrue(response.getStatusCode().is4xxClientError());
assertTrue(containsIgnoreCase(response.getBody(), "No contest name"));
}

/**
* The generateAssertions endpoint, called with an empty contest name, returns a meaningful error.
*/
@Test
public void generateAssertionsWithEmptyContestNameIsAnError() {
String url = baseURL + port + generateAssertionsEndpoint;

GenerateAssertionsRequest generateAssertions = new GenerateAssertionsRequest(
"",
100,
5,
List.of("Alice", "Bob")
);
String requestAsJson =
"{\"timeLimitSeconds\":10.0,\"totalAuditableBallots\":100,"
+"\"contestName\":\"\",\"candidates\":[\"Alice\",\"Bob\"]}";

HttpEntity<String> request = new HttpEntity<>(gson.toJson(generateAssertions), httpHeaders);
HttpEntity<String> request = new HttpEntity<>(requestAsJson, httpHeaders);
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);

assertTrue(response.getStatusCode().is4xxClientError());
Expand All @@ -242,14 +247,11 @@ public void generateAssertionsWithEmptyContestNameIsAnError() {
public void generateAssertionsWithWhitespaceContestNameIsAnError() {
String url = baseURL + port + generateAssertionsEndpoint;

GenerateAssertionsRequest generateAssertions = new GenerateAssertionsRequest(
" ",
100,
5,
List.of("Alice","Bob")
);
String requestAsJson =
"{\"timeLimitSeconds\":10.0,\"totalAuditableBallots\":100,"
+"\"contestName\":\" \",\"candidates\":[\"Alice\",\"Bob\"]}";

HttpEntity<String> request = new HttpEntity<>(gson.toJson(generateAssertions), httpHeaders);
HttpEntity<String> request = new HttpEntity<>(requestAsJson, httpHeaders);
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);

assertTrue(response.getStatusCode().is4xxClientError());
Expand All @@ -263,14 +265,29 @@ public void generateAssertionsWithWhitespaceContestNameIsAnError() {
public void generateAssertionsWithNullCandidateListIsAnError() {
String url = baseURL + port + generateAssertionsEndpoint;

GenerateAssertionsRequest generateAssertions = new GenerateAssertionsRequest(
ballina,
100,
5,
null
);
String requestAsJson =
"{\"timeLimitSeconds\":5.0,\"totalAuditableBallots\":100,"
+"\"candidates\":null,\"contestName\":\"Ballina Mayoral\"}";

HttpEntity<String> request = new HttpEntity<>(gson.toJson(generateAssertions), httpHeaders);
HttpEntity<String> request = new HttpEntity<>(requestAsJson, httpHeaders);
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);

assertTrue(response.getStatusCode().is4xxClientError());
assertTrue(containsIgnoreCase(response.getBody(), "Bad candidate list"));
}

/**
* The generateAssertions endpoint, called with a missing candidate list, returns a meaningful error.
*/
@Test
public void generateAssertionsWithMissingCandidateListIsAnError() {
String url = baseURL + port + generateAssertionsEndpoint;

String requestAsJson =
"{\"timeLimitSeconds\":5.0,\"totalAuditableBallots\":100,"
+"\"contestName\":\"Ballina Mayoral\"}";

HttpEntity<String> request = new HttpEntity<>(requestAsJson, httpHeaders);
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);

assertTrue(response.getStatusCode().is4xxClientError());
Expand All @@ -284,14 +301,11 @@ public void generateAssertionsWithNullCandidateListIsAnError() {
public void generateAssertionsWithEmptyCandidateListIsAnError() {
String url = baseURL + port + generateAssertionsEndpoint;

GenerateAssertionsRequest generateAssertions = new GenerateAssertionsRequest(
ballina,
100,
5,
List.of()
);
String requestAsJson =
"{\"timeLimitSeconds\":5.0,\"totalAuditableBallots\":100,"
+"\"contestName\":\"Ballina Mayoral\",\"candidates\":[]}";

HttpEntity<String> request = new HttpEntity<>(gson.toJson(generateAssertions), httpHeaders);
HttpEntity<String> request = new HttpEntity<>(requestAsJson, httpHeaders);
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);

assertTrue(response.getStatusCode().is4xxClientError());
Expand All @@ -305,14 +319,11 @@ public void generateAssertionsWithEmptyCandidateListIsAnError() {
public void generateAssertionsWithWhiteSpaceCandidateNameIsAnError() {
String url = baseURL + port + generateAssertionsEndpoint;

GenerateAssertionsRequest generateAssertions = new GenerateAssertionsRequest(
ballina,
100,
5,
List.of("Alice", " ")
);
String requestAsJson =
"{\"timeLimitSeconds\":5.0,\"totalAuditableBallots\":100,"
+"\"contestName\":\"Ballina Mayoral\",\"candidates\":[\"Alice\",\" \"]}";

HttpEntity<String> request = new HttpEntity<>(gson.toJson(generateAssertions), httpHeaders);
HttpEntity<String> request = new HttpEntity<>(requestAsJson, httpHeaders);
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);

assertTrue(response.getStatusCode().is4xxClientError());
Expand All @@ -328,7 +339,8 @@ public void generateAssertionsWithNullAuditableBallotsIsAnError() {
String url = baseURL + port + generateAssertionsEndpoint;

String requestAsJson =
"{\"timeLimitSeconds\":10.0,\"contestName\":\"Ballina Mayoral\",\"candidates\":[\"Alice\",\"Bob\"]}";
"{\"timeLimitSeconds\":10.0,\"contestName\":\"Ballina Mayoral\","
+"\"candidates\":[\"Alice\",\"Bob\"]}";

HttpEntity<String> request = new HttpEntity<>(requestAsJson, httpHeaders);
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);
Expand All @@ -344,14 +356,11 @@ public void generateAssertionsWithNullAuditableBallotsIsAnError() {
public void generateAssertionsWithZeroAuditableBallotsIsAnError() {
String url = baseURL + port + generateAssertionsEndpoint;

GenerateAssertionsRequest generateAssertions = new GenerateAssertionsRequest(
ballina,
0,
5,
List.of("Alice", "Bob")
);
String requestAsJson =
"{\"timeLimitSeconds\":10.0,\"totalAuditableBallots\":0,"
+"\"contestName\":\"Ballina Mayoral\",\"candidates\":[\"Alice\",\"Bob\"]}";

HttpEntity<String> request = new HttpEntity<>(gson.toJson(generateAssertions), httpHeaders);
HttpEntity<String> request = new HttpEntity<>(requestAsJson, httpHeaders);
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);

assertTrue(response.getStatusCode().is4xxClientError());
Expand All @@ -365,14 +374,11 @@ public void generateAssertionsWithZeroAuditableBallotsIsAnError() {
public void generateAssertionsWithNegativeAuditableBallotsIsAnError() {
String url = baseURL + port + generateAssertionsEndpoint;

GenerateAssertionsRequest generateAssertions = new GenerateAssertionsRequest(
ballina,
-10,
5,
List.of("Alice", "Bob")
);
String requestAsJson =
"{\"timeLimitSeconds\":10.0,\"totalAuditableBallots\":-10,"
+"\"contestName\":\"Ballina Mayoral\",\"candidates\":[\"Alice\",\"Bob\"]}";

HttpEntity<String> request = new HttpEntity<>(gson.toJson(generateAssertions), httpHeaders);
HttpEntity<String> request = new HttpEntity<>(requestAsJson, httpHeaders);
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);

assertTrue(response.getStatusCode().is4xxClientError());
Expand All @@ -389,7 +395,8 @@ public void generateAssertionsWithNullTimeLimitIsAnError() {
String url = baseURL + port + generateAssertionsEndpoint;

String requestAsJson =
"{\"totalAuditableBallots\":100,\"contestName\":\"Ballina Mayoral\",\"candidates\":[\"Alice\",\"Bob\"]}";
"{\"totalAuditableBallots\":100,\"contestName\":\"Ballina Mayoral\","
+"\"candidates\":[\"Alice\",\"Bob\"]}";

HttpEntity<String> request = new HttpEntity<>(requestAsJson, httpHeaders);
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);
Expand All @@ -405,14 +412,11 @@ public void generateAssertionsWithNullTimeLimitIsAnError() {
public void generateAssertionsWithZeroTimeLimitIsAnError() {
String url = baseURL + port + generateAssertionsEndpoint;

GenerateAssertionsRequest generateAssertions = new GenerateAssertionsRequest(
ballina,
100,
0,
List.of("Alice", "Bob")
);
String requestAsJson =
"{\"timeLimitSeconds\":0.0,\"totalAuditableBallots\":100,"
+"\"contestName\":\"Ballina Mayoral\",\"candidates\":[\"Alice\",\"Bob\"]}";

HttpEntity<String> request = new HttpEntity<>(gson.toJson(generateAssertions), httpHeaders);
HttpEntity<String> request = new HttpEntity<>(requestAsJson, httpHeaders);
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);

assertTrue(response.getStatusCode().is4xxClientError());
Expand All @@ -426,14 +430,11 @@ public void generateAssertionsWithZeroTimeLimitIsAnError() {
public void generateAssertionsWithNegativeTimeLimitIsAnError() {
String url = baseURL + port + generateAssertionsEndpoint;

GenerateAssertionsRequest generateAssertions = new GenerateAssertionsRequest(
ballina,
100,
-5,
List.of("Alice", "Bob")
);
String requestAsJson =
"{\"timeLimitSeconds\":-50.0,\"totalAuditableBallots\":100,"
+"\"contestName\":\"Ballina Mayoral\",\"candidates\":[\"Alice\",\"Bob\"]}";

HttpEntity<String> request = new HttpEntity<>(gson.toJson(generateAssertions), httpHeaders);
HttpEntity<String> request = new HttpEntity<>(requestAsJson, httpHeaders);
ResponseEntity<String> response = restTemplate.postForEntity(url, request, String.class);

assertTrue(response.getStatusCode().is4xxClientError());
Expand Down
Loading

0 comments on commit 0aac304

Please sign in to comment.