package sklep.logika;

import static org.junit.Assert.*;
import static org.mockito.Mockito.*;

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;

import sklep.exn.BrakTowaru;
import sklep.exn.NieznanyTowar;
import sklep.model.PotwierdzenieZakupu;
import sklep.model.Towar;

@RunWith(MockitoJUnitRunner.class)
public class TestSklep_Mockito {
	private static final String PRALKA = "Pralka";
	private static final String OPIS_PRALKI = "Opis pralki";

	private static final String NIEZNANY = "Nieznany";
	private static final String KOMUNIKAT_NIEZNANY = "Nieznany towar";
	private static final String KOMUNIKAT_BRAK = "Brak towaru";
	private static final String KOMUNIKAT_POTWIERDZENIE_ZAKUPU = "Komunikat potwierdzenie zakupu";

	private Sklep sklep;
	@Mock private Katalog m_katalog;
	@Mock private Towar m_pralka;
	@Mock private NieznanyTowar m_exn_nieznany;
	@Mock private BrakTowaru m_exn_brak;
	@Mock private Magazyny m_magazyny;
	@Mock private PotwierdzenieZakupu m_potwierdzenieZakupu;

	@Before
	public void setUp() throws Exception {
		when(m_katalog.pobierzTowar(PRALKA)).thenReturn(m_pralka);
		when(m_pralka.getOpis()).thenReturn(OPIS_PRALKI);

		when(m_katalog.pobierzTowar(NIEZNANY)).thenThrow(m_exn_nieznany);
		when(m_exn_nieznany.getMessage()).thenReturn(KOMUNIKAT_NIEZNANY);
		when(m_exn_brak.getMessage()).thenReturn(KOMUNIKAT_BRAK);
		
		when(m_magazyny.realizacjaZakupu(m_pralka, 3)).thenReturn(m_potwierdzenieZakupu);
		when(m_magazyny.realizacjaZakupu(m_pralka, 5)).thenThrow(m_exn_brak);

		when(m_potwierdzenieZakupu.toString()).thenReturn(KOMUNIKAT_POTWIERDZENIE_ZAKUPU);

		sklep = new Sklep(m_katalog, m_magazyny);
	}

	@Test
	public void testOpisTowaru() throws NieznanyTowar {
		String wynik = sklep.opisTowaru(PRALKA);
		assertEquals(OPIS_PRALKI, wynik);
		
		// to i tak jest sprawdzane, bo inaczej OPIS_PRALKI by sie nie pojawil
		// verify(m_katalog).pobierzTowar(PRALKA);
	}

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

	@Test
	public void testZakup() {
		String wynik = sklep.zakup(PRALKA, 3);
		assertEquals(KOMUNIKAT_POTWIERDZENIE_ZAKUPU, wynik);
	}

	@Test
	public void testZakupNieznany() {
		String wynik = sklep.zakup(NIEZNANY, 2);
		assertEquals(KOMUNIKAT_NIEZNANY, wynik);
	}

	@Test
	public void testZakupBrakTowaru() {
		String wynik = sklep.zakup(PRALKA, 5);
		assertEquals(KOMUNIKAT_BRAK, wynik);
	}

}
