/* MonkeyTalk - a cross-platform functional testing tool Copyright (C) 2012 Gorilla Logic, Inc. This program 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. This program 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 this program. If not, see <http://www.gnu.org/licenses/>. */ package com.gorillalogic.monkeytalk.processor.report.detail.tests; import static org.hamcrest.CoreMatchers.allOf; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.CoreMatchers.notNullValue; import static org.junit.Assert.assertThat; import static org.junit.matchers.JUnitMatchers.containsString; import java.io.File; import java.io.IOException; import java.util.List; import java.util.Map; import org.json.JSONObject; import org.junit.AfterClass; import org.junit.Before; import org.junit.Test; import com.gorillalogic.monkeytalk.Command; import com.gorillalogic.monkeytalk.processor.PlaybackListener; import com.gorillalogic.monkeytalk.processor.PlaybackResult; import com.gorillalogic.monkeytalk.processor.PlaybackStatus; import com.gorillalogic.monkeytalk.processor.Scope; import com.gorillalogic.monkeytalk.processor.ScriptProcessor; import com.gorillalogic.monkeytalk.processor.SuiteProcessor; import com.gorillalogic.monkeytalk.processor.report.detail.DetailReportHtml; import com.gorillalogic.monkeytalk.processor.report.detail.ScriptReportHelper; import com.gorillalogic.monkeytalk.sender.Response; import com.gorillalogic.monkeytalk.utils.TestHelper; @SuppressWarnings("unchecked") public class DetailReportHtmlTest extends TestHelper { private static final String HOST = "localhost"; private static final int PORT = 18027; private static String output; private static final PlaybackListener LISTENER_WITH_OUTPUT = new PlaybackListener() { @Override public void onStart(Scope scope) { output += scope.getCurrentCommand(); } @Override public void onScriptStart(Scope scope) { output += "START\n"; } @Override public void onScriptComplete(Scope scope, PlaybackResult r) { output += "COMPLETE : " + r; } @Override public void onComplete(Scope scope, Response resp) { output += " -> " + resp + "\n"; } @Override public void onPrint(String message) { output += message; } }; @Before public void before() { output = ""; } @AfterClass public static void afterClass() throws IOException { cleanup(); } @Test public void testSimpleScript() throws Exception { File dir = tempDir(); tempScript("foo.mt", "Button FOO Tap\nInput name EnterText FRED\nButton BAR Tap", dir); ScriptProcessor processor = new ScriptProcessor(HOST, PORT, dir); CommandServer server = new CommandServer(PORT); processor.setPlaybackListener(LISTENER_WITH_OUTPUT); PlaybackResult result = processor.runScript("foo.mt"); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); List<Command> cmds = server.getCommands(); assertThat(cmds.size(), is(3)); assertThat(cmds.get(0).getCommand(), is("Button FOO Tap")); assertThat(cmds.get(1).getCommand(), is("Input name EnterText FRED")); assertThat(cmds.get(2).getCommand(), is("Button BAR Tap")); assertThat(output, containsString("Button FOO Tap -> OK")); assertThat(output, containsString("Input name EnterText FRED -> OK")); assertThat(output, containsString("Button BAR Tap -> OK")); String xml = new ScriptReportHelper().createDetailReport(result).toXMLDocument(); String html = new DetailReportHtml().createDetailReportHtml(result, xml); assertThat(html, containsString("class=\"span24\"")); assertThat(html, containsString("class=\"offset1 span23\"")); assertThat(html, not(containsString("class=\"offset2 span22\""))); assertThat(html, containsString("1</span><b>Script</b> foo.mt <b>Run</b>")); assertThat(html, containsString("2</span><b>Button</b> FOO <b>Tap</b>")); assertThat(html, containsString("3</span><b>Input</b> name <b>EnterText</b> FRED")); assertThat(html, containsString("4</span><b>Button</b> BAR <b>Tap</b>")); } @Test public void testQuotes() throws Exception { File dir = tempDir(); // command 1: quoted monkeyId, quoted arg // command 2: monkeyId with escaped quote, arg with escaped quote tempScript("foo.mt", "Input \"FOO BAR\" EnterText \"FRED JOE\"\n" + "Input Foo\\\"Bar EnterText Fred\\\"Joe", dir); ScriptProcessor processor = new ScriptProcessor(HOST, PORT, dir); CommandServer server = new CommandServer(PORT); processor.setPlaybackListener(LISTENER_WITH_OUTPUT); PlaybackResult result = processor.runScript("foo.mt"); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); List<Command> cmds = server.getCommands(); assertThat(cmds.size(), is(2)); assertThat(cmds.get(0).getCommand(), is("Input \"FOO BAR\" EnterText \"FRED JOE\"")); assertThat(cmds.get(1).getCommand(), is("Input Foo\\\"Bar EnterText Fred\\\"Joe")); assertThat(output, containsString("Input \"FOO BAR\" EnterText \"FRED JOE\" -> OK")); assertThat(output, containsString("Input Foo\\\"Bar EnterText Fred\\\"Joe -> OK")); String xml = new ScriptReportHelper().createDetailReport(result).toXMLDocument(); String html = new DetailReportHtml().createDetailReportHtml(result, xml); assertThat(html, containsString("class=\"span24\"")); assertThat(html, containsString("class=\"offset1 span23\"")); assertThat(html, not(containsString("class=\"offset2 span22\""))); assertThat(html, containsString("1</span><b>Script</b> foo.mt <b>Run</b>")); assertThat( html, containsString("2</span><b>Input</b> "FOO BAR" <b>EnterText</b> "FRED JOE"")); assertThat( html, containsString("3</span><b>Input</b> Foo\\"Bar <b>EnterText</b> Fred\\"Joe")); } @Test public void testDeepScriptHierarchy() throws Exception { File dir = tempDir(); tempScript("foo.mt", "Button FOO Tap", dir); tempScript("bar.mt", "Button BAR1 Tap\nScript foo.mt Run\nButton BAR2 Tap", dir); tempScript("baz.mt", "Button BAZ1 Tap\nScript bar.mt Run\nButton BAZ2 Tap", dir); ScriptProcessor processor = new ScriptProcessor(HOST, PORT, dir); CommandServer server = new CommandServer(PORT); processor.setPlaybackListener(LISTENER_WITH_OUTPUT); PlaybackResult result = processor.runScript("baz.mt"); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); List<Command> cmds = server.getCommands(); assertThat(cmds.size(), is(5)); assertThat(cmds.get(0).getCommand(), is("Button BAZ1 Tap")); assertThat(cmds.get(1).getCommand(), is("Button BAR1 Tap")); assertThat(cmds.get(2).getCommand(), is("Button FOO Tap")); assertThat(cmds.get(3).getCommand(), is("Button BAR2 Tap")); assertThat(cmds.get(4).getCommand(), is("Button BAZ2 Tap")); assertThat(output, containsString("Button BAZ1 Tap -> OK")); assertThat(output, containsString("Button BAR1 Tap -> OK")); assertThat(output, containsString("Button FOO Tap -> OK")); assertThat(output, containsString("Button BAR2 Tap -> OK")); assertThat(output, containsString("Button BAZ2 Tap -> OK")); String xml = new ScriptReportHelper().createDetailReport(result).toXMLDocument(); String html = new DetailReportHtml().createDetailReportHtml(result, xml); assertThat(html, containsString("class=\"span24\"")); assertThat(html, containsString("class=\"offset1 span23\"")); assertThat(html, containsString("class=\"offset2 span22\"")); assertThat(html, containsString("class=\"offset3 span21\"")); assertThat(html, not(containsString("class=\"offset4 span20\""))); assertThat(html, containsString("1</span><b>Script</b> baz.mt <b>Run</b>")); assertThat(html, containsString("2</span><b>Button</b> BAZ1 <b>Tap</b>")); assertThat(html, containsString("3</span><b>Script</b> bar.mt <b>Run</b>")); assertThat(html, containsString("4</span><b>Button</b> BAR1 <b>Tap</b>")); assertThat(html, containsString("5</span><b>Script</b> foo.mt <b>Run</b>")); assertThat(html, containsString("6</span><b>Button</b> FOO <b>Tap</b>")); assertThat(html, containsString("7</span><b>Button</b> BAR2 <b>Tap</b>")); assertThat(html, containsString("8</span><b>Button</b> BAZ2 <b>Tap</b>")); } @Test public void testScriptWithDatafile() throws Exception { File dir = tempDir(); tempScript("data.csv", "first,last\nJoe,Smith\n\"Bo Bo\",Baker\n", dir); tempScript("foo.mt", "Vars * Define first=foo last=\"bar baz\"\n" + "Input name EnterText \"${first} ${last}\"", dir); tempScript("script.mt", "Script foo.mt RunWith data.csv", dir); ScriptProcessor processor = new ScriptProcessor(HOST, PORT, dir); CommandServer server = new CommandServer(PORT); processor.setPlaybackListener(LISTENER_WITH_OUTPUT); PlaybackResult result = processor.runScript("script.mt"); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); List<Command> cmds = server.getCommands(); assertThat(cmds.size(), is(2)); assertThat(cmds.get(0).getCommand(), is("Input name EnterText \"Joe Smith\"")); assertThat(cmds.get(1).getCommand(), is("Input name EnterText \"Bo Bo Baker\"")); assertThat(output, containsString("Vars * Define first=foo last=\"bar baz\" -> OK")); assertThat(output, containsString("Input name EnterText \"Joe Smith\" -> OK")); assertThat(output, containsString("Input name EnterText \"Bo Bo Baker\" -> OK")); String xml = new ScriptReportHelper().createDetailReport(result).toXMLDocument(); String html = new DetailReportHtml().createDetailReportHtml(result, xml); assertThat(html, containsString("class=\"span24\"")); assertThat(html, containsString("class=\"offset1 span23\"")); assertThat(html, containsString("class=\"offset2 span22\"")); assertThat(html, containsString("class=\"offset3 span21\"")); assertThat(html, not(containsString("class=\"offset4 span20\""))); assertThat( html, allOf(containsString("1</span><b>Script</b> script.mt <b>Run</b>"), containsString("2</span><b>Script</b> foo.mt <b>RunWith</b> data.csv"), containsString("3</span><b>Script</b> foo.mt <b>RunWith</b> data.csv[@1]"), containsString("4</span><b>Vars</b> * <b>Define</b> first=foo last="bar baz""), containsString("5</span><b>Input</b> name <b>EnterText</b> "Joe Smith""), containsString("6</span><b>Script</b> foo.mt <b>RunWith</b> data.csv[@2]"), containsString("7</span><b>Vars</b> * <b>Define</b> first=foo last="bar baz""), containsString("8</span><b>Input</b> name <b>EnterText</b> "Bo Bo Baker""))); } @Test public void testScriptWithError() throws Exception { File dir = tempDir(); tempScript("foo.mt", "Button FOO Tap\nButton JOE Tap", dir); ScriptProcessor processor = new ScriptProcessor(HOST, PORT, dir); ErrorOnJoeServer server = new ErrorOnJoeServer(PORT); PlaybackResult result = processor.runScript("foo.mt"); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.ERROR)); assertThat(result.getMessage(), is("error on Joe")); assertThat(server.getCommands().size(), is(1)); assertThat(server.getCommands().get(0).getCommand(), is("Button FOO Tap")); String xml = new ScriptReportHelper().createDetailReport(result).toXMLDocument(); String html = new DetailReportHtml().createDetailReportHtml(result, xml); assertThat(html, containsString("class=\"span24\"")); assertThat(html, containsString("class=\"offset1 span23\"")); assertThat(html, containsString("1</span><b>Script</b> foo.mt <b>Run</b>")); assertThat(html, containsString("<b>Button</b> FOO <b>Tap</b>")); assertThat(html, containsString("<span class=\"text-success\">ok</span>")); assertThat(html, containsString("<b>Button</b> JOE <b>Tap</b>")); assertThat(html, containsString("<span class=\"text-error\">error</span>")); } @Test public void testScriptWithFailure() throws Exception { File dir = tempDir(); tempScript("foo.mt", "Button FOO Tap\nButton FRED Tap\nButton BAR Tap", dir); ScriptProcessor processor = new ScriptProcessor(HOST, PORT, dir); FailOnFredServer server = new FailOnFredServer(PORT); processor.setPlaybackListener(LISTENER_WITH_OUTPUT); PlaybackResult result = processor.runScript("foo.mt"); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.FAILURE)); assertThat(result.getMessage(), is("fail on Fred")); assertThat(server.getCommands().size(), is(1)); assertThat(server.getCommands().get(0).getCommand(), is("Button FOO Tap")); assertThat(output, containsString("START")); assertThat(output, containsString("Button FOO Tap -> OK")); assertThat(output, containsString("Button FRED Tap -> FAILURE : fail on Fred")); assertThat(output, containsString("COMPLETE : FAILURE : fail on Fred")); String xml = new ScriptReportHelper().createDetailReport(result).toXMLDocument(); String html = new DetailReportHtml().createDetailReportHtml(result, xml); assertThat(html, containsString("class=\"span24\"")); assertThat(html, containsString("class=\"offset1 span23\"")); assertThat(html, containsString("1</span><b>Script</b> foo.mt <b>Run</b>")); assertThat(html, containsString("<b>Button</b> FOO <b>Tap</b>")); assertThat(html, containsString("<span class=\"text-success\">ok</span>")); assertThat(html, containsString("<b>Button</b> FRED <b>Tap</b>")); assertThat(html, containsString("<span class=\"text-warning\">failure</span>")); } @Test public void testSimpleSuite() throws Exception { File dir = tempDir(); tempScript("foo.mt", "Button FOO Tap\nButton FOO2 Tap\nButton FOO3 Tap", dir); tempScript("bar.mt", "Button BAR Tap", dir); File suite = tempScript("mysuite.mts", "Test foo.mt Run\nTest bar.mt Run", dir); SuiteProcessor processor = new SuiteProcessor(HOST, PORT, dir); processor.setReportDir(dir); CommandServer server = new CommandServer(PORT); PlaybackResult result = processor.runSuite(suite.getName()); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(4)); assertThat(server.getCommands().get(0).getCommand(), is("Button FOO Tap")); assertThat(server.getCommands().get(1).getCommand(), is("Button FOO2 Tap")); assertThat(server.getCommands().get(2).getCommand(), is("Button FOO3 Tap")); assertThat(server.getCommands().get(3).getCommand(), is("Button BAR Tap")); String xml = new ScriptReportHelper().createDetailReport(result).toXMLDocument(); assertThat(xml, containsString("tests=\"2\" errors=\"0\" failures=\"0\" skipped=\"0\"")); String html = new DetailReportHtml().createDetailReportHtml(result, xml); assertThat(html, containsString("class=\"span24\"")); assertThat(html, containsString("class=\"offset1 span23\"")); assertThat(html, containsString("class=\"offset2 span22\"")); assertThat(html, not(containsString("class=\"offset3 span21\""))); assertThat( html, allOf(containsString("1</span><b>Suite</b> mysuite.mts <b>Run</b>"), containsString("2</span><b>Test</b> foo.mt <b>Run</b>"), containsString("3</span><b>Button</b> FOO <b>Tap</b>"), containsString("4</span><b>Button</b> FOO2 <b>Tap</b>"), containsString("5</span><b>Button</b> FOO3 <b>Tap</b>"), containsString("6</span><b>Test</b> bar.mt <b>Run</b>"), containsString("7</span><b>Button</b> BAR <b>Tap</b"))); } @Test public void testSuiteWithSetupAndTeardown() throws Exception { File dir = tempDir(); tempScript("foo.mt", "Button FOO Click", dir); tempScript("bar.mt", "Button BAR Click", dir); tempScript("baz.mt", "Button BAZ Click", dir); tempScript("up.mt", "Button SETUP Click", dir); tempScript("down.mt", "Button TEARDOWN Click", dir); File suite = tempScript( "suite.mts", "Test foo.mt Run\nTest bar.mt Run\nTest baz.mt Run\nSetup up.mt Run\nTeardown down.mt Run", dir); SuiteProcessor processor = new SuiteProcessor(HOST, PORT, dir); processor.setReportDir(dir); CommandServer server = new CommandServer(PORT); PlaybackResult result = processor.runSuite(suite.getName()); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(9)); assertThat(server.getCommands().get(0).getCommand(), is("Button SETUP Click")); assertThat(server.getCommands().get(1).getCommand(), is("Button FOO Click")); assertThat(server.getCommands().get(2).getCommand(), is("Button TEARDOWN Click")); assertThat(server.getCommands().get(3).getCommand(), is("Button SETUP Click")); assertThat(server.getCommands().get(4).getCommand(), is("Button BAR Click")); assertThat(server.getCommands().get(5).getCommand(), is("Button TEARDOWN Click")); assertThat(server.getCommands().get(6).getCommand(), is("Button SETUP Click")); assertThat(server.getCommands().get(7).getCommand(), is("Button BAZ Click")); assertThat(server.getCommands().get(8).getCommand(), is("Button TEARDOWN Click")); String xml = new ScriptReportHelper().createDetailReport(result).toXMLDocument(); String html = new DetailReportHtml().createDetailReportHtml(result, xml); assertThat(html, containsString("class=\"span24\"")); assertThat(html, containsString("class=\"offset1 span23\"")); assertThat(html, containsString("class=\"offset2 span22\"")); assertThat(html, containsString("class=\"offset3 span21\"")); assertThat( html, allOf(containsString("1</span><b>Suite</b> suite.mts <b>Run</b>"), containsString("2</span><b>Test</b> foo.mt <b>Run</b>"), containsString("3</span><b>Setup</b> up.mt <b>Run</b>"), containsString("4</span><b>Button</b> SETUP <b>Click</b>"), containsString("5</span><b>Button</b> FOO <b>Click</b>"), containsString("6</span><b>Teardown</b> down.mt <b>Run</b>"), containsString("7</span><b>Button</b> TEARDOWN <b>Click</b>"), containsString("8</span><b>Test</b> bar.mt <b>Run</b>"), containsString("9</span><b>Setup</b> up.mt <b>Run</b>"), containsString("10</span><b>Button</b> SETUP <b>Click</b>"), containsString("11</span><b>Button</b> BAR <b>Click</b>"), containsString("12</span><b>Teardown</b> down.mt <b>Run</b>"), containsString("13</span><b>Button</b> TEARDOWN <b>Click</b>"), containsString("14</span><b>Test</b> baz.mt <b>Run</b>"), containsString("15</span><b>Setup</b> up.mt <b>Run</b>"), containsString("16</span><b>Button</b> SETUP <b>Click</b>"), containsString("17</span><b>Button</b> BAZ <b>Click</b>"), containsString("18</span><b>Teardown</b> down.mt <b>Run</b>"), containsString("19</span><b>Button</b> TEARDOWN <b>Click</b>"))); } @Test public void testSuiteWithDataDrivenTest() throws Exception { File dir = tempDir(); tempScript("data.csv", "name\nJoe\n\"Bo Bo\"\nCharlie\n", dir); tempScript("foo.mt", "Vars * Define name\nButton FOO-${name} Tap", dir); tempScript("up.mt", "Button UP Tap", dir); tempScript("down.mt", "Button DOWN Tap", dir); File suite = tempScript("suite.mts", "Test foo.mt RunWith data.csv\nSetup up.mt Run\nTeardown down.mt Run", dir); SuiteProcessor processor = new SuiteProcessor(HOST, PORT, dir); processor.setReportDir(dir); CommandServer server = new CommandServer(PORT); PlaybackResult result = processor.runSuite(suite.getName()); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); List<Command> cmds = server.getCommands(); assertThat(cmds.size(), is(9)); assertThat(cmds.get(0).getCommand(), is("Button UP Tap")); assertThat(cmds.get(1).getCommand(), is("Button FOO-Joe Tap")); assertThat(cmds.get(2).getCommand(), is("Button DOWN Tap")); assertThat(cmds.get(3).getCommand(), is("Button UP Tap")); assertThat(cmds.get(4).getCommand(), is("Button \"FOO-Bo Bo\" Tap")); assertThat(cmds.get(5).getCommand(), is("Button DOWN Tap")); assertThat(cmds.get(6).getCommand(), is("Button UP Tap")); assertThat(cmds.get(7).getCommand(), is("Button FOO-Charlie Tap")); assertThat(cmds.get(8).getCommand(), is("Button DOWN Tap")); String xml = new ScriptReportHelper().createDetailReport(result).toXMLDocument(); String html = new DetailReportHtml().createDetailReportHtml(result, xml); assertThat(html, containsString("class=\"span24\"")); assertThat(html, containsString("class=\"offset1 span23\"")); assertThat(html, containsString("class=\"offset2 span22\"")); assertThat(html, containsString("class=\"offset3 span21\"")); assertThat(html, containsString("class=\"offset4 span20\"")); assertThat(html, not(containsString("class=\"offset5 span19\""))); assertThat(html, containsString("1</span><b>Suite</b> suite.mts <b>Run</b>")); assertThat(html, containsString("2</span><b>Test</b> foo.mt <b>RunWith</b> data.csv")); assertThat(html, containsString("3</span><b>Test</b> foo.mt <b>RunWith</b> data.csv[@1]")); assertThat(html, containsString("4</span><b>Setup</b> up.mt <b>Run</b>")); assertThat(html, containsString("5</span><b>Button</b> UP <b>Tap</b>")); assertThat(html, containsString("6</span><b>Vars</b> * <b>Define</b> name")); assertThat(html, containsString("7</span><b>Button</b> FOO-Joe <b>Tap</b>")); assertThat(html, containsString("8</span><b>Teardown</b> down.mt <b>Run</b>")); assertThat(html, containsString("9</span><b>Button</b> DOWN <b>Tap</b>")); assertThat(html, containsString("10</span><b>Test</b> foo.mt <b>RunWith</b> data.csv[@2]")); assertThat(html, containsString("11</span><b>Setup</b> up.mt <b>Run</b>")); assertThat(html, containsString("12</span><b>Button</b> UP <b>Tap</b>")); assertThat(html, containsString("13</span><b>Vars</b> * <b>Define</b> name")); assertThat(html, containsString("14</span><b>Button</b> "FOO-Bo Bo" <b>Tap</b>")); assertThat(html, containsString("15</span><b>Teardown</b> down.mt <b>Run</b>")); assertThat(html, containsString("16</span><b>Button</b> DOWN <b>Tap</b>")); assertThat(html, containsString("17</span><b>Test</b> foo.mt <b>RunWith</b> data.csv[@3]")); assertThat(html, containsString("18</span><b>Setup</b> up.mt <b>Run</b>")); assertThat(html, containsString("19</span><b>Button</b> UP <b>Tap</b>")); assertThat(html, containsString("20</span><b>Vars</b> * <b>Define</b> name")); assertThat(html, containsString("21</span><b>Button</b> FOO-Charlie <b>Tap</b>")); assertThat(html, containsString("22</span><b>Teardown</b> down.mt <b>Run</b>")); assertThat(html, containsString("23</span><b>Button</b> DOWN <b>Tap</b>")); } @Test public void testSuiteWithDataDrivenTeardown() throws Exception { File dir = tempDir(); tempScript("data.csv", "name\nJoe\n\"Bo Bo\"\nCharlie\n", dir); tempScript("foo.mt", "Button Test Click", dir); tempScript("bar.mt", "Button ${name} Click", dir); File suite = tempScript("suite.mts", "Test foo.mt Run\nTeardown bar.mt RunWith data.csv", dir); SuiteProcessor processor = new SuiteProcessor(HOST, PORT, dir); processor.setReportDir(dir); CommandServer server = new CommandServer(PORT); PlaybackResult result = processor.runSuite(suite.getName()); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(4)); assertThat(server.getCommands().get(0).getCommand(), is("Button Test Click")); assertThat(server.getCommands().get(1).getCommand(), is("Button Joe Click")); assertThat(server.getCommands().get(2).getCommand(), is("Button \"Bo Bo\" Click")); assertThat(server.getCommands().get(3).getCommand(), is("Button Charlie Click")); String xml = new ScriptReportHelper().createDetailReport(result).toXMLDocument(); String html = new DetailReportHtml().createDetailReportHtml(result, xml); assertThat(html, containsString("class=\"span24\"")); assertThat(html, containsString("class=\"offset1 span23\"")); assertThat(html, containsString("class=\"offset2 span22\"")); assertThat(html, containsString("class=\"offset3 span21\"")); assertThat( html, allOf(containsString("1</span><b>Suite</b> suite.mts <b>Run</b>"), containsString("2</span><b>Test</b> foo.mt <b>Run</b>"), containsString("3</span><b>Button</b> Test <b>Click</b>"), containsString("4</span><b>Teardown</b> bar.mt <b>RunWith</b> data.csv"), containsString("5</span><b>Teardown</b> bar.mt <b>RunWith</b> data.csv[@1]"), containsString("6</span><b>Button</b> Joe <b>Click</b>"), containsString("7</span><b>Teardown</b> bar.mt <b>RunWith</b> data.csv[@2]"), containsString("8</span><b>Button</b> "Bo Bo" <b>Click</b>"), containsString("9</span><b>Teardown</b> bar.mt <b>RunWith</b> data.csv[@3]"), containsString("10</span><b>Button</b> Charlie <b>Click</b>"))); } @Test public void testSuiteWithErrorsFailuresSkips() throws Exception { File dir = tempDir(); tempScript("err.csv", "name\nAlice\n\"Bo Bo\"\nJOE\nCharlie\n", dir); tempScript("fail.csv", "name\nDale\n\"Easy E\"\nFRED\nGeorge\n", dir); tempScript("foo.mt", "Vars * Define name\nButton FOO-${name} Tap", dir); tempScript("up.mt", "Button UP Tap", dir); tempScript("down.mt", "Button DOWN Tap", dir); File suite = tempScript("suite.mts", "Test foo.mt Run FOO\nTest foo.mt Run FOO2 %ignore=true\n" + "Test foo.mt RunWith err.csv\nTest foo.mt RunWith fail.csv\n" + "Setup up.mt Run\nTeardown down.mt Run", dir); SuiteProcessor processor = new SuiteProcessor(HOST, PORT, dir); processor.setReportDir(dir); CommandServer server = new ErrorOnJoeAndFailOnFredServer(PORT); PlaybackResult result = processor.runSuite(suite.getName()); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); List<Command> cmds = server.getCommands(); assertThat(cmds.size(), is(25)); assertThat(cmds.get(0).getCommand(), is("Button UP Tap")); assertThat(cmds.get(1).getCommand(), is("Button FOO-FOO Tap")); assertThat(cmds.get(2).getCommand(), is("Button DOWN Tap")); assertThat(cmds.get(3).getCommand(), is("Button UP Tap")); assertThat(cmds.get(4).getCommand(), is("Button FOO-Alice Tap")); assertThat(cmds.get(5).getCommand(), is("Button DOWN Tap")); assertThat(cmds.get(6).getCommand(), is("Button UP Tap")); assertThat(cmds.get(7).getCommand(), is("Button \"FOO-Bo Bo\" Tap")); assertThat(cmds.get(8).getCommand(), is("Button DOWN Tap")); assertThat(cmds.get(9).getCommand(), is("Button UP Tap")); assertThat(cmds.get(10).getCommand(), is("Button DOWN Tap")); assertThat(cmds.get(11).getCommand(), is("Button UP Tap")); assertThat(cmds.get(12).getCommand(), is("Button FOO-Charlie Tap")); assertThat(cmds.get(13).getCommand(), is("Button DOWN Tap")); assertThat(cmds.get(14).getCommand(), is("Button UP Tap")); assertThat(cmds.get(15).getCommand(), is("Button FOO-Dale Tap")); assertThat(cmds.get(16).getCommand(), is("Button DOWN Tap")); assertThat(cmds.get(17).getCommand(), is("Button UP Tap")); assertThat(cmds.get(18).getCommand(), is("Button \"FOO-Easy E\" Tap")); assertThat(cmds.get(19).getCommand(), is("Button DOWN Tap")); assertThat(cmds.get(20).getCommand(), is("Button UP Tap")); assertThat(cmds.get(21).getCommand(), is("Button DOWN Tap")); assertThat(cmds.get(22).getCommand(), is("Button UP Tap")); assertThat(cmds.get(23).getCommand(), is("Button FOO-George Tap")); assertThat(cmds.get(24).getCommand(), is("Button DOWN Tap")); String xml = new ScriptReportHelper().createDetailReport(result).toXMLDocument(); String html = new DetailReportHtml().createDetailReportHtml(result, xml); html = html.replaceAll("span", "s").replaceAll("\"", "'"); assertThat(html, containsString("class='s24'")); assertThat(html, containsString("class='offset1 s23'")); assertThat(html, containsString("class='offset2 s22'")); assertThat(html, containsString("class='offset3 s21'")); assertThat(html, containsString("class='offset4 s20'")); assertThat(html, not(containsString("class='offset5 s19'"))); assertThat( html, containsString("class='pbox pbox-error'><s class='idx'>1</s><b>Suite</b> suite.mts <b>Run</b>")); assertThat(html, containsString("<s>10 tests</s>")); assertThat(html, containsString("<s class='text-error'>1 error</s>")); assertThat(html, containsString("<s class='text-warning'>1 failure</s>")); assertThat(html, containsString("<s class='text-info'>1 skipped</s>")); assertThat( html, containsString("pbox pbox-success'><s class='idx'>10</s><b>Test</b> foo.mt <b>RunWith</b> err.csv")); assertThat(html, containsString("3</s><b>Setup</b> up.mt <b>Run</b>")); assertThat(html, containsString("4</s><b>Button</b> UP <b>Tap</b>")); assertThat(html, containsString("5</s><b>Vars</b> * <b>Define</b> name")); assertThat(html, containsString("6</s><b>Button</b> FOO-FOO <b>Tap</b>")); assertThat(html, containsString("7</s><b>Teardown</b> down.mt <b>Run</b>")); assertThat(html, containsString("8</s><b>Button</b> DOWN <b>Tap</b>")); assertThat(html, containsString("9</s><b>Test</b> foo.mt <b>Run</b> FOO2")); assertThat(html, containsString("10</s><b>Test</b> foo.mt <b>RunWith</b> err.csv")); assertThat(html, containsString("11</s><b>Test</b> foo.mt <b>RunWith</b> err.csv[@1]")); assertThat(html, containsString("12</s><b>Setup</b> up.mt <b>Run</b>")); assertThat(html, containsString("13</s><b>Button</b> UP <b>Tap</b>")); assertThat(html, containsString("14</s><b>Vars</b> * <b>Define</b> name")); assertThat(html, containsString("15</s><b>Button</b> FOO-Alice <b>Tap</b>")); assertThat(html, containsString("16</s><b>Teardown</b> down.mt <b>Run</b>")); assertThat(html, containsString("17</s><b>Button</b> DOWN <b>Tap</b>")); assertThat(html, containsString("18</s><b>Test</b> foo.mt <b>RunWith</b> err.csv[@2]")); assertThat(html, containsString("19</s><b>Setup</b> up.mt <b>Run</b>")); assertThat(html, containsString("20</s><b>Button</b> UP <b>Tap</b>")); assertThat(html, containsString("21</s><b>Vars</b> * <b>Define</b> name")); assertThat(html, containsString("22</s><b>Button</b> "FOO-Bo Bo" <b>Tap</b>")); assertThat(html, containsString("23</s><b>Teardown</b> down.mt <b>Run</b>")); assertThat(html, containsString("24</s><b>Button</b> DOWN <b>Tap</b>")); assertThat(html, containsString("25</s><b>Test</b> foo.mt <b>RunWith</b> err.csv[@3]")); assertThat(html, containsString("26</s><b>Setup</b> up.mt <b>Run</b>")); assertThat(html, containsString("27</s><b>Button</b> UP <b>Tap</b>")); assertThat(html, containsString("28</s><b>Vars</b> * <b>Define</b> name")); assertThat(html, containsString("29</s><b>Button</b> FOO-JOE <b>Tap</b>")); assertThat(html, containsString("30</s><b>Teardown</b> down.mt <b>Run</b>")); assertThat(html, containsString("31</s><b>Button</b> DOWN <b>Tap</b>")); assertThat(html, containsString("32</s><b>Test</b> foo.mt <b>RunWith</b> err.csv[@4]")); assertThat(html, containsString("33</s><b>Setup</b> up.mt <b>Run</b>")); assertThat(html, containsString("34</s><b>Button</b> UP <b>Tap</b>")); assertThat(html, containsString("35</s><b>Vars</b> * <b>Define</b> name")); assertThat(html, containsString("36</s><b>Button</b> FOO-Charlie <b>Tap</b>")); assertThat(html, containsString("37</s><b>Teardown</b> down.mt <b>Run</b>")); assertThat(html, containsString("38</s><b>Button</b> DOWN <b>Tap</b>")); assertThat(html, containsString("39</s><b>Test</b> foo.mt <b>RunWith</b> fail.csv")); assertThat(html, containsString("40</s><b>Test</b> foo.mt <b>RunWith</b> fail.csv[@1]")); assertThat(html, containsString("41</s><b>Setup</b> up.mt <b>Run</b>")); assertThat(html, containsString("42</s><b>Button</b> UP <b>Tap</b>")); assertThat(html, containsString("43</s><b>Vars</b> * <b>Define</b> name")); assertThat(html, containsString("44</s><b>Button</b> FOO-Dale <b>Tap</b>")); assertThat(html, containsString("45</s><b>Teardown</b> down.mt <b>Run</b>")); assertThat(html, containsString("46</s><b>Button</b> DOWN <b>Tap</b>")); assertThat(html, containsString("47</s><b>Test</b> foo.mt <b>RunWith</b> fail.csv[@2]")); assertThat(html, containsString("48</s><b>Setup</b> up.mt <b>Run</b>")); assertThat(html, containsString("49</s><b>Button</b> UP <b>Tap</b>")); assertThat(html, containsString("50</s><b>Vars</b> * <b>Define</b> name")); assertThat(html, containsString("51</s><b>Button</b> "FOO-Easy E" <b>Tap</b>")); assertThat(html, containsString("52</s><b>Teardown</b> down.mt <b>Run</b>")); assertThat(html, containsString("53</s><b>Button</b> DOWN <b>Tap</b>")); assertThat(html, containsString("54</s><b>Test</b> foo.mt <b>RunWith</b> fail.csv[@3]")); assertThat(html, containsString("55</s><b>Setup</b> up.mt <b>Run</b>")); assertThat(html, containsString("56</s><b>Button</b> UP <b>Tap</b>")); assertThat(html, containsString("57</s><b>Vars</b> * <b>Define</b> name")); assertThat(html, containsString("58</s><b>Button</b> FOO-FRED <b>Tap</b>")); assertThat(html, containsString("59</s><b>Teardown</b> down.mt <b>Run</b>")); assertThat(html, containsString("60</s><b>Button</b> DOWN <b>Tap</b>")); assertThat(html, containsString("61</s><b>Test</b> foo.mt <b>RunWith</b> fail.csv[@4]")); assertThat(html, containsString("62</s><b>Setup</b> up.mt <b>Run</b>")); assertThat(html, containsString("63</s><b>Button</b> UP <b>Tap</b>")); assertThat(html, containsString("64</s><b>Vars</b> * <b>Define</b> name")); assertThat(html, containsString("65</s><b>Button</b> FOO-George <b>Tap</b>")); assertThat(html, containsString("66</s><b>Teardown</b> down.mt <b>Run</b>")); assertThat(html, containsString("67</s><b>Button</b> DOWN <b>Tap</b>")); } @Test public void testSuiteOfSuites() throws Exception { File dir = tempDir(); tempScript("foo.mt", "Button FOO Tap", dir); tempScript("foo2.mt", "Button FOO2 Tap", dir); tempScript("bar.mt", "Button BAR Tap", dir); tempScript("bar2.mt", "Button BAR2 Tap", dir); tempScript("baz.mt", "Button BAZ Tap", dir); tempScript("suite.mts", "Test foo.mt Run\nSuite s2.mts Run\nTest foo2.mt Run", dir); tempScript("s2.mts", "Test bar.mt Run\nSuite s3.mts Run\nTest bar2.mt Run", dir); tempScript("s3.mts", "Test baz.mt Run", dir); SuiteProcessor processor = new SuiteProcessor(HOST, PORT, dir); processor.setReportDir(dir); CommandServer server = new CommandServer(PORT); PlaybackResult result = processor.runSuite("suite.mts"); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(5)); assertThat(server.getCommands().get(0).getCommand(), is("Button FOO Tap")); assertThat(server.getCommands().get(1).getCommand(), is("Button BAR Tap")); assertThat(server.getCommands().get(2).getCommand(), is("Button BAZ Tap")); assertThat(server.getCommands().get(3).getCommand(), is("Button BAR2 Tap")); assertThat(server.getCommands().get(4).getCommand(), is("Button FOO2 Tap")); String xml = new ScriptReportHelper().createDetailReport(result).toXMLDocument(); String html = new DetailReportHtml().createDetailReportHtml(result, xml); assertThat(html, containsString("class=\"span24\"")); assertThat(html, containsString("class=\"offset1 span23\"")); assertThat(html, containsString("class=\"offset2 span22\"")); assertThat(html, containsString("class=\"offset3 span21\"")); assertThat(html, containsString("class=\"offset4 span20\"")); assertThat(html, not(containsString("class=\"offset5 span19\""))); assertThat(html, containsString("1</span><b>Suite</b> suite.mts <b>Run</b>")); assertThat(html, containsString("2</span><b>Test</b> foo.mt <b>Run</b>")); assertThat(html, containsString("3</span><b>Button</b> FOO <b>Tap</b>")); assertThat(html, containsString("4</span><b>Suite</b> s2.mts <b>Run</b>")); assertThat(html, containsString("5</span><b>Test</b> bar.mt <b>Run</b>")); assertThat(html, containsString("6</span><b>Button</b> BAR <b>Tap</b>")); assertThat(html, containsString("7</span><b>Suite</b> s3.mts <b>Run</b>")); assertThat(html, containsString("8</span><b>Test</b> baz.mt <b>Run</b>")); assertThat(html, containsString("9</span><b>Button</b> BAZ <b>Tap</b>")); assertThat(html, containsString("10</span><b>Test</b> bar2.mt <b>Run</b>")); assertThat(html, containsString("11</span><b>Button</b> BAR2 <b>Tap</b>")); assertThat(html, containsString("12</span><b>Test</b> foo2.mt <b>Run</b>")); assertThat(html, containsString("13</span><b>Button</b> FOO2 <b>Tap</b>")); } @Test public void testSuiteOfSuitesComplex() throws Exception { File dir = tempDir(); tempScript("data.csv", "name\nAlice\n\"Bo Bo\"\nCharlie", dir); tempScript("up.mt", "Button UP Tap", dir); tempScript("down.mt", "Button DOWN Tap", dir); tempScript("u2.mt", "Button UP2 Tap", dir); tempScript("d2.mt", "Button DOWN2 Tap", dir); tempScript("u3.mt", "Button UP3 Tap", dir); tempScript("d3.mt", "Button DOWN3 Tap", dir); tempScript("foo.mt", "Button FOO Tap", dir); tempScript("foo2.mt", "Button FOO2 Tap", dir); tempScript("bar.mt", "Button BAR${name} Tap", dir); tempScript("bar2.mt", "Button BAR2 Tap", dir); tempScript("baz.mt", "Button BAZ Tap", dir); tempScript("baz2.mt", "Button BAZ2 Tap", dir); tempScript("suite.mts", "Test foo.mt Run\nSuite s2.mts Run\nTest foo2.mt Run %ignore=setup,teardown\n" + "Setup up.mt Run\nTeardown down.mt Run", dir); tempScript("s2.mts", "Test bar.mt RunWith data.csv %ignore=setup\nSuite s3.mts Run\nTest bar2.mt Run %ignore=teardown\n" + "Setup u2.mt Run\nTeardown d2.mt Run", dir); tempScript("s3.mts", "Test baz.mt Run\nTest baz2.mt Run %ignore=true\n" + "Setup u3.mt Run\nTeardown d3.mt Run\nSuite s4.mts Run %ignore=true", dir); SuiteProcessor processor = new SuiteProcessor(HOST, PORT, dir); processor.setReportDir(dir); CommandServer server = new CommandServer(PORT); PlaybackResult result = processor.runSuite("suite.mts"); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); assertThat(server.getCommands(), notNullValue()); assertThat(server.getCommands().size(), is(15)); assertThat(server.getCommands().get(0).getCommand(), is("Button UP Tap")); assertThat(server.getCommands().get(1).getCommand(), is("Button FOO Tap")); assertThat(server.getCommands().get(2).getCommand(), is("Button DOWN Tap")); assertThat(server.getCommands().get(3).getCommand(), is("Button BARAlice Tap")); assertThat(server.getCommands().get(4).getCommand(), is("Button DOWN2 Tap")); assertThat(server.getCommands().get(5).getCommand(), is("Button \"BARBo Bo\" Tap")); assertThat(server.getCommands().get(6).getCommand(), is("Button DOWN2 Tap")); assertThat(server.getCommands().get(7).getCommand(), is("Button BARCharlie Tap")); assertThat(server.getCommands().get(8).getCommand(), is("Button DOWN2 Tap")); assertThat(server.getCommands().get(9).getCommand(), is("Button UP3 Tap")); assertThat(server.getCommands().get(10).getCommand(), is("Button BAZ Tap")); assertThat(server.getCommands().get(11).getCommand(), is("Button DOWN3 Tap")); assertThat(server.getCommands().get(12).getCommand(), is("Button UP2 Tap")); assertThat(server.getCommands().get(13).getCommand(), is("Button BAR2 Tap")); assertThat(server.getCommands().get(14).getCommand(), is("Button FOO2 Tap")); String xml = new ScriptReportHelper().createDetailReport(result).toXMLDocument(); String html = new DetailReportHtml().createDetailReportHtml(result, xml); assertThat(html, containsString("class=\"span24\"")); assertThat(html, containsString("class=\"offset1 span23\"")); assertThat(html, containsString("class=\"offset2 span22\"")); assertThat(html, containsString("class=\"offset3 span21\"")); assertThat(html, containsString("class=\"offset4 span20\"")); assertThat(html, containsString("class=\"offset5 span19\"")); assertThat(html, not(containsString("class=\"offset6 span18\""))); assertThat(html, containsString("1</span><b>Suite</b> suite.mts <b>Run</b>")); assertThat(html, containsString("2</span><b>Test</b> foo.mt <b>Run</b>")); assertThat(html, containsString("3</span><b>Setup</b> up.mt <b>Run</b>")); assertThat(html, containsString("4</span><b>Button</b> UP <b>Tap</b>")); assertThat(html, containsString("5</span><b>Button</b> FOO <b>Tap</b>")); assertThat(html, containsString("6</span><b>Teardown</b> down.mt <b>Run</b>")); assertThat(html, containsString("7</span><b>Button</b> DOWN <b>Tap</b>")); assertThat(html, containsString("8</span><b>Suite</b> s2.mts <b>Run</b>")); assertThat(html, containsString("9</span><b>Test</b> bar.mt <b>RunWith</b>")); assertThat(html, containsString("10</span><b>Test</b> bar.mt <b>RunWith</b> data.csv[@1]")); assertThat(html, containsString("11</span><b>Button</b> BARAlice <b>Tap</b>")); assertThat(html, containsString("12</span><b>Teardown</b> d2.mt <b>Run</b>")); assertThat(html, containsString("13</span><b>Button</b> DOWN2 <b>Tap</b>")); assertThat(html, containsString("14</span><b>Test</b> bar.mt <b>RunWith</b> data.csv[@2]")); assertThat(html, containsString("15</span><b>Button</b> "BARBo Bo" <b>Tap</b>")); assertThat(html, containsString("16</span><b>Teardown</b> d2.mt <b>Run</b>")); assertThat(html, containsString("17</span><b>Button</b> DOWN2 <b>Tap</b>")); assertThat(html, containsString("18</span><b>Test</b> bar.mt <b>RunWith</b> data.csv[@3]")); assertThat(html, containsString("19</span><b>Button</b> BARCharlie <b>Tap</b>")); assertThat(html, containsString("20</span><b>Teardown</b> d2.mt <b>Run</b>")); assertThat(html, containsString("21</span><b>Button</b> DOWN2 <b>Tap</b>")); assertThat(html, containsString("22</span><b>Suite</b> s3.mts <b>Run</b>")); assertThat(html, containsString("23</span><b>Test</b> baz.mt <b>Run</b>")); assertThat(html, containsString("24</span><b>Setup</b> u3.mt <b>Run</b>")); assertThat(html, containsString("25</span><b>Button</b> UP3 <b>Tap</b>")); } @Test public void testScriptWithUnicode() throws Exception { File dir = tempDir(); File foo = tempScript("foo.mt", "Button Héìíô\u21D0\u21D1\u21DD\u21DC Click", dir); ScriptProcessor processor = new ScriptProcessor(HOST, PORT, dir); assertThat(processor.toString(), containsString(foo.getName())); CommandServer server = new CommandServer(PORT); processor.setPlaybackListener(LISTENER_WITH_OUTPUT); PlaybackResult result = processor.runScript("foo.mt"); server.stop(); assertThat("FAIL: " + result, result.getStatus(), is(PlaybackStatus.OK)); String xml = new ScriptReportHelper().createDetailReport(result).toXMLDocument(); String html = new DetailReportHtml().createDetailReportHtml(result, xml); assertThat(html, containsString("class=\"span24\"")); assertThat(html, containsString("class=\"offset1 span23\"")); assertThat(html, containsString("1</span><b>Script</b> foo.mt <b>Run</b>")); assertThat(html, containsString("2</span><b>Button</b> Héìíô⇐⇑⇝⇜ <b>Click</b>")); } private class ErrorOnJoeAndFailOnFredServer extends TestHelper.CommandServer { public ErrorOnJoeAndFailOnFredServer(int port) throws IOException { super(port); } @Override public Response serve(String uri, String method, Map<String, String> headers, JSONObject json) { if (json.toString().toLowerCase().contains("joe")) { return new Response(HttpStatus.OK, "{result:\"ERROR\",message:\"error on Joe\"}"); } else if (json.toString().toLowerCase().contains("fred")) { return new Response(HttpStatus.OK, "{result:\"FAILURE\",message:\"fail on Fred\"}"); } else { return super.serve(uri, method, headers, json); } } } }