package pl.com.bottega.documentmanagement.acceptance;
import com.google.common.collect.Sets;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.TestPropertySource;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.context.web.WebAppConfiguration;
import org.springframework.transaction.annotation.Transactional;
import pl.com.bottega.documentmanagement.api.DocumentDto;
import pl.com.bottega.documentmanagement.api.DocumentFlowProcess;
import pl.com.bottega.documentmanagement.api.DocumentsCatalog;
import pl.com.bottega.documentmanagement.api.UserManager;
import pl.com.bottega.documentmanagement.domain.Document;
import pl.com.bottega.documentmanagement.domain.DocumentNumber;
import pl.com.bottega.documentmanagement.domain.DocumentStatus;
import pl.com.bottega.documentmanagement.domain.EmployeeId;
import java.util.Date;
import static org.junit.Assert.assertEquals;
import static pl.com.bottega.documentmanagement.utils.Assert.assertDatesEqual;
@RunWith(SpringRunner.class)
@ContextConfiguration({"/application.xml", "/test-context.xml"})
@TestPropertySource({"/jdbc-test.properties", "/hibernate-test.properties"})
@WebAppConfiguration
public class DocumentFlowAcceptanceTest {
@Autowired
private UserManager userManager;
@Autowired
private DocumentFlowProcess documentFlowProcess;
@Autowired
private DocumentsCatalog documentCatalog;
private String anyLogin = "xxx";
private String anyPassword = "xxx";
private Long anyId = 1L;
private EmployeeId anyEmployeeId = new EmployeeId(anyId);
private String anyTitle = "test";
private String anyContent = "test content";
@Before
public void setUp() {
userManager.createAdmin();
}
@Test
@Transactional
public void shouldCreateDocument() {
//given
loginAs("STAFF", "EDITOR");
//when
DocumentNumber nr = documentFlowProcess.create(anyTitle, anyContent);
//then
DocumentDto dto = documentCatalog.get(nr);
assertEquals(anyContent, dto.getContent());
assertEquals(anyTitle, dto.getTitle());
assertEquals(nr.getNumber(), dto.getNumber());
assertDatesEqual(new Date(), dto.getCreatedAt());
}
@Test
@Transactional
public void shouldVerifyDocument() {
// given
loginAs("STAFF", "MANAGER", "EDITOR");
DocumentNumber nr = documentFlowProcess.create(anyTitle, anyContent);
//when
documentFlowProcess.verify(nr);
//then
DocumentDto dto = documentCatalog.get(nr);
assertEquals(DocumentStatus.VERIFIED.name(), dto.getStatus());
}
private void loginAs(String... roles) {
userManager.signup(anyLogin, anyPassword, anyEmployeeId);
userManager.login("admin", "admin");
userManager.updateRoles(anyEmployeeId, Sets.newHashSet(roles));
userManager.login(anyLogin, anyPassword);
}
}