package org.openapitools.openapistylevalidator.gradle;

import org.gradle.testkit.runner.BuildResult;
import org.gradle.testkit.runner.GradleRunner;
import org.gradle.testkit.runner.TaskOutcome;
import org.junit.Test;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.nio.file.Files;

import static org.junit.jupiter.api.Assertions.assertEquals;

/**
 * A simple functional test for the 'org.openapitools.openapistylevalidator' plugin.
 */
public class OpenAPIStyleValidatorGradlePluginFunctionalTest {

    @Test
    public void validateWithOptionsMustBeASuccess() throws IOException {
        // Setup the test build
        File projectDir = new File("build/functionalTest");
        Files.createDirectories(projectDir.toPath());
        writeString(new File(projectDir, "openapi.yaml"),
                "openapi: 3.0.1\n" +
                        "info:\n" +
                        "  title: ping test\n" +
                        "  version: '1.0'\n" +
                        "servers:\n" +
                        "  - url: 'http://localhost:9999/'\n" +
                        "paths:\n" +
                        "  /ping:\n" +
                        "    post:\n" +
                        "      operationId: pingGet\n" +
                        "      responses:\n" +
                        "        '201':\n" +
                        "          description: OK");
        writeString(new File(projectDir, "settings.gradle"), "");
        writeString(new File(projectDir, "build.gradle"),
                "plugins {\n" +
                        "  id('org.openapitools.openapistylevalidator')\n" +
                        "}\n" +
                        "\n" +
                        "openAPIStyleValidator {\n" +
                        "    // set the input file option:\n" +
                        "    inputFile = file('openapi.yaml')\n" +
                        "\n" +
                        "    // customize the validation options:\n" +
                        "    validateInfoLicense = false\n" +
                        "    validateInfoDescription = false\n" +
                        "    validateInfoContact = false\n" +
                        "    validateOperationDescription = false\n" +
                        "    validateOperationTag = false\n" +
                        "    validateOperationSummary = false\n" +
                        "}");

        // Run the build
        GradleRunner runner = GradleRunner.create();
        runner.forwardOutput();
        runner.withPluginClasspath();
        runner.withArguments("openAPIStyleValidator");
        runner.withProjectDir(projectDir);
        BuildResult result = runner.build();

        // Verify the result
        assertEquals(TaskOutcome.SUCCESS, result.task(":openAPIStyleValidator").getOutcome());
    }

    private void writeString(File file, String string) throws IOException {
        try (Writer writer = new FileWriter(file)) {
            writer.write(string);
        }
    }
}