package no.valg.valgnatt.frontend;

import java.io.File;
import java.nio.charset.Charset;
import java.nio.file.Files;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class KontrollerTest {

	private static boolean initOk = false;

	private static Kontroller kontroller;

	@Before
	public void initialiser() throws Exception {
		if (initOk) {
			return;
		}
		// Vi finner området hvor "resources" ligger (dvs. der hvor vi finner "rapporterFraBackend.json")
		// Vi må altså overstyre område for datalagring når vi skal utføre Junit-test, slik at det virker
		// både lokalt og på Jenkins-serveren
		File f = new File(this.getClass().getResource("/rapporterFraBackend.json").getFile());
		System.setProperty(RapportSamlingslager.DATALAGRINGSOMRÅDE, f.getParent());

		// Området hvor serialiserte rapporter befinner seg
		kontroller = new Kontroller();
		kontroller.initialiser();


		kontroller.prosesserStatus("status:3456:2013:publiser");

		File fraBackend = new File(this.getClass().getResource("/rapporterFraBackend.json").getFile());
		String fraBackendStr = new String(Files.readAllBytes(fraBackend.toPath()), Charset.forName("UTF-8"));
		kontroller.prosesserRapporterFraBackend(fraBackendStr);

		initOk = true;
	}


	@Test
	public void omstartNødvendigDersomServerInstansEndrerSeg() throws Exception {
		Assert.assertEquals(true, kontroller.omstart(888, false));
	}

	@Test
	public void omstartNødvendigDersomSperrefristEndrerSeg() throws Exception {
		Assert.assertEquals(true, kontroller.omstart(3456, true));
	}

	@Test
	public void omstartNødvendigDersomServerInstansEr0() throws Exception {
		Assert.assertEquals(true, kontroller.omstart(0, false));
	}

	@Test
	public void omstartIkkeNødvendig() throws Exception {
		Assert.assertEquals(false, kontroller.omstart(3456, false));
	}


	@Test
	public void prosesserRapporterFraBackend() throws Exception {
		Assert.assertEquals(true, kontroller.getRapport("/2013/st/14/1431").indexOf("2013-09-09T20:00:49") > 0);
	}

	@Test
	public void getRapport_Toppnivå() {
		Assert.assertEquals(true, kontroller.getRapport("/").indexOf("/2011/fy") > 0);
	}

	@Test
	public void getRapport_ToppÅr() {
		Assert.assertEquals(true, kontroller.getRapport("/2013").indexOf("2013/sa") > 0);
	}

	@Test
	public void getRapport_ToppÅrValg() {
		Assert.assertEquals(true, kontroller.getRapport("/2013/sa").indexOf("antallsb\": 15005") > 0);
	}

	@Test
	public void getRapport_Feiler() {
		Assert.assertEquals(null, kontroller.getRapport("/tull/sa"));
	}

	@Test
	public void getRapport_FinnesIkke() {
		Assert.assertEquals(null, kontroller.getRapport("/2013/st/99"));
	}

	@Test
	public void getSøketreff() throws Exception {
		String søkeTreff = kontroller.getSøketreff("2013", "st", "spydeberg");
		Assert.assertEquals(true, søkeTreff.indexOf("%C3%B8stfold/spydeberg") > 0);
	}

	@Test
	public void getSøketreff_Feiler() throws Exception {
		Assert.assertEquals(null, kontroller.getSøketreff("Tjuetretten", "st", "spydeberg"));
	}


	@Test
	public void getSimRapporter() throws Exception {
		Assert.assertEquals(697, kontroller.getSimRapporter().split("\n").length);
	}

	@Test
	public void erSperrefrist() throws Exception {
		Assert.assertEquals(false, kontroller.erSperrefrist("2017"));
	}

}