package com.whatsthatlight.teamcity.hipchat.test;
import static org.junit.Assert.*;
import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import jetbrains.buildServer.serverSide.ServerPaths;
import static org.mockito.Mockito.*;
import org.testng.annotations.Test;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.DataProvider;
import org.apache.log4j.BasicConfigurator;
import com.whatsthatlight.teamcity.hipchat.HipChatNotificationMessageTemplates;
import com.whatsthatlight.teamcity.hipchat.TeamCityEvent;
import freemarker.cache.StringTemplateLoader;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class HipChatNotificationMessageTemplatesTest {
@BeforeClass
public static void classSetUp() {
BasicConfigurator.configure();
}
@DataProvider(name = "dataProvider")
public Object[][] provideData() {
return new Object[][] {
{ TeamCityEvent.BUILD_STARTED, "buildStartedTemplate.ftl", "buildStarted", HipChatNotificationMessageTemplates.BUILD_STARTED_DEFAULT_TEMPLATE },
{ TeamCityEvent.BUILD_SUCCESSFUL, "buildSuccessfulTemplate.ftl", "buildSuccessful", HipChatNotificationMessageTemplates.BUILD_SUCCESSFUL_DEFAULT_TEMPLATE },
{ TeamCityEvent.BUILD_FAILED, "buildFailedTemplate.ftl", "buildFailed", HipChatNotificationMessageTemplates.BUILD_FAILED_DEFAULT_TEMPLATE },
{ TeamCityEvent.BUILD_INTERRUPTED, "buildInterruptedTemplate.ftl", "buildInterrupted", HipChatNotificationMessageTemplates.BUILD_INTERRUPTED_DEFAULT_TEMPLATE },
{ TeamCityEvent.SERVER_STARTUP, "serverStartupTemplate.ftl", "serverStartup", HipChatNotificationMessageTemplates.SERVER_STARTUP_DEFAULT_TEMPLATE },
{ TeamCityEvent.SERVER_SHUTDOWN, "serverShutdownTemplate.ftl", "serverShutdown", HipChatNotificationMessageTemplates.SERVER_SHUTDOWN_DEFAULT_TEMPLATE }
};
}
@Test
public void testTemplateDirectoryGetsCreated() throws IOException {
String expectedConfigDirectory = ".";
String expectedTemplateDirectory = "hipchat";
File templateDirectory = new File(expectedTemplateDirectory);
if (templateDirectory.exists()) {
templateDirectory.delete();
}
assertFalse(templateDirectory.exists());
ServerPaths serverPaths = mock(ServerPaths.class);
when(serverPaths.getConfigDir()).thenReturn(expectedConfigDirectory);
new HipChatNotificationMessageTemplates(serverPaths);
templateDirectory = new File(expectedTemplateDirectory);
assertTrue(templateDirectory.exists());
}
@Test
public void testOptionalContributorsExists() throws IOException, TemplateException {
// Test parameters
String expectedContributors = "foo, bar, baz";
// Create template
String templateName = "template";
StringTemplateLoader loader = new StringTemplateLoader();
loader.putTemplate(templateName, HipChatNotificationMessageTemplates.BUILD_STARTED_DEFAULT_TEMPLATE);
Configuration config = new Configuration();
config.setTemplateLoader(loader);
Template template = config.getTemplate(templateName);
Map<String, Object> templateMap = new HashMap<String, Object>();
templateMap.put("hasContributors", true);
templateMap.put("contributors", expectedContributors);
// Other required values
templateMap.put("fullName", "");
templateMap.put("hasBranch", false);
templateMap.put("buildNumber", "");
templateMap.put("triggeredBy", "");
templateMap.put("emoticonUrl", "");
templateMap.put("serverUrl", "");
templateMap.put("projectId", "");
templateMap.put("buildId", "");
templateMap.put("buildTypeId", "");
// Render
Writer writer = new StringWriter();
template.process(templateMap, writer);
writer.flush();
String renderedTemplate = writer.toString();
writer.close();
// Test where contributors are present.
System.out.println(renderedTemplate);
assertTrue(renderedTemplate.contains(expectedContributors));
}
@Test
public void testOptionalContributorsDoesNotExist() throws IOException, TemplateException {
// Test parameters
String expectedContributors = "foo, bar, baz";
// Create template
String templateName = "template";
StringTemplateLoader loader = new StringTemplateLoader();
loader.putTemplate(templateName, HipChatNotificationMessageTemplates.BUILD_STARTED_DEFAULT_TEMPLATE);
Configuration config = new Configuration();
config.setTemplateLoader(loader);
Template template = config.getTemplate(templateName);
Map<String, Object> templateMap = new HashMap<String, Object>();
templateMap.put("hasContributors", false);
// Other required values
templateMap.put("fullName", "");
templateMap.put("hasBranch", false);
templateMap.put("buildNumber", "");
templateMap.put("triggeredBy", "");
templateMap.put("emoticonUrl", "");
templateMap.put("serverUrl", "");
templateMap.put("projectId", "");
templateMap.put("buildId", "");
templateMap.put("buildTypeId", "");
// Render
Writer writer = new StringWriter();
template.process(templateMap, writer);
writer.flush();
String renderedTemplate = writer.toString();
writer.close();
// Test where contributors are present.
System.out.println(renderedTemplate);
assertFalse(renderedTemplate.contains(expectedContributors));
}
@Test(dataProvider = "dataProvider")
public void testReadAndWriteTemplate(TeamCityEvent expectedEvent, String expectedFileName, String ignored, String expectedTemplateString) throws IOException, TemplateException {
// Parameters
String expectedConfigDir = ".";
String expectedTemplateDir = "hipchat";
System.out.println(expectedFileName);
// Pre-conditions
File templateFile = new File(expectedConfigDir, expectedFileName);
templateFile.delete();
assertFalse(templateFile.exists());
// Prepare
ServerPaths serverPaths = mock(ServerPaths.class);
when(serverPaths.getConfigDir()).thenReturn(expectedConfigDir);
HipChatNotificationMessageTemplates templates = new HipChatNotificationMessageTemplates(serverPaths);
// Execute (write)
templates.writeTemplate(expectedEvent, expectedTemplateString);
// Test
templateFile = new File(expectedTemplateDir, expectedFileName);
assertTrue(templateFile.exists());
String actualTemplateString = new Scanner(templateFile).useDelimiter("\\A").next();
assertEquals(expectedTemplateString, actualTemplateString);
// Execute (read)
Template actualTemplate = templates.readTemplate(expectedEvent);
// Test
assertEquals(expectedTemplateString, actualTemplate.toString());
}
@Test(dataProvider = "dataProvider")
public void testReadDefaultTemplate(TeamCityEvent expectedEvent, String expectedFileName, String ignored, String expectedTemplateString) throws IOException, TemplateException {
// Parameters
String expectedConfigDir = ".";
String expectedTemplateDir = "hipchat";
System.out.println(expectedFileName);
// Pre-conditions
File templateFile = new File(expectedTemplateDir, expectedFileName);
templateFile.delete();
assertFalse(templateFile.exists());
// Prepare
ServerPaths serverPaths = mock(ServerPaths.class);
when(serverPaths.getConfigDir()).thenReturn(expectedConfigDir);
HipChatNotificationMessageTemplates templates = new HipChatNotificationMessageTemplates(serverPaths);
// Execute (read)
Template actualTemplate = templates.readTemplate(expectedEvent);
// Test
assertEquals(expectedTemplateString, actualTemplate.toString());
}
@Test(dataProvider = "dataProvider")
public void testOverwriteExistingTemplate(TeamCityEvent expectedEvent, String expectedFileName, String expectedTemplateStringFirst, String expectedTemplateString) throws IOException {
// Parameters
String expectedTemplateStringSecond = "bar";
String expectedConfigDir = ".";
String expectedTemplateDir = "hipchat";
System.out.println(expectedFileName);
// Pre-conditions
File templateFile = new File(expectedConfigDir, expectedFileName);
templateFile.delete();
assertFalse(templateFile.exists());
// Prepare
ServerPaths serverPaths = mock(ServerPaths.class);
when(serverPaths.getConfigDir()).thenReturn(expectedConfigDir);
HipChatNotificationMessageTemplates templates = new HipChatNotificationMessageTemplates(serverPaths);
// Execute (write)
templates.writeTemplate(expectedEvent, expectedTemplateStringFirst);
templates.writeTemplate(expectedEvent, expectedTemplateStringSecond);
// Test
templateFile = new File(expectedTemplateDir, expectedFileName);
assertTrue(templateFile.exists());
String actualTemplateString = new Scanner(templateFile).useDelimiter("\\A").next();
assertEquals(expectedTemplateStringSecond, actualTemplateString);
// Execute (read)
Template actualTemplate = templates.readTemplate(expectedEvent);
// Test
assertEquals(expectedTemplateStringSecond, actualTemplate.toString());
}
}