fujaba / fulib.org

The fulib web app: fulibScenarios, fulibWorkflows, Docs, Projects and Assignments in one app.
https://fulib.org
MIT License
5 stars 1 forks source link

check contents of Scenario.md (scenarioText), settings.gradle (projectName), bui... #343

Closed github-actions[bot] closed 1 year ago

github-actions[bot] commented 1 year ago

projectVersion), and MyDecorator.java (decoratorClassName, packageName)

https://api.github.com/fujaba/fulib.org/blob/1c9ac6c/backend/src/test/java/org/fulib/webapp/projectzip/ProjectZipControllerTest.java#L78


package org.fulib.webapp.projectzip;

import org.fulib.webapp.util.DelegatingServletOutputStream;
import org.junit.Test;
import spark.Request;
import spark.Response;

import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import static org.hamcrest.CoreMatchers.hasItems;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Mockito.*;

public class ProjectZipControllerTest
{
    private static final String[] EXPECTED_FILES = {
        ".gitignore",
        "settings.gradle",
        "build.gradle",
        "gradlew",
        "gradlew.bat",
        "gradle/wrapper/gradle-wrapper.jar",
        "gradle/wrapper/gradle-wrapper.properties",
        "src/gen/java/org/example/MyDecorator.java",
        "src/main/scenarios/org/example/Scenario.md",
    };

    @Test
    public void handle() throws IOException
    {
        final ProjectGenerator projectGenerator = new ProjectGenerator();
        final ProjectZipController projectZipController = new ProjectZipController(projectGenerator);

        final Request request = mock(Request.class);
        final String ip = "0.0.0.0";
        final String userAgent = "test/1.0";
        // language=JSON
        final String requestBody =
            "{\n" + "  \"packageName\": \"org.example\",\n" + "  \"scenarioFileName\": \"Scenario.md\",\n"
            + "  \"projectName\": \"myProject\",\n" + "  \"projectVersion\": \"1.2.3\",\n"
            + "  \"scenarioText\": \"# Test\\n\\nThere is a Student with name Alice.\",\n"
            + "  \"decoratorClassName\": \"MyDecorator\",\n" + "  \"privacy\": \"all\"\n" + "}";
        when(request.ip()).thenReturn(ip);
        when(request.userAgent()).thenReturn(userAgent);
        when(request.body()).thenReturn(requestBody);

        final Response response = mock(Response.class);
        final HttpServletResponse servletResponse = mock(HttpServletResponse.class);
        final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        when(response.raw()).thenReturn(servletResponse);
        when(servletResponse.getOutputStream()).thenReturn(new DelegatingServletOutputStream(outputStream));

        projectZipController.handle(request, response);

        verify(response).type("application/zip");

        final Set<String> files = new HashSet<>();

        final byte[] responseBytes = outputStream.toByteArray();
        try (final ZipInputStream zipInputStream = new ZipInputStream(new ByteArrayInputStream(responseBytes)))
        {
            ZipEntry entry;
            while ((entry = zipInputStream.getNextEntry()) != null)
            {
                files.add(entry.getName());
            }
        }

        assertThat(files, hasItems(EXPECTED_FILES));
        // TODO check contents of Scenario.md (scenarioText), settings.gradle (projectName), build.gradle (packageName,
        //  projectVersion), and MyDecorator.java (decoratorClassName, packageName)
    }
}