package sklep.logika;

import static org.junit.Assert.*;

import java.io.FileReader;
import java.sql.Connection;
import java.sql.DriverManager;

import org.dbunit.database.DatabaseConnection;
import org.dbunit.dataset.IDataSet;
import org.dbunit.dataset.xml.XmlDataSet;
import org.dbunit.operation.DatabaseOperation;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import sklep.baza.Baza;

/* Testy całego sklepu wraz z bazą danych */

public class TestSklep {
	private static final String ODKURZACZ = "Odkurzacz";
	private static final String NIEZNANY = "Nieznany";
	private static final String OPIS = "Odkurzacz: cena netto 1000.00, cena brutto 1230.00";
	private static final String BLAD = "Nieznany towar Nieznany";

	private Sklep sklep;

	private Connection jdbcConnection;
	private DatabaseConnection dbConnection;

	@Before
	public void setUp() throws Exception {
		Class.forName(Baza.driver);
		jdbcConnection = DriverManager.getConnection(Baza.url);
		dbConnection = new DatabaseConnection(jdbcConnection);
		IDataSet dataSet = new XmlDataSet(new FileReader("dane.xml"));
		DatabaseOperation.CLEAN_INSERT.execute(dbConnection, dataSet);
		Baza baza = Baza.nowaBaza(jdbcConnection);
		sklep = Sklep.sklepZBaza(baza);
	}

	@After
	public void tearDown() throws Exception {
		dbConnection.close();
	}

	@Test
	public void testOpis() {
		String wynik = sklep.opisTowaru(ODKURZACZ);
		assertEquals(OPIS, wynik);
	}

	@Test
	public void testOpis_Nieznany() {
		String wynik = sklep.opisTowaru(NIEZNANY);
		assertEquals(BLAD, wynik);
	}

	@Test
	public void testKup_Pierwszy() {
		String wynik = sklep.zakup("Odkurzacz", 2);
		assertEquals("Zakupiono 2 sztuk towaru Odkurzacz z magazynu Lodz, kwota do zapłaty 2460.00.", wynik);
	}

	@Test
	public void testKup_Pierwszy_Drugi_Brak() {
		String wynik = sklep.zakup("Odkurzacz", 2);
		assertEquals("Zakupiono 2 sztuk towaru Odkurzacz z magazynu Lodz, kwota do zapłaty 2460.00.", wynik);

		wynik = sklep.zakup("Odkurzacz", 2);
		assertEquals("Zakupiono 2 sztuk towaru Odkurzacz z magazynu Lodz, kwota do zapłaty 2460.00.", wynik);

		wynik = sklep.zakup("Odkurzacz", 2);
		assertEquals("Brak wystarczającej liczby towarów Odkurzacz.", wynik);
	}
}
