Java tutorial
/* * Copyright 2016 Robert Winkler * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package io.github.swagger2markup; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Maps; import com.google.common.collect.Sets; import io.github.swagger2markup.assertions.DiffUtils; import io.github.swagger2markup.builder.Swagger2MarkupConfigBuilder; import io.github.swagger2markup.markup.builder.MarkupLanguage; import org.apache.commons.io.FileUtils; import org.junit.Before; import org.junit.Test; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.*; import static java.util.Arrays.asList; import static org.assertj.core.api.Assertions.fail; import static org.assertj.core.api.BDDAssertions.assertThat; public class MarkdownConverterTest { private static final Logger LOG = LoggerFactory.getLogger(MarkdownConverterTest.class); private static final String[] EXPECTED_FILES = new String[] { "definitions.md", "overview.md", "paths.md", "security.md" }; private List<String> expectedFiles; /** * Given a markdown document to search, this checks to see if the specified tables * have all of the expected fields listed. * Match is a "search", and not an "equals" match. * * @param doc markdown document file to inspect * @param fieldsByTable map of table name (header) to field names expected * to be found in that table. * @throws IOException if the markdown document could not be read */ private static void verifyMarkdownContainsFieldsInTables(File doc, Map<String, Set<String>> fieldsByTable) throws IOException { //TODO: This method is too complex, split it up in smaller methods to increase readability final List<String> lines = Files.readAllLines(doc.toPath(), Charset.defaultCharset()); final Map<String, Set<String>> fieldsLeftByTable = Maps.newHashMap(); for (Map.Entry<String, Set<String>> entry : fieldsByTable.entrySet()) { fieldsLeftByTable.put(entry.getKey(), Sets.newHashSet(entry.getValue())); } String inTable = null; for (String line : lines) { // If we've found every field we care about, quit early if (fieldsLeftByTable.isEmpty()) { return; } // Transition to a new table if we encounter a header final String currentHeader = getTableHeader(line); if (inTable == null || currentHeader != null) { inTable = currentHeader; } // If we're in a table that we care about, inspect this potential table row if (inTable != null && fieldsLeftByTable.containsKey(inTable)) { // If we're still in a table, read the row and check for the field name // NOTE: If there was at least one pipe, then there's at least 2 fields String[] parts = line.split("\\|"); if (parts.length > 1) { final String fieldName = parts[1]; final Set<String> fieldsLeft = fieldsLeftByTable.get(inTable); // Mark the field as found and if this table has no more fields to find, // remove it from the "fieldsLeftByTable" map to mark the table as done Iterator<String> fieldIt = fieldsLeft.iterator(); while (fieldIt.hasNext()) { String fieldLeft = fieldIt.next(); if (fieldName.contains(fieldLeft)) fieldIt.remove(); } if (fieldsLeft.isEmpty()) { fieldsLeftByTable.remove(inTable); } } } } // After reading the file, if there were still types, fail if (!fieldsLeftByTable.isEmpty()) { fail(String.format("Markdown file '%s' did not contain expected fields (by table): %s", doc, fieldsLeftByTable)); } } private static String getTableHeader(String line) { return line.startsWith("###") ? line.replace("###", "").trim() : null; } @Before public void setUp() { expectedFiles = new ArrayList<>(asList(EXPECTED_FILES)); } @Test public void testToFolder() throws IOException, URISyntaxException { //Given Path file = Paths.get(MarkdownConverterTest.class.getResource("/yaml/swagger_petstore.yaml").toURI()); Path outputDirectory = Paths.get("build/test/markdown/to_folder"); FileUtils.deleteQuietly(outputDirectory.toFile()); //When Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder().withMarkupLanguage(MarkupLanguage.MARKDOWN) .build(); Swagger2MarkupConverter.from(file).withConfig(config).build().toFolder(outputDirectory); //Then String[] files = outputDirectory.toFile().list(); assertThat(files).hasSize(4).containsAll(expectedFiles); Path expectedFilesDirectory = Paths .get(AsciidocConverterTest.class.getResource("/expected/markdown/to_folder").toURI()); DiffUtils.assertThatAllFilesAreEqual(expectedFilesDirectory, outputDirectory, "testToFolder.html"); } @Test public void testWithInterDocumentCrossReferences() throws IOException, URISyntaxException { //Given Path file = Paths.get(AsciidocConverterTest.class.getResource("/yaml/swagger_petstore.yaml").toURI()); Path outputDirectory = Paths.get("build/test/markdown/idxref"); FileUtils.deleteQuietly(outputDirectory.toFile()); //When Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder().withMarkupLanguage(MarkupLanguage.MARKDOWN) .withInterDocumentCrossReferences().build(); Swagger2MarkupConverter.from(file).withConfig(config).build().toFolder(outputDirectory); //Then String[] files = outputDirectory.toFile().list(); assertThat(files).hasSize(4).containsAll(expectedFiles); Path expectedFilesDirectory = Paths .get(AsciidocConverterTest.class.getResource("/expected/markdown/idxref").toURI()); DiffUtils.assertThatAllFilesAreEqual(expectedFilesDirectory, outputDirectory, "testWithInterDocumentCrossReferences.html"); } @Test public void testWithSeparatedDefinitions() throws IOException, URISyntaxException { //Given Path file = Paths.get(MarkdownConverterTest.class.getResource("/yaml/swagger_petstore.yaml").toURI()); Path outputDirectory = Paths.get("build/test/markdown/generated"); FileUtils.deleteQuietly(outputDirectory.toFile()); //When Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder().withSeparatedDefinitions() .withMarkupLanguage(MarkupLanguage.MARKDOWN).build(); Swagger2MarkupConverter.from(file).withConfig(config).build().toFolder(outputDirectory); //Then String[] files = outputDirectory.toFile().list(); expectedFiles.add("definitions"); assertThat(files).hasSize(5).containsAll(expectedFiles); Path definitionsDirectory = outputDirectory.resolve("definitions"); String[] definitions = definitionsDirectory.toFile().list(); assertThat(definitions).hasSize(5) .containsAll(asList("Category.md", "Order.md", "Pet.md", "Tag.md", "User.md")); } @Test public void testWithResponseHeaders() throws IOException, URISyntaxException { //Given Path file = Paths .get(AsciidocConverterTest.class.getResource("/yaml/swagger_response_headers.yaml").toURI()); Path outputDirectory = Paths.get("build/test/markdown/response_headers"); FileUtils.deleteQuietly(outputDirectory.toFile()); //When Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder().withMarkupLanguage(MarkupLanguage.MARKDOWN) .build(); Swagger2MarkupConverter.from(file).withConfig(config).build().toFolder(outputDirectory); //Then String[] files = outputDirectory.toFile().list(); assertThat(files).hasSize(4).containsAll(expectedFiles); Path expectedFilesDirectory = Paths .get(AsciidocConverterTest.class.getResource("/expected/markdown/response_headers").toURI()); DiffUtils.assertThatAllFilesAreEqual(expectedFilesDirectory, outputDirectory, "testWithResponseHeaders.html"); } @Test public void testHandlesComposition() throws IOException, URISyntaxException { //Given Path file = Paths.get(MarkdownConverterTest.class.getResource("/yaml/swagger_petstore.yaml").toURI()); Path outputDirectory = Paths.get("build/test/markdown/generated"); FileUtils.deleteQuietly(outputDirectory.toFile()); //When Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder().withSeparatedDefinitions() .withMarkupLanguage(MarkupLanguage.MARKDOWN).build(); Swagger2MarkupConverter.from(file).withConfig(config).build().toFolder(outputDirectory); // Then String[] files = outputDirectory.toFile().list(); expectedFiles.add("definitions"); assertThat(files).hasSize(5).containsAll(expectedFiles); Path definitionsDirectory = outputDirectory.resolve("definitions"); verifyMarkdownContainsFieldsInTables(definitionsDirectory.resolve("User.md").toFile(), ImmutableMap.<String, Set<String>>builder().put("User", ImmutableSet.of("id", "username", "firstName", "lastName", "email", "password", "phone", "userStatus")).build()); } }