package net.pterodactylus.sone.web;
import static net.pterodactylus.sone.web.WebTestUtils.redirectsTo;
import static net.pterodactylus.util.web.Method.POST;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.contains;
import static org.hamcrest.Matchers.is;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashSet;
import net.pterodactylus.sone.data.Profile;
import net.pterodactylus.sone.data.Sone;
import net.pterodactylus.sone.freenet.wot.OwnIdentity;
import org.junit.Test;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
/**
* Unit test for {@link CreateSonePage}.
*
* @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
*/
public class CreateSonePageTest extends WebPageTest {
private final CreateSonePage page = new CreateSonePage(template, webInterface);
private final Sone[] localSones = { createSone("local-sone1"), createSone("local-sone2"), createSone("local-sone3") };
private final OwnIdentity[] ownIdentities = {
createOwnIdentity("own-id-1", "Sone"),
createOwnIdentity("own-id-2", "Test", "Foo"),
createOwnIdentity("own-id-3"),
createOwnIdentity("own-id-4", "Sone")
};
@Test
public void pageReturnsCorrectPath() {
assertThat(page.getPath(), is("createSone.html"));
}
@Test
@SuppressWarnings("unchecked")
public void getRequestStoresListOfIdentitiesInTemplateContext() throws Exception {
addDefaultLocalSones();
addDefaultOwnIdentities();
page.processTemplate(freenetRequest, templateContext);
assertThat((Collection<Sone>) templateContext.get("sones"), contains(localSones[0], localSones[1], localSones[2]));
assertThat((Collection<OwnIdentity>) templateContext.get("identitiesWithoutSone"), contains(ownIdentities[1], ownIdentities[2]));
}
private void addDefaultLocalSones() {
addLocalSone("local-sone3", localSones[2]);
addLocalSone("local-sone1", localSones[0]);
addLocalSone("local-sone2", localSones[1]);
}
private void addDefaultOwnIdentities() {
addOwnIdentity(ownIdentities[2]);
addOwnIdentity(ownIdentities[0]);
addOwnIdentity(ownIdentities[3]);
addOwnIdentity(ownIdentities[1]);
}
private Sone createSone(String id) {
Sone sone = mock(Sone.class);
when(sone.getId()).thenReturn(id);
when(sone.getProfile()).thenReturn(new Profile(sone));
return sone;
}
private OwnIdentity createOwnIdentity(String id, final String... contexts) {
OwnIdentity ownIdentity = mock(OwnIdentity.class);
when(ownIdentity.getId()).thenReturn(id);
when(ownIdentity.getNickname()).thenReturn(id);
when(ownIdentity.getContexts()).thenReturn(new HashSet<>(Arrays.asList(contexts)));
when(ownIdentity.hasContext(anyString())).thenAnswer(new Answer<Boolean>() {
@Override
public Boolean answer(InvocationOnMock invocation) throws Throwable {
return Arrays.asList(contexts).contains(invocation.<String>getArgument(0));
}
});
return ownIdentity;
}
@Test
public void soneIsCreatedAndLoggedIn() throws Exception {
addDefaultLocalSones();
addDefaultOwnIdentities();
addHttpRequestParameter("identity", "own-id-3");
request("", POST);
Sone newSone = mock(Sone.class);
when(core.createSone(ownIdentities[2])).thenReturn(newSone);
expectedException.expect(redirectsTo("index.html"));
try {
page.processTemplate(freenetRequest, templateContext);
} finally {
verify(core).createSone(ownIdentities[2]);
verify(webInterface).setCurrentSone(toadletContext, newSone);
}
}
@Test
public void onInvalidIdentityIdFlagIsStoredInTemplateContext() throws Exception {
addDefaultLocalSones();
addDefaultOwnIdentities();
addHttpRequestParameter("identity", "own-id-invalid");
request("", POST);
page.processTemplate(freenetRequest, templateContext);
assertThat(((Boolean) templateContext.get("errorNoIdentity")), is(true));
}
@Test
public void ifSoneIsNotCreatedUserIsStillRedirectedToIndex() throws Exception {
addDefaultLocalSones();
addDefaultOwnIdentities();
addHttpRequestParameter("identity", "own-id-3");
request("", POST);
when(core.createSone(ownIdentities[2])).thenReturn(null);
expectedException.expect(redirectsTo("index.html"));
try {
page.processTemplate(freenetRequest, templateContext);
} finally {
verify(core).createSone(ownIdentities[2]);
verify(webInterface).setCurrentSone(toadletContext, null);
}
}
@Test
public void doNotShowCreateSoneInMenuIfFullAccessRequiredButClientHasNoFullAccess() {
when(core.getPreferences().isRequireFullAccess()).thenReturn(true);
when(toadletContext.isAllowedFullAccess()).thenReturn(false);
assertThat(page.isEnabled(toadletContext), is(false));
}
@Test
public void showCreateSoneInMenuIfNotLoggedInAndClientHasFullAccess() {
when(core.getPreferences().isRequireFullAccess()).thenReturn(true);
when(toadletContext.isAllowedFullAccess()).thenReturn(true);
unsetCurrentSone();
assertThat(page.isEnabled(toadletContext), is(true));
}
@Test
public void showCreateSoneInMenuIfNotLoggedIn() {
unsetCurrentSone();
assertThat(page.isEnabled(toadletContext), is(true));
}
@Test
public void showCreateSoneInMenuIfLoggedInAndASingleSoneExists() {
addLocalSone("local-sone", mock(Sone.class));
assertThat(page.isEnabled(toadletContext), is(true));
}
@Test
public void doNotShowCreateSoneInMenuIfLoggedInAndMoreLocalSonesExists() {
addLocalSone("local-sone1", mock(Sone.class));
addLocalSone("local-sone2", mock(Sone.class));
assertThat(page.isEnabled(toadletContext), is(false));
}
}