package kcg.faics.susa.service.impl;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;

import java.util.HashMap;
import java.util.List;

import kcg.faics.cmmn.bbs.BaseBbsService;
import kcg.faics.susa.vo.IncidentVO;
import kcg.faics.susa.vo.PromotVO;
import kcg.faics.susa.vo.SearchVO;
import kcg.faics.susa.vo.SusaVO;

import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;

/**
 * SusaServiceImpl 테스트 클래스.
 * 
 * @author kimnomin
 *
 */
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration(locations = { "classpath:/spring/context-*.xml" })
public class SusaServiceImplTest {

	/**
	 * 외사수사 관련 서비스 객체.
	 */
	@Autowired
	private BaseBbsService<SearchVO, SusaVO> susaService;

	/**
	 * insert 메소드 테스트.
	 * 
	 * CASE 1. 성공시 반환되는 result 값이 1이어야 한다. 
	 * CASE 2. 반환되는 idx는 0보다 커야한다. 
	 * CASE 3. 반환되는 idx로 select 후 레코드 값이 같아야 한다.
	 * 
	 * @throws Exception
	 *             기본 예외 처리
	 */
	@Test
	public void insertTest() throws Exception {
		SusaVO srcSusaVo;
//		IncidentVO srcVO = new IncidentVO();
		PromotVO srcVO = new PromotVO();
		srcVO.setPlace1("PS14");
		srcVO.setChargeNm("관리자");
		srcVO.setTitle("테스트 - 제목");
		srcVO.setContents("테스트 - 협의내용");
		srcVO.setResult("테스트 - 수사결과");
		srcVO.setSdate("20101111");
		srcVO.setEdate("20100101");
		srcVO.setWriter("tcdadmin");

		srcSusaVo = srcVO;
		HashMap<String, Object> result = susaService.insert(srcVO, null);

		// CASE 1
		assertEquals(1, result.get("result"));

		// CASE 2
		int insertedIdx = (Integer) result.get("idx");
		assertTrue(0 < insertedIdx);

		SusaVO susaVO = new SusaVO();
		susaVO.setIdx(insertedIdx);
		susaVO = susaService.select(susaVO);

		// CASE 3
		assertEquals(srcVO.getIdx(), susaVO.getIdx());
		assertEquals(srcVO.getType(), susaVO.getType());
		assertEquals(srcVO.getChargeNm(), susaVO.getChargeNm());
		assertEquals(srcVO.getContents(), susaVO.getContents());
		assertEquals(srcVO.getSdate(), susaVO.getSdate());
		assertEquals(srcVO.getEdate(), susaVO.getEdate());
		assertEquals(srcVO.getPlace1(), susaVO.getPlace1());
		assertEquals(srcVO.getWriter(), susaVO.getWriter());
		// 상위 기관 코드는 CodeService.PLACE_CATEGORY 참조 할 것.
		assertEquals("ps90", susaVO.getAgency());
	}
	
	/**
	 * update 메서드 테스트.
	 * 
	 * CASE 1. 전체 목록을 가져와 첫 번째 레코드를 대상으로 지정한 후, 해당 레코드를 수정하면 결과가 성공이 나와야 한다.
	 * CASE 2. 수정된 레코드를 다시 SELECT하면 UPDATE VO와 같아야 한다.
	 * 
	 * @throws Exception 기본 예외 처리
	 */
	@Test
	public void updateTest() throws Exception {
		SearchVO searchVO = new SearchVO();
		List<SusaVO> tmpList = susaService.selectList(searchVO);
		SusaVO updateTargetVO = tmpList.get(0);
		
		updateTargetVO.setChargeNm("수정자344");
		
		HashMap<String, Object> result = susaService.update(updateTargetVO, null, null);
		assertEquals(1, result.get("result"));
		
		SusaVO resultTargetVO = susaService.select(updateTargetVO);
		assertEquals(updateTargetVO.getIdx(), resultTargetVO.getIdx());
		assertEquals(updateTargetVO.getType(), resultTargetVO.getType());
		assertEquals(updateTargetVO.getChargeNm(), resultTargetVO.getChargeNm());
		assertEquals(updateTargetVO.getContents(), resultTargetVO.getContents());
		assertEquals(updateTargetVO.getSdate(), resultTargetVO.getSdate());
		assertEquals(updateTargetVO.getEdate(), resultTargetVO.getEdate());
		assertEquals(updateTargetVO.getPlace1(), resultTargetVO.getPlace1());
		assertEquals(updateTargetVO.getWriter(), resultTargetVO.getWriter());
	}
}
