package com.fortitudetec.sonar.plugins.ruby.simplecov;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fortitudetec.sonar.plugins.ruby.RubyPlugin;
import com.fortitudetec.sonar.plugins.ruby.utils.TestUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.sonar.api.batch.fs.internal.DefaultInputFile;
import org.sonar.api.batch.sensor.coverage.CoverageType;
import org.sonar.api.batch.sensor.internal.SensorContextTester;

import java.io.File;
import java.net.URISyntaxException;
import java.net.URL;

import static org.assertj.core.api.Assertions.assertThat;

public class SimpleCovSensorTest {

    private static final ObjectMapper MAPPER = new ObjectMapper();

    private SensorContextTester context;
    private File rubyFile;

    @Before
    public void setUp() throws URISyntaxException {
        URL filePath = SimpleCovSensorTest.class.getClassLoader().getResource("./test_controller.rb");
        rubyFile = new File(filePath.toURI());

        context = SensorContextTester.create(rubyFile.getParentFile());
        context.settings().setProperty(RubyPlugin.TEST_FRAMEWORK, "RSpec");
        context.fileSystem().add(new DefaultInputFile("myProjectKey", "test_controller.rb")
                .setLanguage("rb")
                .setLines(15));
        context.fileSystem().add(new DefaultInputFile("myProjectKey", "unknown_file.rb")
                .setLanguage("rb")
                .setLines(10));

        TestUtils.buildResultSetFile(rubyFile);
    }

    @After
    public void tearDown() throws URISyntaxException {
        URL filePath = SimpleCovSensorTest.class.getClassLoader().getResource(".resultset.json");
        File resultFile = new File(filePath.toURI());
        resultFile.delete();
    }

    @Test
    public void testExecute_EmptyReportPath() {
        SimpleCovSensor sensor = new SimpleCovSensor();
        sensor.execute(context);

        assertThat(context.lineHits(rubyFile.getAbsolutePath(), CoverageType.UNIT, 1)).isNull();
    }

    @Test
    public void testExecute() throws URISyntaxException {
        URL filePath = SimpleCovSensorTest.class.getClassLoader().getResource(".resultset.json");
        File resultFile = new File(filePath.toURI());
        context.settings().setProperty(RubyPlugin.SIMPLECOV_REPORT_PATH, resultFile.getAbsolutePath());

        SimpleCovSensor sensor = new SimpleCovSensor();
        sensor.execute(context);

        assertThat(context.lineHits("myProjectKey:test_controller.rb", CoverageType.UNIT, 1)).isEqualTo(1);
    }

    @Test
    public void testExecute_ZeroOutUnknownFiles() throws URISyntaxException {
        URL filePath = SimpleCovSensorTest.class.getClassLoader().getResource(".resultset.json");
        File resultFile = new File(filePath.toURI());
        context.settings().setProperty(RubyPlugin.SIMPLECOV_REPORT_PATH, resultFile.getAbsolutePath());

        SimpleCovSensor sensor = new SimpleCovSensor();
        sensor.execute(context);

        assertThat(context.lineHits("myProjectKey:unknown_file.rb", CoverageType.UNIT, 1)).isEqualTo(0);
    }

}