/*
 * Created on 02/02/2007
 *
 * To change the template for this generated file go to
 * Window&gt;Preferences&gt;Java&gt;Code Generation&gt;Code and Comments
 */
package agilpizza.servlet;
import static junit.framework.Assert.*;
import static org.easymock.EasyMock.createNiceMock;
import static org.easymock.EasyMock.createStrictMock;
import static org.easymock.EasyMock.eq;
import static org.easymock.EasyMock.expect;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

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

import agilpizza.modelo.Cliente;

public class ClienteServletTest {

	private ClienteServlet servlet;
	private HttpServletRequest req;
	private HttpServletResponse resp;
	private HttpSession session;
	private Object mocks[];

	@Before
	public void setUp() {
		servlet = new ClienteServlet();
		req = createNiceMock(HttpServletRequest.class);
		resp = createStrictMock(HttpServletResponse.class);
		session = createNiceMock(HttpSession.class);
		
		mocks = new Object[] {req, resp, session};
	}

	@Test
	public void testeClienteNaoEstaIdentificado() throws Exception {
		expect(req.getSession()).andReturn(session).anyTimes();
		expect(session.getAttribute("clienteIdentificado")).andReturn(null);
		resp.sendRedirect(eq("identificacaoCliente.jsp"));
		
		replay(mocks);
		servlet.doPost(req, resp);
		verify(mocks);
	
	}
	
	@Test
	public void testeRuaVaziaRetornaPaginaDeErro() throws Exception {
		Cliente cliente = new Cliente("email@email.com");
		expect(session.getAttribute("clienteIdentificado")).andReturn(cliente);
		
		expect(req.getParameter("rua")).andReturn("");
		expect(req.getParameter("numero")).andReturn("1");
		expect(req.getParameter("bairro")).andReturn("Jardins");
		expectError();
	}

	@Test
	public void testeRuaSoEspacosRetornaPaginaDeErro() throws Exception {
		Cliente cliente = new Cliente("email@email.com");
		expect(session.getAttribute("clienteIdentificado")).andReturn(cliente);

		expect(req.getParameter("rua")).andReturn("  ");
		expect(req.getParameter("numero")).andReturn("1");
		expect(req.getParameter("bairro")).andReturn("Jardins");
		expectError();
	}

	@Test
	public void testeRuaNulaRetornaPaginaDeErro() throws Exception {
		Cliente cliente = new Cliente("email@email.com");
		expect(session.getAttribute("clienteIdentificado")).andReturn(cliente);

		expect(req.getParameter("rua")).andReturn(null);
		expect(req.getParameter("numero")).andReturn("1");
		expect(req.getParameter("bairro")).andReturn("Jardins");
		expectError();
	}
	
	@Test
	public void testeNumeroVazioRetornaPaginaDeErro() throws Exception {
		Cliente cliente = new Cliente("email@email.com");
		expect(session.getAttribute("clienteIdentificado")).andReturn(cliente);

		expect(req.getParameter("rua")).andReturn("Av. Paulista");
		expect(req.getParameter("numero")).andReturn("");
		expect(req.getParameter("bairro")).andReturn("Jardins");
		expectError();
	}

	@Test
	public void testeNumeroSoEspacosRetornaPaginaDeErro() throws Exception {
		Cliente cliente = new Cliente("email@email.com");
		expect(session.getAttribute("clienteIdentificado")).andReturn(cliente);

		expect(req.getParameter("rua")).andReturn("Av. Paulista");
		expect(req.getParameter("numero")).andReturn("  ");
		expect(req.getParameter("bairro")).andReturn("Jardins");
		expectError();
	}

	@Test
	public void testeNumeroNuloRetornaPaginaDeErro() throws Exception {
		Cliente cliente = new Cliente("email@email.com");
		expect(session.getAttribute("clienteIdentificado")).andReturn(cliente);

		expect(req.getParameter("rua")).andReturn("Av. Paulista");
		expect(req.getParameter("numero")).andReturn(null);
		expect(req.getParameter("bairro")).andReturn("Jardins");
		expectError();
	}
	
	@Test
	public void testeInsereEnderecoCorretoNaSessaoERedirecionaParaTelaDeSucesso() throws Exception {
		Cliente cliente = new Cliente("email@email.com");
		expect(session.getAttribute("clienteIdentificado")).andReturn(cliente);

		expect(req.getSession()).andReturn(session).anyTimes();
		expect(req.getParameter("nome")).andReturn("Joao da Silva");
		expect(req.getParameter("telefone")).andReturn("123456");
		expect(req.getParameter("rua")).andReturn("Av. Paulista");
		expect(req.getParameter("numero")).andReturn("1");
		expect(req.getParameter("bairro")).andReturn("Jardins");
		expect(req.getParameter("complemento")).andReturn("2 andar");
		expect(req.getParameter("cep")).andReturn("01111-111");
		
		resp.sendRedirect(eq("mostraCliente.jsp"));

		replay(mocks);
		servlet.doPost(req, resp);
		verify(mocks);
		
		assertNotNull(cliente.getEndereco());
		assertEquals("Nome do Cliente Correto", "Joao da Silva", cliente.getNome());
		assertEquals("Endereco do Cliente Correto",  "Av. Paulista", cliente.getEndereco().getRua());
	}

	private void expectError() throws IOException, ServletException {
		resp.sendRedirect(eq("cliente.jsp"));
		
		expect(req.getSession()).andReturn(session).anyTimes();
		
		//session.setAttribute(eq("msgErro"), eq("Campos obrigatorios (rua e número) não foram preenchidos"));
		
		replay(mocks);
		servlet.doPost(req, resp);
		verify(mocks);
	}
	
}
