/**
* Copyright (C) 2011 JTalks.org Team
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package org.jtalks.jcommune.plugin.auth.poulpe;
import org.jtalks.jcommune.model.dto.UserDto;
import org.jtalks.jcommune.model.entity.PluginConfiguration;
import org.jtalks.jcommune.model.entity.PluginProperty;
import org.jtalks.jcommune.plugin.api.core.Plugin;
import org.jtalks.jcommune.plugin.api.exceptions.NoConnectionException;
import org.jtalks.jcommune.plugin.api.exceptions.UnexpectedErrorException;
import org.jtalks.jcommune.plugin.auth.poulpe.service.PoulpeAuthService;
import org.mockito.Mock;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import javax.xml.bind.JAXBException;
import java.io.IOException;
import java.util.*;
import static org.jtalks.jcommune.model.entity.PluginProperty.Type.STRING;
import static org.mockito.Mockito.when;
import static org.mockito.MockitoAnnotations.initMocks;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
/**
* @author Andrey Pogorelov
*/
public class PoulpeAuthPluginTest {
@Mock
PoulpeAuthService service;
PoulpeAuthPlugin plugin;
@BeforeMethod
public void setUp() throws Exception {
initMocks(this);
plugin = new PoulpeAuthPlugin();
plugin.setPluginService(service);
}
@Test
public void testConfigure() throws Exception {
PluginConfiguration configuration = createConfiguration("http://localhost", "user", "1234");
plugin.configure(configuration);
assertTrue(plugin.getState() == Plugin.State.ENABLED,
"Plugin with correct parameters should be configured properly.");
}
@Test
public void pluginWithIncorrectParametersShouldNotBeConfigured() throws Exception {
PluginConfiguration configuration = createConfiguration(null, "user", "1234");
try {
plugin.configure(configuration);
} catch (UnexpectedErrorException ex) {
}
assertTrue(plugin.getState() == Plugin.State.IN_ERROR,
"Plugin with incorrect parameters shouldn't be configured.");
}
@Test(expectedExceptions = UnexpectedErrorException.class)
public void pluginWithIncorrectParametersShouldThrowException() throws Exception {
PluginConfiguration configuration = createConfiguration(null, "user", "1234");
plugin.configure(configuration);
}
@Test
public void pluginWithIncorrectUrlShouldNotBeConfigured() throws Exception {
PluginConfiguration configuration = createConfiguration("http:/jtalks.org", "user", "1234");
try {
plugin.configure(configuration);
} catch (UnexpectedErrorException ex) {
}
assertTrue(plugin.getState() == Plugin.State.IN_ERROR,
"Plugin with incorrect Url shouldn't be configured.");
}
@Test(expectedExceptions = UnexpectedErrorException.class)
public void pluginWithIncorrectUrlShouldThrowException() throws Exception {
PluginConfiguration configuration = createConfiguration("http:/jtalks.org", "user", "1234");
plugin.configure(configuration);
}
@Test
public void userShouldNotBeRegisteredIfSomeErrorOccurred()
throws JAXBException, IOException, NoConnectionException, UnexpectedErrorException {
UserDto userDto = createUserDto("user", "", "");
Map<String, String> errors = new HashMap<>();
errors.put("email", "Invalid email");
errors.put("password", "Invalid password");
when(service.registerUser(userDto, false)).thenReturn(errors);
Map<String, String> result = plugin.registerUser(userDto, null);
assertEquals(result.size(), 2, "User with incorrect parameters shouldn't be registered.");
}
@Test
public void userWithCorrectParametersShouldBeRegistered()
throws UnexpectedErrorException, NoConnectionException, IOException, JAXBException {
UserDto userDto = createUserDto("user", "1234", "email@email.em");
when(service.registerUser(userDto, true)).thenReturn(new HashMap<String, String>());
Map<String, String> result = plugin.registerUser(userDto, null);
assertEquals(result.size(), 0, "User with correct parameters should be registered.");
}
@Test(expectedExceptions = NoConnectionException.class)
public void registerUserShouldThrowNoConnectionExceptionIfPoulpeUnavailable()
throws UnexpectedErrorException, NoConnectionException, IOException, JAXBException {
UserDto userDto = createUserDto("user", "1234", "email@email.em");
when(service.registerUser(userDto, false)).thenThrow(new NoConnectionException());
plugin.registerUser(userDto, null);
}
@Test(expectedExceptions = UnexpectedErrorException.class)
public void registerUserShouldThrowUnexpectedErrorExceptionIfSomeErrorOccurred()
throws UnexpectedErrorException, NoConnectionException, IOException, JAXBException {
UserDto userDto = createUserDto("user", "1234", "email@email.em");
when(service.registerUser(userDto, false)).thenThrow(new JAXBException(""));
plugin.registerUser(userDto, null);
}
@Test
public void userShouldNotBeAuthenticatedIfSomeErrorOccurred()
throws JAXBException, IOException, NoConnectionException, UnexpectedErrorException {
String username = "user";
String password = "";
when(service.authenticate(username, password)).thenReturn(Collections.<String, String>emptyMap());
Map<String, String> result = plugin.authenticate(username, password);
assertEquals(result.size(), 0, "User with incorrect parameters shouldn't be authenticated.");
}
@Test
public void userWithCorrectParametersShouldBeAuthenticated()
throws UnexpectedErrorException, NoConnectionException, IOException, JAXBException {
String username = "user";
String password = "1234";
Map<String, String> authInfo = new HashMap<>();
authInfo.put("username", "user");
authInfo.put("password", "1234");
authInfo.put("email", "email@email.em");
when(service.authenticate(username, password)).thenReturn(authInfo);
Map<String, String> result = plugin.authenticate(username, password);
assertEquals(result.size(), 3, "User with correct parameters should be authenticated.");
}
@Test(expectedExceptions = NoConnectionException.class)
public void authenticateShouldThrowNoConnectionExceptionIfPoulpeUnavailable()
throws UnexpectedErrorException, NoConnectionException, IOException, JAXBException {
String username = "user";
String password = "1234";
when(service.authenticate(username, password)).thenThrow(new NoConnectionException());
plugin.authenticate(username, password);
}
@Test(expectedExceptions = UnexpectedErrorException.class)
public void authenticateShouldThrowUnexpectedErrorExceptionIfSomeErrorOccurred()
throws UnexpectedErrorException, NoConnectionException, IOException, JAXBException {
String username = "user";
String password = "1234";
when(service.authenticate(username, password)).thenThrow(new JAXBException(""));
plugin.authenticate(username, password);
}
private UserDto createUserDto(String username, String password, String email) {
UserDto userDto = new UserDto();
userDto.setUsername(username);
userDto.setEmail(email);
userDto.setPassword(password);
return userDto;
}
private PluginConfiguration createConfiguration(String url, String login, String password) {
PluginProperty urlProperty =
new PluginProperty("URL", STRING, url);
urlProperty.setName("Url");
PluginProperty loginProperty = new PluginProperty("LOGIN", STRING, login);
loginProperty.setName("Login");
PluginProperty passwordProperty = new PluginProperty("PASSWORD", STRING, password);
passwordProperty.setName("Password");
return new PluginConfiguration("Poulpe Auth Plugin", true,
Arrays.asList(urlProperty, loginProperty, passwordProperty));
}
@Test
public void translateLabelWithExistingTranslation() {
assertEquals("Url", plugin.translateLabel("Url", Locale.forLanguageTag("en")));
}
@Test
public void translateLabelWithoutExistingTranslation() {
assertEquals("Url1", plugin.translateLabel("Url1", Locale.forLanguageTag("en")));
}
}