package pl.com.bottega.documentmanagement.api;
import com.google.common.collect.Sets;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import pl.com.bottega.documentmanagement.domain.*;
import pl.com.bottega.documentmanagement.domain.repositories.DocumentRepository;
import pl.com.bottega.documentmanagement.domain.repositories.EmployeeRepository;
import java.util.Set;
import java.util.stream.Collectors;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
/**
* Created by maciuch on 17.08.16.
*/
@RunWith(MockitoJUnitRunner.class)
public class DocumentFlowProcessTest {
private DocumentFlowProcess documentFlowProcess;
@Mock
private DocumentRepository documentRepository;
@Mock
private UserManager userManager;
@Mock
private DocumentNumberGenerator documentNumberGenerator;
@Mock
private EmployeeRepository employeeRepository;
@Mock
private DocumentFactory documentFactory;
private String anyTitle = "xxxx";
private String anyContent = "cccc";
@Mock
private DocumentNumber documentNumber;
@Mock
private Document document;
@Mock
private Employee employee;
@Before
public void setUp() throws Exception {
documentFlowProcess = new DocumentFlowProcess(documentRepository, userManager,
documentFactory, employeeRepository);
}
@Test
public void shouldCreateDocument() {
//given
when(documentFactory.create(anyTitle, anyContent)).thenReturn(document);
when(document.number()).thenReturn(documentNumber);
//when
DocumentNumber nr = documentFlowProcess.create(anyTitle, anyContent);
//then
verify(documentRepository).save(document);
assertEquals(nr, documentNumber);
}
@Test
public void shouldUpdateDocument() {
//given
when(documentRepository.load(documentNumber)).thenReturn(document);
//when
documentFlowProcess.change(documentNumber, anyTitle, anyContent);
//then
verify(document).change(anyTitle, anyContent);
verify(documentRepository).save(document);
}
@Test
public void shouldVerifyDocument() {
//given
when(documentRepository.load(documentNumber)).thenReturn(document);
when(userManager.currentEmployee()).thenReturn(employee);
//when
documentFlowProcess.verify(documentNumber);
//then
verify(document).verify(employee);
verify(documentRepository).save(document);
}
@Test
public void shouldPublishDocument() {
//given
when(documentRepository.load(documentNumber)).thenReturn(document);
Set<EmployeeId> employeeIds = Sets.newHashSet(1L, 2L, 3L).stream().map(EmployeeId::new).collect(Collectors.toSet());
when(employeeRepository.findByEmployeeIds(employeeIds)).thenReturn(Sets.newHashSet());
when(userManager.currentEmployee()).thenReturn(employee);
//when
documentFlowProcess.publish(documentNumber, employeeIds);
//then
verify(document).publish(employee, employeeIds.stream().map(Employee::new).collect(Collectors.toSet()));
}
@Test
public void shouldSendPrintRequestForEmployeesWithoutEmail() {
}
@Test
public void shouldSendPublicationEmailsToEmployeesWithEmail() {
}
@Test
public void shouldArchiveDocument() {
//given
when(documentRepository.load(documentNumber)).thenReturn(document);
when(userManager.currentEmployee()).thenReturn(employee);
//when
documentFlowProcess.archive(documentNumber);
//then
verify(document).delete(employee);
verify(documentRepository).save(document);
}
}