package scrum.server;
import ilarkesto.auth.WrongPasswordException;
import ilarkesto.base.PermissionDeniedException;
import ilarkesto.base.Str;
import ilarkesto.base.Utl;
import ilarkesto.base.time.Date;
import ilarkesto.persistence.AEntity;
import ilarkesto.testng.ATest;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import scrum.TestUtil;
import scrum.client.DataTransferObject;
import scrum.client.admin.SystemMessage;
import scrum.server.admin.User;
import scrum.server.collaboration.Comment;
import scrum.server.estimation.RequirementEstimationVote;
import scrum.server.issues.Issue;
import scrum.server.journal.Change;
import scrum.server.project.Project;
import scrum.server.project.Requirement;
import scrum.server.release.Release;
import scrum.server.sprint.Sprint;
public class ScrumServiceImplTest extends ATest {
ScrumWebApplication app;
ScrumServiceImpl service;
WebSession sessionForAdmin;
WebSession session;
GwtConversation conversationForAdmin;
GwtConversation conversation;
User admin;
User duke;
Project project;
@BeforeTest
public void init() {
TestUtil.initialize();
app = TestUtil.getApp();
admin = TestUtil.getAdmin();
duke = TestUtil.getDuke();
service = new ScrumServiceImpl();
service.setWebApplication(app);
app.autowire(service);
session = (WebSession) app.createWebSession(null);
session.setUser(duke);
sessionForAdmin = (WebSession) app.createWebSession(null);
sessionForAdmin.setUser(admin);
project = TestUtil.createProject(duke);
project.addAdmin(admin);
app.getTransactionService().commit();
}
@BeforeMethod
public void initConversations() {
session.setUser(duke);
conversation = (GwtConversation) session.createGwtConversation();
conversation.getNextData().clear();
conversation.setProject(project);
conversationForAdmin = (GwtConversation) sessionForAdmin.createGwtConversation();
conversationForAdmin.getNextData().clear();
}
@AfterMethod
public void commit() {
app.getTransactionService().commit();
}
@Test
public void createExampleProject() {
service.onCreateExampleProject(conversation);
assertConversationWithoutErrors(conversation);
assertEquals(conversation.getNextData().getEntities().size(), 1);
Project project = getEntityByType(conversation, Project.class);
assertStartsWith(project.getLabel(), "Example Project");
assertTrue(project.containsAdmin(duke));
assertTrue(project.containsParticipant(duke));
assertTrue(project.containsProductOwner(duke));
assertTrue(project.containsScrumMaster(duke));
assertTrue(project.containsTeamMember(duke));
app.getProjectDao().deleteEntity(project);
}
@Test
public void search() {
service.onSearch(conversation, "something");
assertConversationWithoutErrors(conversation);
}
@Test(expectedExceptions = PermissionDeniedException.class)
public void updateSystemMessage() {
SystemMessage systemMessage = new SystemMessage();
systemMessage.setText("Alert!");
systemMessage.setActive(true);
service.onUpdateSystemMessage(conversation, systemMessage);
assertConversationWithoutErrors(conversation);
}
@Test
public void updateSystemMessageAdmin() {
SystemMessage systemMessage = new SystemMessage();
systemMessage.setText("Alert!");
systemMessage.setActive(true);
service.onUpdateSystemMessage(conversationForAdmin, systemMessage);
assertConversationWithoutErrors(conversationForAdmin);
}
@Test
public void setSelectedEntitysIds() {
Set<String> ids = Utl.toSet("1", "2");
service.onSetSelectedEntitysIds(conversation, ids);
assertConversationWithoutErrors(conversation);
}
@Test
public void resetPassword() {
service.onResetPassword(conversationForAdmin, duke.getId());
assertConversationWithoutErrors(conversationForAdmin);
}
@Test
public void changePassword() {
duke.setPassword("geheim");
service.onChangePassword(conversation, "geheim", "supergeheim");
}
@Test(expectedExceptions = WrongPasswordException.class)
public void changePasswordFail() {
duke.setPassword("geheim");
service.onChangePassword(conversation, "wrong", "supergeheim");
assertConversationWithoutErrors(conversation);
assertTrue(duke.matchesPassword("supergeheim"));
}
@Test
public void createEntity() {
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("id", UUID.randomUUID().toString());
properties.put("name", "anonymous");
service.onCreateEntity(conversation, "user", properties);
assertConversationWithoutErrors(conversation);
User anonymous = app.getUserDao().getUserByName("anonymous");
assertNotNull(anonymous);
app.getUserDao().deleteEntity(anonymous);
}
@Test
public void deleteEntity() {
User anonymous = app.getUserDao().postUserWithDefaultPassword("daemon");
service.onDeleteEntity(conversationForAdmin, anonymous.getId());
assertConversationWithoutErrors(conversationForAdmin);
assertNull(app.getUserDao().getUserByName("daemon"));
}
@Test
public void changeProperties() {
duke.setEmail("support@kunagi.org");
Map<String, Object> properties = new HashMap<String, Object>();
properties.put("email", "duke@kunagi.org");
service.onChangeProperties(conversation, duke.getId(), properties);
assertConversationWithoutErrors(conversation);
assertEquals(duke.getEmail(), "duke@kunagi.org");
}
@Test
public void selectProject() {
conversation.setProject(null);
service.onSelectProject(conversation, project.getId());
assertConversationWithoutErrors(conversation);
assertSame(conversation.getProject(), project);
assertSame(duke.getCurrentProject(), project);
}
@Test
public void closeProject() {
service.onCloseProject(conversation);
assertConversationWithoutErrors(conversation);
assertNull(conversation.getProject());
}
@Test
public void requestForum() {
app.getSubjectDao().newEntityInstance().setProject(project);
app.getCommentDao().newEntityInstance().setParent(project);
service.onRequestForum(conversation, true);
assertConversationWithoutErrors(conversation);
assertContainsEntities(conversation, project.getSubjects());
assertContainsEntities(conversation, project.getLatestComments());
}
@Test
public void requestImpediments() {
app.getImpedimentDao().postImpediment(project, Date.today(), "Test", false);
service.onRequestImpediments(conversation);
assertConversationWithoutErrors(conversation);
assertContainsEntities(conversation, project.getImpediments());
}
@Test
public void requestRisks() {
app.getRiskDao().postRisk(project, "Test", 1, 1);
service.onRequestRisks(conversation);
assertConversationWithoutErrors(conversation);
assertContainsEntities(conversation, project.getRisks());
}
@Test
public void requestAcceptedIssues() {
Issue spam = app.getIssueDao().postIssue(project, "spam");
Issue bug = app.getIssueDao().postIssue(project, "bug");
bug.setAcceptDate(Date.today());
service.onRequestAcceptedIssues(conversation);
assertConversationWithoutErrors(conversation);
assertContainsEntities(conversation, project.getAcceptedIssues());
assertContainsEntity(conversation, bug);
assertNotContainsEntity(conversation, spam);
}
@Test
public void requestClosedIssues() {
Issue spam = app.getIssueDao().postIssue(project, "spam");
Issue bug = app.getIssueDao().postIssue(project, "bug");
bug.setAcceptDate(Date.today());
bug.setCloseDate(Date.today());
service.onRequestClosedIssues(conversation);
assertConversationWithoutErrors(conversation);
assertContainsEntities(conversation, project.getClosedIssues());
assertContainsEntity(conversation, bug);
assertNotContainsEntity(conversation, spam);
}
@Test
public void requestReleaseIssues() {
Release release = app.getReleaseDao().newEntityInstance();
release.setProject(project);
Issue bug = app.getIssueDao().postIssue(project, "bug");
bug.setAcceptDate(Date.today());
bug.addAffectedRelease(release);
service.onRequestReleaseIssues(conversation, release.getId());
assertConversationWithoutErrors(conversation);
assertContainsEntity(conversation, bug);
}
@Test
public void requestEntity() {
Issue problem = app.getIssueDao().postIssue(project, "problem");
service.onRequestEntity(conversation, problem.getId());
assertConversationWithoutErrors(conversation);
assertContainsEntity(conversation, problem);
}
@Test
public void requestEntityByReference() {
Issue problem = app.getIssueDao().postIssue(project, "problem");
service.onRequestEntityByReference(conversation, problem.getReference());
assertConversationWithoutErrors(conversation);
assertContainsEntity(conversation, problem);
}
@Test
public void requestComments() {
Comment comment = app.getCommentDao().newEntityInstance();
comment.setParent(project);
service.onRequestComments(conversation, project.getId());
assertConversationWithoutErrors(conversation);
assertContainsEntities(conversation, app.getCommentDao().getCommentsByParent(project));
assertContainsEntity(conversation, comment);
}
@Test
public void requestChanges() {
Change change = app.getChangeDao().postChange(project, duke, "dummy", "olddummy", "newdummy");
service.onRequestChanges(conversation, project.getId());
assertConversationWithoutErrors(conversation);
assertContainsEntities(conversation, app.getChangeDao().getChangesByParent(project));
assertContainsEntity(conversation, change);
}
@Test
public void requestRequirementEstimationVotes() {
Requirement requirement = app.getRequirementDao().postRequirement(project, "new feature", 2f);
RequirementEstimationVote vote = app.getRequirementEstimationVoteDao().postVote(requirement, duke);
service.onRequestRequirementEstimationVotes(conversation, requirement.getId());
assertConversationWithoutErrors(conversation);
assertContainsEntities(conversation, requirement.getEstimationVotes());
assertContainsEntity(conversation, vote);
}
@Test
public void activateRequirementEstimationVoting() {
Requirement requirement = app.getRequirementDao().postRequirement(project, "new feature", 2f);
requirement.setWorkEstimationVotingActive(false);
service.onActivateRequirementEstimationVoting(conversation, requirement.getId());
assertConversationWithoutErrors(conversation);
assertTrue(requirement.isWorkEstimationVotingActive());
}
@Test
public void switchToNextSprint() {
Sprint currentSprint = project.getCurrentSprint();
Sprint nextSprint = project.getNextSprint();
service.onSwitchToNextSprint(conversation);
assertConversationWithoutErrors(conversation);
assertNotSame(project.getCurrentSprint(), currentSprint);
assertNotSame(project.getNextSprint(), nextSprint);
assertEquals(project.getCurrentSprint(), nextSprint);
}
// --- helpers ---
private static void assertContainsEntities(GwtConversation conversation, Collection<? extends AEntity> entities) {
DataTransferObject dto = conversation.getNextData();
for (AEntity entity : entities) {
assertContainsEntity(conversation, entity);
}
}
private static void assertContainsEntity(GwtConversation conversation, AEntity entity) {
DataTransferObject dto = conversation.getNextData();
assertTrue(dto.containsEntities());
for (Map properties : dto.getEntities()) {
if (entity.getId().equals(properties.get("id"))) return;
}
fail("Conversation does not contain <" + entity + ">.");
}
private static void assertNotContainsEntity(GwtConversation conversation, AEntity entity) {
DataTransferObject dto = conversation.getNextData();
assertTrue(dto.containsEntities());
for (Map properties : dto.getEntities()) {
if (entity.getId().equals(properties.get("id"))) fail("Conversation does contain <" + entity + ">.");
}
}
private static <E extends AEntity> E getEntityByType(GwtConversation conversation, Class<E> type) {
DataTransferObject dto = conversation.getNextData();
if (!dto.containsEntities()) return null;
for (Map entity : dto.getEntities()) {
if (type.getSimpleName().toLowerCase().equals(entity.get("@type"))) {
String id = (String) entity.get("id");
E e = (E) TestUtil.getApp().getDaoService().getEntityById(id);
return e;
}
}
return null;
}
private static <E extends AEntity> E createEntity(Class<E> type, Map properties) {
E entity;
try {
entity = type.newInstance();
} catch (InstantiationException ex) {
throw new RuntimeException(ex);
} catch (IllegalAccessException ex) {
throw new RuntimeException(ex);
}
entity.updateProperties(properties);
return entity;
}
private static void assertConversationError(GwtConversation conversation, String error) {
List<String> errors = conversation.getNextData().getErrors();
assertTrue(errors != null && errors.contains(error),
"Conversation error not found: <" + error + "> in " + Str.format(errors));
}
private static void assertConversationWithoutErrors(GwtConversation conversation) {
List<String> errors = conversation.getNextData().getErrors();
assertTrue(errors == null || errors.isEmpty(), "Conversation contains errors: " + Str.format(errors));
}
}