package com.goree.api.controller;

import java.util.ArrayList;
import java.util.List;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.SpringApplicationConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.transaction.annotation.Transactional;

import com.goree.api.Application;
import com.goree.api.domain.Tag;

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = { Application.class })
@Transactional
public class TagTest {
	@Autowired
	private TagController tagController;

	private Tag expected;

	private List<Tag> expecteds;

	@Before
	public void setUp() {
		expected = new Tag();
		expected.setTagName("Go!ree");

		// 테스트의 목적에만 집중할 수 있도록, 로직을 간단하게 하기위해 expected를 공통으로 사용한다.
		expected = tagController.creatingTag(expected);

		// 검색 테스트를 위해 TagName이 Search로 시작하는 태그를 삽입한다.
		Tag tagForSearch = new Tag();
		expecteds = new ArrayList<>();
		for (int i = 0; i < 10; i++) {
			tagForSearch.setTagName("Search" + i);

			// 값을 삽입한 뒤 반환값은 expectedList에 추가한다.
			expecteds.add(tagController.creatingTag(tagForSearch));
		}
	}

	@Test
	public void creatingTag() {
		// insert 테스트시엔 공통변수를 사용할 수 없기 때문에 새로운 expected를 만들어 준다.(duplicated key
		// 방지)
		Tag expected = new Tag();
		expected.setTagName("creatingTest");

		Tag actual = tagController.creatingTag(expected);
		Assert.assertEquals(expected.getTagName(), actual.getTagName());
	}

	@Test
	public void findTagByName() {
		Tag actual = tagController.findTagByName(expected.getTagName());
		Assert.assertEquals(expected, actual);
	}

	@Test
	public void findTagById() {
		Tag actual = tagController.findTagById(expected.getId());
		Assert.assertEquals(expected, actual);
	}

	@Test
	public void searchTagsByStartWord() {
		// 추후 매핑시에는 아래와 같은 방법으로 테스트가 불가능 하여 다른 방법으로 Assert 필요함
		// (순서가 변경될시엔 아래 테스트가 실패하게 됨)
		List<Tag> actuals = tagController.searchTagsByStartWord("Search");
		for (int i = 0; i < expecteds.size(); i++) {
			Assert.assertEquals(expecteds.get(i), actuals.get(i));
		}
	}

}

@@ -52,24 +52,54 @@
 .ArrayList;%0A
+import java.util.Collections;%0A
 import java.
@@ -2104,24 +2104,404 @@
 Search%22);%0A%09%09
+Assert.assertTrue(actuals.containsAll(expecteds));%0A%09%7D%0A%09%0A//%09@Test%0A//%09public void insertTagListByJoinUser() %7B%0A//%09    List%3CTag%3E expects = new ArrayList%3C%3E();%0A//%0A//%09    String insertValueByUser = %22#abc #abcd #abcde #adsarrst%22;%0A//%09    String%5B%5D values = insretValueByUser.split(%22 %22);%0A//%09    for (String value : values) %7B%0A//%09        value.replace(%22#%22, %22%22);%0A//%09    %7D%0A//%0A//%09        %0A//%09    
 for (int i =
@@ -2506,22 +2506,288 @@
  = 0
+ 
 ; i %3C 
-expected
+values.length() ; i++) %7B%0A//%09        Tag item = new Tag();%0A//%09        item.setTagName(values%5Bi%5D);%0A//%09        expects.add(item);%0A//%09    %7D%0A//%09    %0A//%09    List%3CTag%3E actuals = tagController.insertTagListByJoinUser(insertValueByUser);   %0A//%09    %0A//%09    for(int i = 0 ; i %3C actual
 s.si
@@ -2795,23 +2795,32 @@
 e(); i++
+ 
 ) %7B%0A
-%09%09%09
+//%09        
 Assert.a
@@ -2841,18 +2841,16 @@
 pect
-ed
 s.get(i)
 , ac
@@ -2845,16 +2845,29 @@
 s.get(i)
+.getTagName()
 , actual
@@ -2874,21 +2874,47 @@
 s.get(i)
-);%0A%09%09%7D%0A%09%7D
+.getTagName());%0A//%09    %7D%0A//%0A//%09%7D%0A%0A%09
 %0A%0A%7D%0A

refactor searchTagsByStartWord