package sklep.logika;

import static org.junit.Assert.*;

import java.math.BigDecimal;

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

import sklep.baza.Baza;
import sklep.exn.BladBazyDanych;
import sklep.exn.BrakTowaru;
import sklep.model.PotwierdzenieZakupu;
import sklep.model.Towar;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyString;
import static org.mockito.Mockito.*;

public class TestMagazyny_Mockito {
	private static final String MAGAZYN1 = "Magazyn pierwszy";
	private static final BigDecimal TYSIAC = new BigDecimal("1000.00");
	private static final BigDecimal TRZY_TYSIACE = new BigDecimal("3000.00");
	private static final String PRALKA = "Pralka";
	
	private Towar m_pralka;
	private Magazyny magazyny;
	private Baza m_baza;

	@Before
	public void setUp() throws Exception {
		m_pralka = mock(Towar.class);
		when(m_pralka.getNazwa()).thenReturn(PRALKA);
		when(m_pralka.getCenaBrutto()).thenReturn(TYSIAC);

		m_baza = mock(Baza.class);
		when(m_baza.znajdzMagazynZTowarem(PRALKA, 3)).thenReturn(MAGAZYN1);
		
		magazyny = new Magazyny(m_baza);
	}

	@Test
	public void testDokonajZakupu() throws BrakTowaru, BladBazyDanych {
		PotwierdzenieZakupu potwierdzenie = magazyny.realizacjaZakupu(m_pralka, 3);

		assertNotNull(potwierdzenie);
		assertEquals(PRALKA, potwierdzenie.getNazwa());
		assertEquals(3, potwierdzenie.getSztuk());
		assertEquals(TRZY_TYSIACE, potwierdzenie.getDoZaplaty());
		assertEquals(MAGAZYN1, potwierdzenie.getNazwaMagazynu());

		verify(m_baza).zmienStanMagazynu(MAGAZYN1, PRALKA, -3);
		verify(m_baza, times(1)).zmienStanMagazynu(anyString(), anyString(), anyInt());
	}
	
	@Test
	public void testRealizacjaZakupu_Duzo_Catch() throws BladBazyDanych {
		try {
			magazyny.realizacjaZakupu(m_pralka, 5);
			fail("Powinien być wyjątek BrakTowaru");
		} catch(BrakTowaru e) {
			verify(m_baza, never()).zmienStanMagazynu(anyString(), anyString(), anyInt());
		}
	}
}
