/**
* Copyright (c) 2009-2014 Câmara dos Deputados. Todos os direitos reservados.
*
* e-Democracia é um software livre; você pode redistribuí-lo e/ou modificá-lo dentro
* dos termos da Licença Pública Geral Menor GNU como publicada pela Fundação do
* Software Livre (FSF); na versão 2.1 da Licença, ou (na sua opinião) qualquer versão.
*
* Este programa é distribuído na esperança de que possa ser útil, mas SEM NENHUMA GARANTIA;
* sem uma garantia implícita de ADEQUAÇÃO a qualquer MERCADO ou APLICAÇÃO EM PARTICULAR.
* Veja a Licença Pública Geral Menor GNU para maiores detalhes.
*/
package br.gov.camara.edemocracia.portlets.chat.service.impl;
import static junit.framework.Assert.assertEquals;
import static junit.framework.Assert.assertFalse;
import static junit.framework.Assert.assertNotNull;
import static junit.framework.Assert.assertNotSame;
import static junit.framework.Assert.assertNull;
import static junit.framework.Assert.assertTrue;
import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import org.junit.Before;
import org.junit.Test;
import br.gov.camara.edemocracia.portlets.chat.service.UserActivityId;
public class ChatUserActivityManagerTest {
private ChatUserActivityManagerLocalMap manager;
@Before
public void setup() {
manager = new ChatUserActivityManagerLocalMap();
}
@Test
public void activityManagerDeveComecarVazio() {
Collection<UserActivityId> idsInativos = manager.removeInactiveUsers();
assertTrue(idsInativos.isEmpty());
}
@Test
public void testeInclusao() {
final long roomId = 10l;
final UserActivityId idUser = UserActivityId.forNewSpyUser();
assertNull(manager.getLastActivityOfUser(roomId, idUser));
manager.addUser(roomId, idUser);
assertNotNull(manager.getLastActivityOfUser(roomId, idUser));
}
@Test
public void incluirUsuarioJaIncluidoDeveAtualizarSeuTimestamp() throws InterruptedException {
final long roomId = 10l;
final UserActivityId idUser = UserActivityId.forPersistentUser(5);
manager.addUser(roomId, idUser);
Date timestamp1 = manager.getLastActivityOfUser(roomId, idUser);
Thread.sleep(2);
manager.addUser(roomId, idUser);
Date timestamp2 = manager.getLastActivityOfUser(roomId, idUser);
assertNotSame(timestamp1, timestamp2);
}
@Test
public void usuarioDeveFicarInativoDepoisDeDezMinutos() {
final UserActivityId idInactiveUser = UserActivityId.forPersistentUser(1);
final long roomId = 10l;
manager.addUser(roomId, idInactiveUser);
manager.updateUserLastActivity(roomId, idInactiveUser, getTenMinutesAgo());
final UserActivityId idActiveUser = UserActivityId.forNewSpyUser();
manager.addUser(roomId, idActiveUser);
Collection<UserActivityId> inactiveUsers = manager.removeInactiveUsers();
assertEquals(1, inactiveUsers.size());
assertTrue(inactiveUsers.contains(idInactiveUser));
}
@Test
public void atualizacaoDeUsuarioInexistenteDeveSerIgnorada() {
final long roomId = 10l;
final UserActivityId idUser = UserActivityId.forNewSpyUser();
manager.updateUserLastActivity(roomId, idUser);
assertNull(manager.getLastActivityOfUser(roomId, idUser));
}
@Test
public void deveRemoverUsuarioEspecifico() {
final UserActivityId idUser = UserActivityId.forPersistentUser(1);
final long roomId = 10l;
manager.addUser(roomId, idUser);
assertNotNull(manager.getLastActivityOfUser(roomId, idUser));
manager.removeUser(roomId, idUser);
assertNull(manager.getLastActivityOfUser(roomId, idUser));
}
@Test
public void deveRetornarONumeroDeUsuariosNaSala() {
final UserActivityId usuarioDaSala1 = UserActivityId.forPersistentUser(1);
final UserActivityId usuario2DaSala1 = UserActivityId.forPersistentUser(2);
final UserActivityId usuarioDaSala2 = UserActivityId.forPersistentUser(3);
final UserActivityId usuarioEspiandoNaSala1 = UserActivityId.forNewSpyUser();
final long sala1 = 1l;
final long sala2 = 2l;
manager.addUser(sala1, usuarioDaSala1);
manager.addUser(sala1, usuario2DaSala1);
manager.addUser(sala1, usuarioEspiandoNaSala1);
manager.addUser(sala2, usuarioDaSala2);
assertEquals(2, manager.getNumberOfUsersInRoom(sala1));
}
@Test
public void deveRetornarZeroParaSalaInexistente() {
final UserActivityId usuarioDaSala1 = UserActivityId.forPersistentUser(1);
final long sala1 = 1l;
final long salaInexistente = 9999l;
manager.addUser(sala1, usuarioDaSala1);
assertEquals(0, manager.getNumberOfUsersInRoom(salaInexistente));
}
@Test
public void deveRetornarONumeroDeUsuariosEspiando() {
final UserActivityId usuarioEspiandoASala1 = UserActivityId.forNewSpyUser();
final UserActivityId usuario2EspiandoASala1 = UserActivityId.forNewSpyUser();
final UserActivityId usuarioNaSala1 = UserActivityId.forPersistentUser(10);
final UserActivityId usuarioEspiandoASala2 = UserActivityId.forNewSpyUser();
final long sala1 = 1l;
final long sala2 = 2l;
manager.addUser(sala1, usuarioEspiandoASala1);
manager.addUser(sala1, usuario2EspiandoASala1);
manager.addUser(sala2, usuarioEspiandoASala2);
manager.addUser(sala1, usuarioNaSala1);
assertEquals(2, manager.getNumberOfUsersSpyingInRoom(sala1));
}
@Test
public void deveSaberSeUsuarioEstaNaSala() {
final UserActivityId usuarioPresenteNaSala = UserActivityId.forPersistentUser(1);
final UserActivityId usuarioAusenteDaSala = UserActivityId.forPersistentUser(2);
final Long roomId = 10l;
manager.addUser(roomId, usuarioPresenteNaSala);
assertTrue(manager.isUserInRoom(roomId,usuarioPresenteNaSala));
assertFalse(manager.isUserInRoom(roomId, usuarioAusenteDaSala));
}
private Date getTenMinutesAgo() {
Date now = new Date();
Calendar cal = Calendar.getInstance();
cal.setTime(now);
cal.add(Calendar.MINUTE, -10);
return cal.getTime();
}
}