package pl.matisoft.soy.ajax;
import com.google.common.base.Optional;
import com.google.template.soy.msgs.SoyMsgBundle;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import pl.matisoft.soy.bundle.SoyMsgBundleResolver;
import pl.matisoft.soy.compile.TofuCompiler;
import pl.matisoft.soy.locale.LocaleProvider;
import pl.matisoft.soy.template.TemplateFilesResolver;
import javax.servlet.http.HttpServletRequest;
import java.net.URL;
import java.util.Locale;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
/**
* Created with IntelliJ IDEA.
* User: mati
* Date: 07/10/2013
* Time: 21:09
*/
@RunWith(MockitoJUnitRunner.class)
public class SoyAjaxControllerTest {
@InjectMocks
private SoyAjaxController soyAjaxController = new SoyAjaxController();
@Mock
private TemplateFilesResolver templateFilesResolver;
@Mock
private SoyMsgBundleResolver soyMsgBundleResolver;
@Mock
private LocaleProvider localeProvider;
@Mock
private TofuCompiler tofuCompiler;
@Before
public void setUp() throws Exception {
soyAjaxController.setTemplateFilesResolver(templateFilesResolver);
}
@Test
public void testCompileJs() throws Exception {
final String templateName = "templates/template1.soy";
final String jsData = "jsData";
final HttpServletRequest request = mock(HttpServletRequest.class);
when(localeProvider.resolveLocale(request)).thenReturn(Optional.<Locale>absent());
when(soyMsgBundleResolver.resolve(any(Optional.class))).thenReturn(Optional.<SoyMsgBundle>absent());
final URL url1 = getClass().getClassLoader().getResource(templateName);
when(templateFilesResolver.resolve(templateName)).thenReturn(Optional.of(url1));
when(tofuCompiler.compileToJsSrc(url1, null)).thenReturn(Optional.of(jsData));
final ResponseEntity<String> responseEntity = soyAjaxController.compile("", new String[]{templateName}, null, "true", request);
Assert.assertEquals("data should be equal", jsData, responseEntity.getBody());
Assert.assertTrue("http status should be equal", (responseEntity.getStatusCode() == HttpStatus.OK));
}
@Test
@Ignore
public void testCompileJs2() throws Exception {
final String templateName1 = "templates/template1.soy";
final String templateName2 = "templates/template2.soy";
final String jsData1 = "jsData1";
final String jsData2 = "jsData2";
final HttpServletRequest request = mock(HttpServletRequest.class);
when(localeProvider.resolveLocale(request)).thenReturn(Optional.<Locale>absent());
when(soyMsgBundleResolver.resolve(any(Optional.class))).thenReturn(Optional.<SoyMsgBundle>absent());
final URL url1 = getClass().getClassLoader().getResource(templateName1);
final URL url2 = getClass().getClassLoader().getResource(templateName2);
when(templateFilesResolver.resolve(templateName1)).thenReturn(Optional.of(url1));
when(templateFilesResolver.resolve(templateName2)).thenReturn(Optional.of(url2));
when(tofuCompiler.compileToJsSrc(url1, null)).thenReturn(Optional.of(jsData1));
when(tofuCompiler.compileToJsSrc(url2, null)).thenReturn(Optional.of(jsData2));
final ResponseEntity<String> responseEntity = soyAjaxController.compile("", new String[]{templateName1, templateName2}, null, "true", request);
Assert.assertEquals("data should be equal", jsData1 + jsData2, responseEntity.getBody());
Assert.assertTrue("http status should be equal", (responseEntity.getStatusCode() == HttpStatus.OK));
}
}