package it.com.atlassian.labs.speakeasy;
import com.atlassian.pageobjects.TestedProduct;
import com.atlassian.pageobjects.page.LoginPage;
import com.atlassian.plugin.test.PluginJarBuilder;
import com.atlassian.webdriver.pageobjects.WebDriverTester;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.File;
import java.io.IOException;
import java.util.Collections;
import java.util.List;
import java.util.Set;
import static it.com.atlassian.labs.speakeasy.ExtensionBuilder.buildSimplePluginFile;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
/**
*
*/
public class TestAdmin
{
private static TestedProduct<?> product = OwnerOfTestedProduct.INSTANCE;
@Before
public void login()
{
product.visit(LoginPage.class).loginAsSysAdmin(AdminPage.class);
}
@After
public void logout()
{
((WebDriverTester)product.getTester()).getDriver().manage().deleteAllCookies();
}
@Test
public void testAllowAdminsToEnable() throws IOException
{
product.getPageBinder().bind(AdminPage.class)
.edit()
.allowAdmins(false)
.save();
assertFalse(product.visit(SpeakeasyUserPage.class)
.canEnable("plugin-tests"));
logout();
assertTrue(product.visit(LoginPage.class)
.login("barney", "barney", SpeakeasyUserPage.class)
.canEnable("plugin-tests"));
File jar = new PluginJarBuilder("ConventionZip")
.addFormattedResource("atlassian-extension.json",
"{'key' : 'test-permission',",
" 'name' : 'Test Permission',",
" 'version' : '1',",
" 'permissions' : ['ADMINS_ENABLE']",
"}")
.buildWithNoManifest();
File zip = new File(jar.getPath() + ".zip");
FileUtils.moveFile(jar, zip);
SpeakeasyUserPage page = product.visit(SpeakeasyUserPage.class)
.openInstallDialog()
.uploadPluginExpectingFailure(zip);
List<String> errors = page.getErrorMessages();
assertTrue(errors.size() == 1);
assertTrue(errors.get(0).contains("ADMINS_ENABLE"));
assertFalse(page.getPluginKeys().contains("test-permission"));
logout();
product.visit(LoginPage.class)
.loginAsSysAdmin(AdminPage.class)
.edit()
.allowAdmins(true)
.save();
page = product.visit(SpeakeasyUserPage.class);
assertFalse(page.getPluginKeys().contains("test-permission"));
assertTrue(page.canEnable("plugin-tests"));
}
@Test
public void testRestrictAuthors() throws IOException
{
// setup
product.visit(SpeakeasyUserPage.class)
.openInstallDialog()
.uploadPlugin(buildSimplePluginFile("restrict-authors", "Restrict Authors"));
logout();
product.visit(LoginPage.class)
.login("barney", "barney", SpeakeasyUserPage.class)
.openForkDialog("restrict-authors")
.fork();
logout();
final AdminPage admin = product.visit(LoginPage.class).loginAsSysAdmin(AdminPage.class);
Set<String> originalGroups = admin.getAuthorGroups();
admin
.edit()
.allowAdmins(true)
.setAuthorGroups(Collections.<String>emptySet())
.save();
SpeakeasyUserPage userPage = product.visit(SpeakeasyUserPage.class);
assertFalse(userPage.canCreateExtension());
assertFalse(userPage.getPluginKeys().contains("restrict-authors-fork-barney"));
product.visit(AdminPage.class)
.edit()
.allowAdmins(true)
.setAuthorGroups(originalGroups)
.save();
userPage = product.visit(SpeakeasyUserPage.class);
assertTrue(userPage.canCreateExtension());
assertTrue(userPage.getPluginKeys().contains("restrict-authors-fork-barney"));
// cleanup
userPage.uninstallPlugin("restrict-authors");
logout();
product.visit(LoginPage.class)
.login("barney", "barney", SpeakeasyUserPage.class)
.uninstallPlugin("restrict-authors-fork-barney");
}
@Test
public void testRestrictAccessToGroups()
{
final AdminPage admin = product.getPageBinder().bind(AdminPage.class);
Set<String> originalGroups = admin.getAccessGroups();
admin.edit()
.allowAdmins(false)
.setAccessGroups(Collections.<String>emptySet())
.save();
List<String> warnings = product.visit(SpeakeasyUserPage.class)
.getWarningMessages();
assertTrue(warnings.size() == 1 && warnings.get(0).contains("o one has access"));
logout();
assertTrue(product.visit(LoginPage.class).login("barney", "barney", UnauthorizedUserPage.class).isAccessForbidden());
logout();
product.visit(LoginPage.class)
.loginAsSysAdmin(AdminPage.class)
.edit()
.allowAdmins(true)
.setAccessGroups(originalGroups)
.save();
logout();
assertFalse(product.visit(LoginPage.class).login("barney", "barney", UnauthorizedUserPage.class).isAccessForbidden());
}
@Test
public void testSearch()
{
final AdminPage page = product.getPageBinder().bind(AdminPage.class);
assertTrue(page.search("tests").contains("plugin-tests"));
assertTrue(page.search(StringUtils.repeat("xy", 10)).isEmpty());
}
}