/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
* Copyright (c) 2013, MPL CodeInside http://codeinside.ru
*/
package ru.codeinside.adm.parser;
import junit.framework.Assert;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import ru.codeinside.adm.database.Role;
import java.io.IOException;
import java.io.InputStream;
import java.util.Set;
import static org.mockito.Matchers.anySet;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.anyLong;
import static org.mockito.Mockito.anyString;
import static org.mockito.Mockito.isNotNull;
import static org.mockito.Mockito.isNull;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class EmployeeFixtureParserTest {
private EmployeeFixtureParser.PersistenceCallback callback;
private EmployeeFixtureParser parser;
@Before
public void setUp() throws Exception {
callback = mock(EmployeeFixtureParser.PersistenceCallback.class);
parser = new EmployeeFixtureParser();
}
/**
* Должны распознать одну организацию без пользователей
*/
@Test
public void testParseFixtureSingleOrg() throws IOException {
parser.loadFixtures(getInputStream("/fixtures/single_org.txt"), callback);
// ни одного пользователя не должны найти
verify(callback, never()).onUserComplete(anyString(), anyString(), anyString(), anyString(), anyLong(), anySet(), anySet());
// должны найти только одну организацию
verify(callback, times(1)).onOrganizationComplete(anyString(), anySet(), (Long) isNull());
verify(callback, times(1)).onOrganizationComplete(eq("Оператор Электронного Правительства"), anySet(), (Long) isNull());
}
/**
* Должны распознать иерархию организаций с тремя уровнями
*
* @throws IOException
*/
@Test
public void testParseMultiLevelOrg() throws IOException {
long MFC_ORG_ID = 1L;
when(callback.onOrganizationComplete(eq("Многофункциональные центры"), anySet(), (Long) isNull())).thenReturn(MFC_ORG_ID);
Long MFC_PENZA_ORG_ID = 2L;
when(callback.onOrganizationComplete(eq("МФЦ г.Пенза"), anySet(), eq(MFC_ORG_ID))).thenReturn(MFC_PENZA_ORG_ID);
parser.loadFixtures(getInputStream("/fixtures/twolevel_org.txt"), callback);
// ни одного пользователя не должны найти
verify(callback, never()).onUserComplete(anyString(), anyString(), anyString(), anyString(), anyLong(), anySet(), anySet());
// должны найти только одну организацию
verify(callback, times(2)).onOrganizationComplete(anyString(), anySet(), (Long) isNull());
verify(callback, times(2)).onOrganizationComplete(anyString(), anySet(), (Long) isNotNull());
verify(callback, times(1)).onOrganizationComplete(eq("Оператор Электронного Правительства"), anySet(), (Long) isNull());
verify(callback, times(1)).onOrganizationComplete(eq("Многофункциональные центры"), anySet(), (Long) isNull());
verify(callback, times(1)).onOrganizationComplete(eq("МФЦ г.Пенза"), anySet(), eq(MFC_ORG_ID));
verify(callback, times(1)).onOrganizationComplete(eq("МФЦ г.Заречный"), anySet(), eq(MFC_PENZA_ORG_ID));
}
/**
* Должны распознать организацию у которой указана одна группа
*/
@Test
public void testParseSingleOrganizationWithSingleGroup() throws IOException {
parser.loadFixtures(getInputStream("/fixtures/org_single_group.txt"), callback);
verify(callback, times(1)).onOrganizationComplete(anyString(), anySet(), (Long) isNull());
verify(callback, times(1)).onOrganizationComplete(eq("МФЦ г.Заречный"), anySet(), (Long) isNull());
ArgumentCaptor<Set> argumentCaptor = ArgumentCaptor.forClass(Set.class);
verify(callback).onOrganizationComplete(eq("МФЦ г.Заречный"), argumentCaptor.capture(), (Long) isNull());
Assert.assertNotNull(argumentCaptor.getValue());
Assert.assertEquals(1, argumentCaptor.getValue().size());
Assert.assertTrue(argumentCaptor.getValue().contains("mfcZarGor_executors"));
}
/**
* Дожный распознать организацию у которой указано несколько групп
*/
@Test
public void testParseSingleOrganizationWithSeveralGroup() throws IOException {
parser.loadFixtures(getInputStream("/fixtures/org_multiple_group.txt"), callback);
verify(callback, times(1)).onOrganizationComplete(anyString(), anySet(), (Long) isNull());
verify(callback, times(1)).onOrganizationComplete(eq("МФЦ г.Заречный"), anySet(), (Long) isNull());
ArgumentCaptor<Set> argumentCaptor = ArgumentCaptor.forClass(Set.class);
verify(callback).onOrganizationComplete(eq("МФЦ г.Заречный"), argumentCaptor.capture(), (Long) isNull());
Assert.assertNotNull(argumentCaptor.getValue());
Assert.assertEquals(2, argumentCaptor.getValue().size());
Assert.assertTrue(argumentCaptor.getValue().contains("mfcZarGor_executors"));
Assert.assertTrue(argumentCaptor.getValue().contains("testGroup"));
}
/**
* Пользователя без организации быть не может
*/
@Test(expected = IllegalStateException.class)
public void testUserWithoutOrg() throws IOException {
parser.loadFixtures(getInputStream("/fixtures/wrong_user.txt"), callback);
}
/**
* У организации на втором уровне есть 1 пользователь с установленными ролями и группой
*/
@Test
public void testParseUser() throws IOException {
long MFC_ORG_ID = 1L;
when(callback.onOrganizationComplete(eq("Многофункциональные центры"), anySet(), (Long) isNull())).thenReturn(MFC_ORG_ID);
Long MFC_PENZA_ORG_ID = 2L;
when(callback.onOrganizationComplete(eq("МФЦ г.Пенза"), anySet(), eq(MFC_ORG_ID))).thenReturn(MFC_PENZA_ORG_ID);
Long MFC_ZAR_ORG_ID = 3L;
when(callback.onOrganizationComplete(eq("МФЦ г.Заречный"), anySet(), eq(MFC_PENZA_ORG_ID))).thenReturn(MFC_ZAR_ORG_ID);
parser.loadFixtures(getInputStream("/fixtures/users.txt"), callback);
// должны найти только одну организацию
verify(callback, times(2)).onOrganizationComplete(anyString(), anySet(), (Long) isNull());
verify(callback, times(2)).onOrganizationComplete(anyString(), anySet(), (Long) isNotNull());
verify(callback, times(1)).onOrganizationComplete(eq("Оператор Электронного Правительства"), anySet(), (Long) isNull());
verify(callback, times(1)).onOrganizationComplete(eq("Многофункциональные центры"), anySet(), (Long) isNull());
verify(callback, times(1)).onOrganizationComplete(eq("МФЦ г.Пенза"), anySet(), eq(MFC_ORG_ID));
verify(callback, times(1)).onOrganizationComplete(eq("МФЦ г.Заречный"), anySet(), eq(MFC_PENZA_ORG_ID));
// должны найти 2 пользователя
verify(callback, times(2)).onUserComplete(anyString(), anyString(), anyString(), anyString(), anyLong(), anySet(), anySet());
verify(callback, times(1)).onUserComplete(eq("s.shuvalova"), eq("testpassword"), eq("Шувалова Светлана Николаевна"), eq(""), eq(MFC_PENZA_ORG_ID), anySet(), anySet());
verify(callback, times(1)).onUserComplete(eq("a.myanzelina"), eq("testpassword"), eq("Мянзелина Алсу Нязыфовна"), eq(""), eq(MFC_ZAR_ORG_ID), anySet(), anySet());
// проверяем разбор ролей и групп
ArgumentCaptor<Set> rolesCaptor = ArgumentCaptor.forClass(Set.class);
ArgumentCaptor<Set> groupCaptor = ArgumentCaptor.forClass(Set.class);
verify(callback).onUserComplete(eq("s.shuvalova"), eq("testpassword"), eq("Шувалова Светлана Николаевна"), eq(""), eq(MFC_PENZA_ORG_ID), rolesCaptor.capture(), groupCaptor.capture());
Assert.assertNotNull(rolesCaptor.getValue());
Assert.assertEquals(2, rolesCaptor.getValue().size());
Assert.assertTrue(rolesCaptor.getValue().contains(Role.Declarant));
Assert.assertTrue(rolesCaptor.getValue().contains(Role.Executor));
Assert.assertNotNull(groupCaptor.getValue());
Assert.assertEquals(2, groupCaptor.getValue().size());
Assert.assertTrue(groupCaptor.getValue().contains("mfcNevRai_request_MV00002"));
Assert.assertTrue(groupCaptor.getValue().contains("testGroup"));
verify(callback).onUserComplete(eq("a.myanzelina"), eq("testpassword"), eq("Мянзелина Алсу Нязыфовна"), eq(""), eq(MFC_ZAR_ORG_ID), rolesCaptor.capture(), groupCaptor.capture());
Assert.assertNotNull(rolesCaptor.getValue());
Assert.assertEquals(1, rolesCaptor.getValue().size());
Assert.assertTrue(rolesCaptor.getValue().contains(Role.Declarant));
Assert.assertNotNull(groupCaptor.getValue());
Assert.assertEquals(1, groupCaptor.getValue().size());
Assert.assertTrue(groupCaptor.getValue().contains("mfcNevRai_request_MV00002"));
}
/**
* Тестируем разбор пользователя с пустыми группами
*/
@Test
public void testParseEmptyFields() throws IOException {
long MFC_ORG_ID = 1L;
when(callback.onOrganizationComplete(eq("Многофункциональные центры"), anySet(), (Long) isNull())).thenReturn(MFC_ORG_ID);
Long MFC_PENZA_ORG_ID = 2L;
when(callback.onOrganizationComplete(eq("МФЦ г.Пенза"), anySet(), eq(MFC_ORG_ID))).thenReturn(MFC_PENZA_ORG_ID);
Long MFC_ZAR_ORG_ID = 3L;
when(callback.onOrganizationComplete(eq("МФЦ г.Заречный"), anySet(), eq(MFC_PENZA_ORG_ID))).thenReturn(MFC_ZAR_ORG_ID);
parser.loadFixtures(getInputStream("/fixtures/user_empty_field.txt"), callback);
// должны найти только одну организацию
verify(callback, times(2)).onOrganizationComplete(anyString(), anySet(), (Long) isNull());
verify(callback, times(2)).onOrganizationComplete(anyString(), anySet(), (Long) isNotNull());
verify(callback, times(1)).onOrganizationComplete(eq("Оператор Электронного Правительства"), anySet(), (Long) isNull());
verify(callback, times(1)).onOrganizationComplete(eq("Многофункциональные центры"), anySet(), (Long) isNull());
verify(callback, times(1)).onOrganizationComplete(eq("МФЦ г.Пенза"), anySet(), eq(MFC_ORG_ID));
verify(callback, times(1)).onOrganizationComplete(eq("МФЦ г.Заречный"), anySet(), eq(MFC_PENZA_ORG_ID));
// должны найти 1 пользователь
verify(callback, times(1)).onUserComplete(anyString(), anyString(), anyString(), anyString(), anyLong(), anySet(), anySet());
verify(callback, times(1)).onUserComplete(eq("s.shuvalova"), (String)isNull(), eq("Шувалова Светлана Николаевна"), eq(""), eq(MFC_PENZA_ORG_ID), anySet(), anySet());
// проверяем разбор ролей и групп
ArgumentCaptor<Set> rolesCaptor = ArgumentCaptor.forClass(Set.class);
ArgumentCaptor<Set> groupCaptor = ArgumentCaptor.forClass(Set.class);
verify(callback).onUserComplete(eq("s.shuvalova"), (String)isNull(), eq("Шувалова Светлана Николаевна"), eq(""), eq(MFC_PENZA_ORG_ID), rolesCaptor.capture(), groupCaptor.capture());
Assert.assertNotNull(rolesCaptor.getValue());
Assert.assertEquals(0, rolesCaptor.getValue().size());
Assert.assertNotNull(groupCaptor.getValue());
Assert.assertEquals(0, groupCaptor.getValue().size());
}
/**
* Берет поток из ресурсов
*
* @param resourcePath путь до ресурса
* @return поток для чтения
*/
private InputStream getInputStream(String resourcePath) {
return this.getClass().getResourceAsStream(resourcePath);
}
}