package org.fenixedu.bennu.core.user;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import org.fenixedu.bennu.core.domain.User;
import org.fenixedu.bennu.core.domain.UserLoginPeriod;
import org.fenixedu.bennu.core.domain.UserProfile;
import org.joda.time.LocalDate;
import org.junit.Test;
import org.junit.runner.RunWith;
import pt.ist.fenixframework.test.core.FenixFrameworkRunner;
@RunWith(FenixFrameworkRunner.class)
public class LoginPeriodTest {
@Test
public void testComparator() {
User user1 = newTestUser();
LocalDate longTimeAgo = LocalDate.now().minusDays(30);
LocalDate fifteenDaysAgo = LocalDate.now().minusDays(15);
LocalDate tenDaysAgo = LocalDate.now().minusDays(10);
LocalDate fiveDaysAgo = LocalDate.now().minusDays(5);
user1.openLoginPeriod();
user1.createLoginPeriod(longTimeAgo, fiveDaysAgo);
user1.createLoginPeriod(longTimeAgo, tenDaysAgo);
user1.createLoginPeriod(longTimeAgo, fifteenDaysAgo);
List<UserLoginPeriod> periods = new ArrayList<UserLoginPeriod>(user1.getLoginValiditySet());
periods.sort(Comparator.naturalOrder());
assertEquals(null, periods.get(0).getEndDate());
assertEquals(fiveDaysAgo, periods.get(1).getEndDate());
assertEquals(tenDaysAgo, periods.get(2).getEndDate());
assertEquals(fifteenDaysAgo, periods.get(3).getEndDate());
}
@Test
public void testUsersBornActive() {
User user1 = newTestUser();
assertTrue(!user1.isLoginExpired());
}
@Test
public void testClosePeriodOnNewUser() {
User user1 = newTestUser();
user1.closeLoginPeriod();
assertTrue(user1.isLoginExpired());
assertEquals(1, user1.getLoginValiditySet().size());
}
@Test
public void testOpenPeriodOnNewUser() {
User user1 = newTestUser();
user1.openLoginPeriod();
assertEquals(null, user1.getExpiration().orElse(null));
assertEquals(1, user1.getLoginValiditySet().size());
}
@Test
public void testOpenOnClosed() {
User user1 = newTestUser();
user1.closeLoginPeriod();
user1.openLoginPeriod();
assertEquals(null, user1.getExpiration().orElse(null));
assertEquals(2, user1.getLoginValiditySet().size());
}
@Test
public void testOpenOnOpen() {
User user1 = newTestUser();
user1.openLoginPeriod();
user1.openLoginPeriod();
assertEquals(null, user1.getExpiration().orElse(null));
assertEquals(1, user1.getLoginValiditySet().size());
}
@Test
public void testCloseOnOpen() {
User user1 = newTestUser();
user1.openLoginPeriod();
user1.closeLoginPeriod();
assertTrue(user1.isLoginExpired());
assertEquals(1, user1.getLoginValiditySet().size());
}
@Test
public void testCloseOnClose() {
User user1 = newTestUser();
user1.closeLoginPeriod();
user1.closeLoginPeriod();
assertTrue(user1.isLoginExpired());
assertEquals(1, user1.getLoginValiditySet().size());
}
@Test
public void testCreatePeriod() {
User user1 = newTestUser();
LocalDate in30Days = LocalDate.now().plusDays(30);
user1.createLoginPeriod(LocalDate.now(), in30Days);
assertEquals(in30Days, user1.getExpiration().orElse(null));
}
@Test
public void testClosePeriodInFuture() {
User user1 = newTestUser();
LocalDate in30Days = LocalDate.now().plusDays(30);
user1.closeLoginPeriod(in30Days);
assertEquals(in30Days, user1.getExpiration().orElse(null));
}
@Test
public void testClosePeriodInPast() {
User user1 = newTestUser();
LocalDate thirtyDaysAgo = LocalDate.now().minusDays(30);
user1.closeLoginPeriod(thirtyDaysAgo);
assertEquals(thirtyDaysAgo, user1.getExpiration().orElse(null));
}
private User newTestUser() {
return new User(new UserProfile("x", "y", null, "x@gmail.com", null));
}
}