package de.cologneintelligence.fitgoodies.htmlparser; import org.jsoup.Jsoup; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import org.junit.Assert; import org.junit.Test; import java.io.IOException; import java.util.HashMap; import java.util.Map; import static org.hamcrest.CoreMatchers.*; import static org.junit.Assert.assertThat; public class FitTableTest { private static final String EMPTY_HTML_TABLE = "<table class=\"oldclass\"><tr><td></td></tr></table>"; private FitTable aTable(String html) { Element table = Jsoup.parseBodyFragment(html).select("table").first(); return new FitTable(table); } @Test public void argumentsAreSaved() { Element element = Jsoup.parseBodyFragment(EMPTY_HTML_TABLE).select("table").first(); FitTable table = new FitTable(element); assertThat(table.getTable(), is(sameInstance(element))); } @Test public void failuresAreReported() { FitTable table = aTable(EMPTY_HTML_TABLE); table.getCounts().wrong++; assertCssClasses(table, State.WRONG); } @Test public void exceptionsAreReported() { FitTable table = aTable(EMPTY_HTML_TABLE); table.getCounts().wrong++; table.getCounts().exceptions++; assertCssClasses(table, State.EXCEPTION); } @Test public void successIsReported() { FitTable table = aTable(EMPTY_HTML_TABLE); assertCssClasses(table, State.RIGHT); } @Test public void oldStyleFixtureClassIsFound() { FitTable table1 = aTable("<table><tr><td>myClass1</td></tr><tr><td>1</td></tr></table>"); FitTable table2 = aTable("<table><tr><td>myClass2</td></tr><tr><td>1</td></tr><tr><td>2</td></tr></table>"); assertThat(table1.getFixtureClass(), is(equalTo("myClass1"))); assertThat(table2.getFixtureClass(), is(equalTo("myClass2"))); assertThat(table1.rows().size(), is(1)); assertThat(table2.rows().size(), is(2)); } @Test public void newStyleFixtureClassIsFound() { FitTable table1 = aTable("<table data-fit-fixture=\"myClass1\"><tr><td>0</td></tr><tr><td>1</td></tr></table>"); FitTable table2 = aTable("<table data-fit-fixture=\"myClass2\"><tr><td>0</td></tr><tr><td>1</td></tr><tr><td>2</td></tr></table>"); assertThat(table1.getFixtureClass(), is(equalTo("myClass1"))); assertThat(table2.getFixtureClass(), is(equalTo("myClass2"))); assertThat(table1.rows().size(), is(2)); assertThat(table2.rows().size(), is(3)); } @Test public void nonIgnoredRowsAreForwarded() { FitTable table1 = aTable("<table data-fit-fixture=\"myClass1\"><tr><td>0</td></tr><tr data-fit-ignore=\"true\"><td>1</td></tr></table>"); FitTable table2 = aTable("<table data-fit-fixture=\"myClass2\"><tr data-fit-ignore=\"true\"><td>2</td></tr><tr><td>3</td></tr><tr><td>4</td></tr></table>"); assertThat(table1.rows().size(), is(1)); assertThat(table1.rows().get(0).getRow().text(), is(equalTo("0"))); assertThat(table2.rows().size(), is(2)); assertThat(table2.rows().get(0).getRow().text(), is(equalTo("3"))); assertThat(table2.rows().get(1).getRow().text(), is(equalTo("4"))); } @Test public void emptyTableLogsException() { Element element = Jsoup.parseBodyFragment("<table></table>").select("table").first(); try { new FitTable(element); Assert.fail("Expected exception from constructor"); } catch (IllegalArgumentException ignore) { } assertThat(element.select("td").size(), is(1)); assertCssClasses(element, State.EXCEPTION); } @Test public void classicTableDisplaysLastError() { Exception exception1 = new Exception("test1"); exception1.fillInStackTrace(); Exception exception2 = new Exception("test2"); exception2.fillInStackTrace(); FitTable table = aTable(EMPTY_HTML_TABLE); table.exception(exception1); table.exception(exception2); Elements tds = table.getTable().select("tr").first().select("td"); assertThat(tds.size(), is(2)); assertThat(tds.get(1).text().isEmpty(), is(true)); assertThat(tds.get(0).html(), containsString(ParserUtils.getHtmlStackTrace(exception2))); assertCssClasses(table, State.EXCEPTION); assertCounts(table, 0, 0, 2, 0); } @Test public void newStyleTableDisplaysLastError() { Exception exception1 = new Exception("test1"); exception1.fillInStackTrace(); FitTable table = aTable("<table class=\"oldclass\" data-fit-fixture=\"test\"><tr><td>content</td></tr></table>"); table.exception(exception1); Elements trs = table.getTable().select("tr"); assertThat(trs.size(), is(2)); assertThat(trs.get(0).select("td").first().html(), containsString(ParserUtils.getHtmlStackTrace(exception1))); Elements tds = trs.get(1).select("td"); assertThat(tds.get(0).text().isEmpty(), is(true)); assertThat(tds.get(1).text(), is(equalTo("content"))); assertCssClasses(table, State.EXCEPTION); assertCounts(table, 0, 0, 1, 0); } @Test public void newStyleArgumentsAreExported() { FitTable table1 = aTable("<table data-fit-fixture=\"\" data-fit-arg-FILE=\"file2\" data-fit-arg-dir=\"dir\"><tr><td>0</td></tr></table>"); FitTable table2 = aTable("<table data-fit-fixture=\"\" data-fit-arg-test=\"value\"><tr><td>0</td></tr></table>"); Map<String, String> args1 = new HashMap<>(); args1.put("file", "file2"); args1.put("dir", "dir"); Map<String, String> args2 = new HashMap<>(); args2.put("test", "value"); assertThat(table1.getArguments(), is(equalTo(args1))); assertThat(table2.getArguments(), is(equalTo(args2))); } @Test public void oldStyleArgumentsAreExported() { FitTable table1 = aTable("<table><tr><td></td><td>file=file2</td><td>DIR = dir</td><td>three</td></tr></table>"); FitTable table2 = aTable("<table><tr><td></td><td> test = value </td></tr></table>"); Map<String, String> args1 = new HashMap<>(); args1.put("file", "file2"); args1.put("0", "file2"); args1.put("dir", "dir"); args1.put("1", "dir"); args1.put("2", "three"); Map<String, String> args2 = new HashMap<>(); args2.put("test", "value"); args2.put("0", "value"); assertThat(table1.getArguments(), is(equalTo(args1))); assertThat(table2.getArguments(), is(equalTo(args2))); } @Test(expected = UnsupportedOperationException.class) public void tablesAreUnmodifiable() throws IOException { aTable(EMPTY_HTML_TABLE).rows().add(null); } @Test public void rowsCanStoreErrors() { FitTable table = aTable("<table data-fit-fixture=\"test\"><tr><td>1</td></tr><tr><td>2</td></tr><tr><td>3</td></tr></table>"); table.wrongRow(0, "message 1"); table.wrongRow(0, "message 2"); table.wrongRow(2, "message 3"); table.finishExecution(); final Elements trs = table.getTable().select("tr"); assertThat(trs.get(0).select("td").first().text(), is(equalTo("message 2"))); assertThat(trs.get(0).select("td").hasClass(Constants.CSS_WRONG), is(true)); assertThat(trs.get(1).select("td").hasClass(Constants.CSS_WRONG), is(false)); assertThat(trs.get(2).select("td").first().text(), is(equalTo("message 3"))); assertThat(trs.get(2).select("td").hasClass(Constants.CSS_WRONG), is(true)); assertCssClasses(table.getTable(), State.WRONG); assertCounts(table, 0, 2, 0, 0); } @Test public void rowsCanStoreExceptions() { FitTable table = aTable("<table data-fit-fixture=\"test\"><tr><td>1</td></tr><tr><td>2</td></tr><tr><td>3</td></tr></table>"); table.wrongRow(0, "message 1"); table.exceptionRow(0, "message 2"); table.wrongRow(0, "message 3"); table.wrongRow(2, "message 4"); table.finishExecution(); final Elements trs = table.getTable().select("tr"); assertThat(trs.get(0).select("td").first().text(), is(equalTo("message 2"))); assertThat(trs.get(0).select("td").hasClass(Constants.CSS_EXCEPTION), is(true)); assertCssClasses(table.getTable(), State.EXCEPTION); assertCounts(table, 0, 1, 1, 0); } private void assertCssClasses(FitTable table, State state) { table.finishExecution(); assertThat(table.getTable().hasClass("oldclass"), is(true)); assertCssClasses(table.getTable(), state); } private void assertCssClasses(Element table, State expectedState) { for (State state : State.values()) { if (state.cssClass != null) { assertThat(table.hasClass(state.cssClass), is(state == expectedState)); } } } private void assertCounts(FitTable table, int right, int wrong, int exceptions, int ignored) { assertThat(table.getCounts().right, is(right)); assertThat(table.getCounts().wrong, is(wrong)); assertThat(table.getCounts().exceptions, is(exceptions)); assertThat(table.getCounts().ignores, is(ignored)); } }