import java.io.IOException;
import java.sql.Timestamp;
+import org.cacert.gigi.GigiApiException;
import org.cacert.gigi.database.GigiPreparedStatement;
-import org.cacert.gigi.testUtils.ManagedTest;
+import org.cacert.gigi.testUtils.BusinessTest;
+import org.cacert.gigi.util.DayDate;
+import org.cacert.gigi.util.Notary;
+import org.junit.Before;
import org.junit.Test;
-public class TestAssurance extends ManagedTest {
+public class TestAssurance extends BusinessTest {
- private final Timestamp yesterday = new Timestamp(System.currentTimeMillis() - 24L * 60 * 60 * 1000L);
+ private final Timestamp yesterday = new Timestamp(System.currentTimeMillis() - DayDate.MILLI_DAY);
- private final Timestamp tomorrow = new Timestamp(System.currentTimeMillis() + 24L * 60 * 60 * 1000L);
+ private final Timestamp tomorrow = new Timestamp(System.currentTimeMillis() + DayDate.MILLI_DAY);
/**
* at least 39 months ago, so is outside the window of
* {@link User#VERIFICATION_MONTHS}
*/
- private final Timestamp min39month = new Timestamp(System.currentTimeMillis() - 24L * 60 * 60 * 39 * 31 * 1000L);
+ private final Timestamp min39month = new Timestamp(System.currentTimeMillis() - DayDate.MILLI_DAY * 39 * 31);
/**
* at least 24 months ago (but less than 39), so is inside the window of
* {@link User#VERIFICATION_MONTHS}
*/
- private final Timestamp min24month = new Timestamp(System.currentTimeMillis() - 24L * 60 * 60 * 24 * 31 * 1000L);
+ private final Timestamp min24month = new Timestamp(System.currentTimeMillis() - DayDate.MILLI_DAY * 24 * 31);
- private final int agentID;
+ private int agentID;
- private final int applicantID;
+ private int agent2ID;
+
+ private int applicantID;
+
+ private int applicantNameID;
+
+ private User applicant;
+
+ private int applicantMultID;
+
+ public TestAssurance() throws GigiApiException {
- public TestAssurance() {
- agentID = createAssuranceUser("a", "b", createUniqueName() + "@example.com", TEST_PASSWORD);
- applicantID = createVerifiedUser("a", "c", createUniqueName() + "@example.com", TEST_PASSWORD);
}
// test for verification in 39 month period
}
}
+ private void enterAssuranceWhen(int agentID, int applicantID, Timestamp when, int points) {
+ try (GigiPreparedStatement ps = new GigiPreparedStatement("INSERT INTO `notary` SET `from`=?, `to`=?, `points`=?, `location`=?, `date`=?, `when`=? ")) {
+ ps.setInt(1, agentID);
+ ps.setInt(2, applicantID);
+ ps.setInt(3, points);
+ ps.setString(4, "test-location");
+ ps.setString(5, "2010-01-01");
+ ps.setTimestamp(6, when);
+ ps.execute();
+ }
+ }
+
private void enterAssuranceDeleted(int agentID, int applicantID, Timestamp deleted) {
try (GigiPreparedStatement ps = new GigiPreparedStatement("INSERT INTO `notary` SET `from`=?, `to`=?, `points`=?, `location`=?, `date`=?, `deleted`=? ")) {
ps.setInt(1, agentID);
}
}
+ @Before
+ public void initTest() throws GigiApiException {
+ agentID = createAssuranceUser("a", "b", createUniqueName() + "@example.com", TEST_PASSWORD);
+ agent2ID = createAssuranceUser("a", "d", createUniqueName() + "@example.com", TEST_PASSWORD);
+ applicantID = createVerifiedUser("a", "c", createUniqueName() + "@example.com", TEST_PASSWORD);
+ applicant = User.getById(applicantID);
+ applicantNameID = User.getById(applicantID).getPreferredName().getId();
+ applicantMultID = createVerifiedUser("a", "e", createUniqueName() + "@example.com", TEST_PASSWORD);
+ }
+
@Test
public void testVerificationYesterday() throws IOException {
- enterAssuranceWhen(agentID, applicantID, yesterday);
- assertTrue(User.isInVerificationLimit(applicantID));
+ enterAssuranceWhen(agentID, applicantNameID, yesterday);
+ assertTrue(applicant.isInVerificationLimit());
}
@Test
public void testApprox24MonthAgo() throws IOException {
- enterAssuranceWhen(agentID, applicantID, min24month);
- assertTrue(User.isInVerificationLimit(applicantID));
+ enterAssuranceWhen(agentID, applicantNameID, min24month);
+ assertTrue(applicant.isInVerificationLimit());
}
@Test
public void testApprox39MonthAgo() throws IOException {
- enterAssuranceWhen(agentID, applicantID, min39month);
- assertFalse(User.isInVerificationLimit(applicantID));
+ enterAssuranceWhen(agentID, applicantNameID, min39month);
+ assertFalse(applicant.isInVerificationLimit());
}
@Test
public void testTomorrowExpired() throws IOException {
- enterAssuranceExpired(agentID, applicantID, tomorrow);
- assertTrue(User.isInVerificationLimit(applicantID));
+ enterAssuranceExpired(agentID, applicantNameID, tomorrow);
+ assertTrue(applicant.isInVerificationLimit());
}
@Test
public void testYesterdayExpired() throws IOException {
- enterAssuranceExpired(agentID, applicantID, yesterday);
- assertFalse(User.isInVerificationLimit(applicantID));
+ enterAssuranceExpired(agentID, applicantNameID, yesterday);
+ assertFalse(applicant.isInVerificationLimit());
}
@Test
public void testNormal() throws IOException {
- enterAssurance(agentID, applicantID);
- assertTrue(User.isInVerificationLimit(applicantID));
+ enterAssurance(agentID, applicantNameID);
+ assertTrue(applicant.isInVerificationLimit());
}
@Test
public void testDeletedYesterday() throws IOException {
- enterAssuranceDeleted(agentID, applicantID, yesterday);
- assertFalse(User.isInVerificationLimit(applicantID));
+ enterAssuranceDeleted(agentID, applicantNameID, yesterday);
+ assertFalse(applicant.isInVerificationLimit());
+ }
+
+ @Test
+ public void testMultipleAssurancePossible() throws IOException {
+ User agent = User.getById(agentID);
+ User applicantMult = User.getById(applicantMultID);
+
+ enterAssuranceWhen(agentID, applicantMult.getPreferredName().getId(), min39month);
+
+ // test that new entry would be possible
+ assertTrue(Notary.checkAssuranceIsPossible(agent, applicantMult.getPreferredName()));
+
+ // enter new entry
+ enterAssuranceWhen(agentID, applicantMult.getPreferredName().getId(), yesterday);
+
+ // test that new entry is not possible
+ assertFalse(Notary.checkAssuranceIsPossible(agent, applicantMult.getPreferredName()));
+
+ }
+
+ @Test
+ public void testMultipleAssurancePointsCalculation() throws IOException {
+
+ User agent = User.getById(agentID);
+ User applicantMult = User.getById(applicantMultID);
+
+ enterAssuranceWhen(agentID, applicantMult.getPreferredName().getId(), min39month);
+ int xPoints = agent.getExperiencePoints();
+
+ // test that VP after first entry
+
+ assertEquals(applicantMult.getAssurancePoints(), 10);
+
+ // enter second entry to check correct calculation with larger points
+ enterAssuranceWhen(agentID, applicantMult.getPreferredName().getId(), min24month, 20);
+ assertEquals(applicantMult.getAssurancePoints(), 20);
+
+ // test correct XP calculation
+ assertEquals(agent.getExperiencePoints(), xPoints);
+
+ // enter third entry to check correct calculation with less points
+ enterAssuranceWhen(agentID, applicantMult.getPreferredName().getId(), yesterday, 15);
+ assertEquals(applicantMult.getAssurancePoints(), 15);
+
+ // test correct XP calculation
+ assertEquals(agent.getExperiencePoints(), xPoints);
+
+ // enter expired entry
+ enterAssuranceExpired(agentID, applicantMult.getPreferredName().getId(), yesterday);
+ assertEquals(applicantMult.getAssurancePoints(), 15);
+
+ // enter deleted entry same agent
+ enterAssuranceDeleted(agentID, applicantMult.getPreferredName().getId(), yesterday);
+ assertEquals(applicantMult.getAssurancePoints(), 15);
+
+ // enter expired entry future
+ enterAssuranceExpired(agentID, applicantMult.getPreferredName().getId(), tomorrow);
+ assertEquals(applicantMult.getAssurancePoints(), 10);
+
+ // test correct XP calculation
+ assertEquals(agent.getExperiencePoints(), xPoints);
+
+ // enter entry from different agent
+ enterAssuranceWhen(agent2ID, applicantMult.getPreferredName().getId(), yesterday);
+ assertEquals(applicantMult.getAssurancePoints(), 20);
+
+ // enter entry for second applicant
+ enterAssuranceWhen(agentID, applicant.getPreferredName().getId(), yesterday);
+
+ assertEquals(agent.getExperiencePoints(), xPoints + User.EXPERIENCE_POINTS);
}
}