/**
* Copyright (C) 2010-2017 Structr GmbH
*
* This file is part of Structr <http://structr.org>.
*
* Structr is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* Structr 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 Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Structr. If not, see <http://www.gnu.org/licenses/>.
*/
package org.structr.console;
import java.util.Collections;
import static junit.framework.TestCase.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import org.junit.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.structr.common.error.FrameworkException;
import org.structr.console.Console.ConsoleMode;
import org.structr.core.entity.Principal;
import org.structr.core.graph.Tx;
import org.structr.core.property.PropertyMap;
import org.structr.web.StructrUiTest;
import org.structr.web.entity.Folder;
import org.structr.web.entity.User;
public class ConsoleTest extends StructrUiTest {
private static final Logger logger = LoggerFactory.getLogger(ConsoleTest.class.getName());
@Test
public void testSwitchModes() {
try {
final Console console = new Console(securityContext, Collections.emptyMap());
assertEquals("Invalid console execution result", "Mode set to 'StructrScript'.\r\n", console.runForTest("Console.setMode('" + ConsoleMode.StructrScript.name() + "')"));
assertEquals("Invalid console execution result", "Mode set to 'Cypher'.\r\n", console.runForTest("Console.setMode('" + ConsoleMode.Cypher.name() + "')"));
assertEquals("Invalid console execution result", "Mode set to 'JavaScript'.\r\n", console.runForTest("Console.setMode('" + ConsoleMode.JavaScript.name() + "')"));
assertEquals("Invalid console execution result", "Mode set to 'AdminShell'. Type 'help' to get a list of commands.\r\n", console.runForTest("Console.setMode('" + ConsoleMode.AdminShell.name() + "')"));
assertEquals("Invalid console execution result", "Mode set to 'REST'. Type 'help' to get a list of commands.\r\n", console.runForTest("Console.setMode('" + ConsoleMode.REST.name() + "')"));
} catch (FrameworkException fex) {
fail("Unexpected exception.");
logger.warn("", fex);
}
}
@Test
public void testUserCommand() {
final Console console = new Console(securityContext, Collections.emptyMap());
Principal admin = null;
try {
assertEquals("Invalid console execution result", "Mode set to 'AdminShell'. Type 'help' to get a list of commands.\r\n", console.runForTest("Console.setMode('" + ConsoleMode.AdminShell.name() + "')"));
assertEquals("Invalid console execution result", "\r\n", console.runForTest("user list"));
// create a user
assertEquals("Invalid console execution result", "User created.\r\n", console.runForTest("user add tester tester@test.de"));
assertEquals("Invalid console execution result", "User created.\r\n", console.runForTest("user add admin admin@localhost isAdmin"));
assertEquals("Invalid console execution result", "User created.\r\n", console.runForTest("user add root isAdmin"));
// check success
try (final Tx tx = app.tx()) {
final User user = app.nodeQuery(User.class).andName("tester").getFirst();
assertNotNull("Invalid console execution result", user);
assertEquals("Invalid console execution result", "tester", user.getProperty(User.name));
assertEquals("Invalid console execution result", "tester@test.de", user.getProperty(User.eMail));
assertEquals("Invalid console execution result", Boolean.FALSE, user.getProperty(User.isAdmin));
tx.success();
}
// check list
assertEquals("Invalid console execution result", "admin, root, tester\r\n", console.runForTest("user list"));
// delete user
assertEquals("Invalid console execution result", "User deleted.\r\n", console.runForTest("user delete tester"));
// check list
assertEquals("Invalid console execution result", "admin, root\r\n", console.runForTest("user list"));
// check "root" user
try (final Tx tx = app.tx()) {
final User root = app.nodeQuery(User.class).andName("root").getFirst();
assertNotNull("Invalid console execution result", root);
assertEquals("Invalid console execution result", "root", root.getProperty(User.name));
assertEquals("Invalid console execution result", Boolean.TRUE, root.getProperty(User.isAdmin));
tx.success();
}
// make check "admin" user
try (final Tx tx = app.tx()) {
admin = app.nodeQuery(User.class).andName("admin").getFirst();
assertNotNull("Invalid console execution result", admin);
assertEquals("Invalid console execution result", "admin", admin.getProperty(User.name));
assertEquals("Invalid console execution result", "admin@localhost", admin.getProperty(User.eMail));
assertEquals("Invalid console execution result", Boolean.TRUE, admin.getProperty(User.isAdmin));
final Folder folder = app.create(Folder.class, "folder");
folder.setProperties(folder.getSecurityContext(), new PropertyMap(Folder.owner, admin));
tx.success();
}
final String idHash = admin.getUuid().substring(7, 11);
// delete user without confirmation
assertEquals("Invalid console execution result", "User 'admin' has owned nodes, please confirm deletion with 'user delete admin " + idHash + "'.\r\n", console.runForTest("user delete admin"));
// delete user with confirmation
assertEquals("Invalid console execution result", "User deleted.\r\n", console.runForTest("user delete admin " + idHash));
// check list
assertEquals("Invalid console execution result", "root\r\n", console.runForTest("user list"));
} catch (FrameworkException fex) {
logger.warn("", fex);
fail("Unexpected exception.");
}
}
@Test
public void testRebuildCommand() {
final Console console = new Console(securityContext, Collections.emptyMap());
final String fullIndexRebuildOutput =
"Node type not set or no entity class found. Starting (re-)indexing all nodes\r\n" +
"RebuildNodeIndex: 27 objects processed\r\n" +
"RebuildNodeIndex: 27 objects processed\r\n" +
"Done with (re-)indexing 27 nodes\r\n" +
"Relationship type not set, starting (re-)indexing all relationships\r\n" +
"RebuildRelIndex: 38 objects processed\r\n" +
"RebuildRelIndex: 38 objects processed\r\n" +
"Done with (re-)indexing 38 relationships\r\n";
final String nodeIndexRebuildOutput =
"Node type not set or no entity class found. Starting (re-)indexing all nodes\r\n" +
"RebuildNodeIndex: 27 objects processed\r\n" +
"RebuildNodeIndex: 27 objects processed\r\n" +
"Done with (re-)indexing 27 nodes\r\n";
final String relIndexRebuildOutput =
"Relationship type not set, starting (re-)indexing all relationships\r\n" +
"RebuildRelIndex: 38 objects processed\r\n" +
"RebuildRelIndex: 38 objects processed\r\n" +
"Done with (re-)indexing 38 relationships\r\n";
final String typedNodeIndexRebuildOutput =
"Starting (re-)indexing all nodes of type ResourceAccess\r\n" +
"RebuildNodeIndex: 0 objects processed\r\n" +
"Done with (re-)indexing 0 nodes\r\n";
final String typedRelationshipIndexRebuildOutput =
"Starting (re-)indexing all relationships of type ResourceAccess\r\n" +
"RebuildRelIndex: 0 objects processed\r\n" +
"Done with (re-)indexing 0 relationships\r\n";
final String createNodeUuidsOutput =
"Start setting UUID on all nodes\r\n" +
"SetNodeUuid: 27 objects processed\r\n" +
"SetNodeUuid: 27 objects processed\r\n" +
"Done with setting UUID on 27 nodes\r\n";
final String createNodeUuidsOnUserOutput =
"Start setting UUID on nodes of type User\r\n" +
"SetNodeUuid: 0 objects processed\r\n" +
"Done with setting UUID on 0 nodes\r\n";
final String createRelUuidsOnUserOutput =
"Start setting UUID on rels of type User\r\n" +
"SetRelationshipUuid: 0 objects processed\r\n" +
"Done with setting UUID on 0 relationships\r\n";
final String createRelUuidsOutput =
"Start setting UUID on all rels\r\n" +
"SetRelationshipUuid: 38 objects processed\r\n" +
"SetRelationshipUuid: 38 objects processed\r\n" +
"Done with setting UUID on 38 relationships\r\n";
final String createLabelsOutput =
"Node type not set or no entity class found. Starting creation of labels for all nodes.\r\n" +
"CreateLabels: 27 objects processed\r\n" +
"CreateLabels: 27 objects processed\r\n" +
"Done with creating labels on 27 nodes\r\n";
final String createUserLabelsOutput =
"Starting creation of labels for all nodes of type User\r\n" +
"CreateLabels: 0 objects processed\r\n" +
"Done with creating labels on 0 nodes\r\n";
try {
assertEquals("Invalid console execution result", "Mode set to 'AdminShell'. Type 'help' to get a list of commands.\r\n", console.runForTest("Console.setMode('" + ConsoleMode.AdminShell.name() + "')"));
// test syntax parser
assertEquals("Invalid console execution result", "Please specify what to initialize.\r\n", console.runForTest("init"));
assertEquals("Invalid console execution result", "Index type must be specified before the 'index' keyword.\r\n", console.runForTest("init index node"));
assertEquals("Invalid console execution result", "Entity type must be specified before the 'ids' keyword.\r\n", console.runForTest("init ids node"));
assertEquals("Invalid console execution result", "Syntax error, too many parameters.\r\n", console.runForTest("init ids ids"));
assertEquals("Invalid console execution result", "Please specify what to initialize.\r\n", console.runForTest("init node node"));
assertEquals("Invalid console execution result", "Please specify what to initialize.\r\n", console.runForTest("init rel node"));
assertEquals("Invalid console execution result", "Please specify what to initialize.\r\n", console.runForTest("init rel rel"));
assertEquals("Invalid console execution result", "Please specify what to initialize.\r\n", console.runForTest("init relationship node"));
assertEquals("Invalid console execution result", "Please specify what to initialize.\r\n", console.runForTest("init relationship rel"));
assertEquals("Invalid console execution result", "Please specify what to initialize.\r\n", console.runForTest("init relationship relationship"));
assertEquals("Invalid console execution result", "Unknown init mode 'for'.\r\n", console.runForTest("init for index"));
assertEquals("Invalid console execution result", "Unknown init mode 'for'.\r\n", console.runForTest("init for for"));
assertEquals("Invalid console execution result", "Unknown init mode 'test'.\r\n", console.runForTest("init test"));
assertEquals("Invalid console execution result", "Unknown init mode 'test'.\r\n", console.runForTest("init test index"));
assertEquals("Invalid console execution result", "Syntax error, please specify something like 'init node index for User'.\r\n", console.runForTest("init node ids test"));
assertEquals("Invalid console execution result", "Syntax error, please specify something like 'init node index for User'.\r\n", console.runForTest("init index abc"));
assertEquals("Invalid console execution result", "Syntax error, too many parameters.\r\n", console.runForTest("init index index"));
assertEquals("Invalid console execution result", "Missing type specification, please specify something like 'init node index for User'.\r\n", console.runForTest("init index for"));
assertEquals("Invalid console execution result", "Missing type specification, please specify something like 'init node index for User'.\r\n", console.runForTest("init node index for"));
assertEquals("Invalid console execution result", "Missing type specification, please specify something like 'init node index for User'.\r\n", console.runForTest("init relationship index for"));
assertEquals("Invalid console execution result", "Missing type specification, please specify something like 'init node index for User'.\r\n", console.runForTest("init rel index for"));
assertEquals("Invalid console execution result", "Syntax error, too many parameters.\r\n", console.runForTest("init index for User test test"));
assertEquals("Invalid console execution result", "Syntax error, too many parameters.\r\n", console.runForTest("init node index for User test"));
assertEquals("Invalid console execution result", "Syntax error, too many parameters.\r\n", console.runForTest("init node index for User test test"));
assertEquals("Invalid console execution result", "Syntax error, too many parameters.\r\n", console.runForTest("init rel index for User test"));
assertEquals("Invalid console execution result", "Syntax error, too many parameters.\r\n", console.runForTest("init rel index for User test test"));
assertEquals("Invalid console execution result", "Syntax error, too many parameters.\r\n", console.runForTest("init relationship index for User test"));
assertEquals("Invalid console execution result", "Syntax error, too many parameters.\r\n", console.runForTest("init relationship index for User test test"));
// test actual command execution
assertEquals("Invalid console execution result", fullIndexRebuildOutput, console.runForTest("init index"));
assertEquals("Invalid console execution result", nodeIndexRebuildOutput, console.runForTest("init node index"));
assertEquals("Invalid console execution result", relIndexRebuildOutput, console.runForTest("init relationship index"));
assertEquals("Invalid console execution result", relIndexRebuildOutput, console.runForTest("init rel index"));
assertEquals("Invalid console execution result", typedNodeIndexRebuildOutput, console.runForTest("init node index for ResourceAccess"));
assertEquals("Invalid console execution result", typedRelationshipIndexRebuildOutput, console.runForTest("init relationship index for ResourceAccess"));
assertEquals("Invalid console execution result", typedRelationshipIndexRebuildOutput, console.runForTest("init rel index for ResourceAccess"));
assertEquals("Invalid console execution result", createNodeUuidsOutput, console.runForTest("init ids"));
assertEquals("Invalid console execution result", createNodeUuidsOutput, console.runForTest("init node ids"));
assertEquals("Invalid console execution result", createRelUuidsOutput, console.runForTest("init relationship ids"));
assertEquals("Invalid console execution result", createRelUuidsOutput, console.runForTest("init rel ids"));
assertEquals("Invalid console execution result", createNodeUuidsOnUserOutput, console.runForTest("init ids for User"));
assertEquals("Invalid console execution result", createNodeUuidsOnUserOutput, console.runForTest("init node ids for User"));
assertEquals("Invalid console execution result", createRelUuidsOnUserOutput, console.runForTest("init rel ids for User"));
assertEquals("Invalid console execution result", createRelUuidsOnUserOutput, console.runForTest("init relationship ids for User"));
System.out.println(console.runForTest("init labels for User"));
assertEquals("Invalid console execution result", createLabelsOutput, console.runForTest("init labels"));
assertEquals("Invalid console execution result", createLabelsOutput, console.runForTest("init node labels"));
assertEquals("Invalid console execution result", createUserLabelsOutput, console.runForTest("init labels for User"));
assertEquals("Invalid console execution result", createUserLabelsOutput, console.runForTest("init node labels for User"));
assertEquals("Invalid console execution result", "Cannot set labels on relationships.\r\n", console.runForTest("init relationship labels"));
assertEquals("Invalid console execution result", "Cannot set labels on relationships.\r\n", console.runForTest("init rel labels"));
assertEquals("Invalid console execution result", "Cannot set labels on relationships.\r\n", console.runForTest("init rel labels for User"));
assertEquals("Invalid console execution result", "Cannot set labels on relationships.\r\n", console.runForTest("init relationship labels for User"));
assertEquals("Invalid console execution result", "Unknown init mode 'test'.\r\n", console.runForTest("init test relationship labels"));
assertEquals("Invalid console execution result", "Unknown init mode 'blah'.\r\n", console.runForTest("init rel blah labels"));
assertEquals("Invalid console execution result", "Cannot set labels on relationships.\r\n", console.runForTest("init rel labels for test User"));
assertEquals("Invalid console execution result", "Unknown init mode 'test'.\r\n", console.runForTest("init test relationship test labels for User"));
} catch (FrameworkException fex) {
fail("Unexpected exception.");
logger.warn("", fex);
}
}
}