Skip to content

Commit

Permalink
Simplify message text generation (#317)
Browse files Browse the repository at this point in the history
  • Loading branch information
valfirst authored Oct 1, 2024
1 parent 1926a50 commit 6e1f0ea
Show file tree
Hide file tree
Showing 24 changed files with 98 additions and 152 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public void sendText(MessageData messageData) throws MessagingException {
.routeParam("channelId", discord.getChannelId())
.header("Authorization", "Bot " + discord.getBotToken())
.header("Content-Type", ContentType.APPLICATION_FORM_URLENCODED.getMimeType())
.field("content", new MessageTemplate(messageData).createMessageFromTemplate(discord.getTemplatePath()))
.field("content", MessageTemplate.createMessageFromTemplate(messageData, discord.getTemplatePath()))
.asString()
.getBody();
}
Expand All @@ -34,7 +34,7 @@ public void sendPhoto(MessageData messageData, byte[] chartImage) throws Messagi
.routeParam("channelId", discord.getChannelId())
.header("Authorization", "Bot " + discord.getBotToken())
.field("file", new ByteArrayInputStream(chartImage), ContentType.IMAGE_PNG, "chart.png")
.field("content", new MessageTemplate(messageData).createMessageFromTemplate(discord.getTemplatePath()))
.field("content", MessageTemplate.createMessageFromTemplate(messageData, discord.getTemplatePath()))
.asString()
.getBody();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public LoopClient(Loop loop) {
@Override
public void sendText(MessageData messageData) throws MessagingException {
Map<String, Object> body = new HashMap<>();
body.put("text", new MessageTemplate(messageData).createMessageFromTemplate(loop.getTemplatePath()));
body.put("text", MessageTemplate.createMessageFromTemplate(messageData, loop.getTemplatePath()));

Unirest.post(loop.getWebhookUrl())
.header("Content-Type", ContentType.APPLICATION_JSON.getMimeType())
Expand All @@ -35,7 +35,7 @@ public void sendPhoto(MessageData messageData, byte[] chartImage) throws Messagi
String encodedChartImage = Base64.getEncoder().encodeToString(chartImage);

Map<String, Object> body = new HashMap<>();
body.put("text", new MessageTemplate(messageData).createMessageFromTemplate(loop.getTemplatePath()));
body.put("text", MessageTemplate.createMessageFromTemplate(messageData, loop.getTemplatePath()));

Map<String, String> attachment = new HashMap<>();
attachment.put("image_url", "data:image/png;base64," + encodedChartImage);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,13 @@ public Email(Mail mail) {
@Override
public void sendText(MessageData messageData) throws MessagingException {
getBaseLetter(messageData)
.text(new MessageTemplate(messageData).createMessageFromTemplate(mail.getTemplatePath()))
.text(MessageTemplate.createMessageFromTemplate(messageData, mail.getTemplatePath()))
.send();
}

@Override
public void sendPhoto(MessageData messageData, byte[] chartImage) throws MessagingException {
String message = "<img src='cid:image'/><br/>" + new MessageTemplate(messageData).createMessageFromTemplate(
String message = "<img src='cid:image'/><br/>" + MessageTemplate.createMessageFromTemplate(messageData,
mail.getTemplatePath());
getBaseLetter(messageData)
.text(message)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public void sendPhoto(MessageData messageData, byte[] chartImage) throws Messagi

private void send(MessageData messageData, Map<String, Object> body) throws MessageBuildException {
body.put("channel_id", mattermost.getChat());
body.put("message", new MessageTemplate(messageData).createMessageFromTemplate(mattermost.getTemplatePath()));
body.put("message", MessageTemplate.createMessageFromTemplate(messageData, mattermost.getTemplatePath()));

Unirest.post("https://{uri}/api/v4/posts")
.routeParam("uri", mattermost.getUrl())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public RocketChatClient(RocketChat rocket) {
public void sendText(MessageData messageData) throws MessagingException {
Map<String, Object> body = new HashMap<>();
body.put("channel", rocketChat.getChannel());
body.put("text", new MessageTemplate(messageData).createMessageFromTemplate(rocketChat.getTemplatePath()));
body.put("text", MessageTemplate.createMessageFromTemplate(messageData, rocketChat.getTemplatePath()));
Unirest.post(rocketChat.getUrl() + "/api/v1/chat.postMessage")
.header("X-Auth-Token", rocketChat.getToken())
.header("X-User-Id", rocketChat.getUserId())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ private SkypeMessage createSimpleMessage(MessageData messageData) throws Message
return SkypeMessage.builder()
.type("message")
.from(from)
.text(new MessageTemplate(messageData).createMessageFromTemplate(skype.getTemplatePath()))
.text(MessageTemplate.createMessageFromTemplate(messageData, skype.getTemplatePath()))
.build();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ public void sendPhoto(MessageData messageData, byte[] chartImage) throws Messagi
}

private String createMessage(MessageData messageData) throws MessageBuildException {
return new MessageTemplate(messageData).createMessageFromTemplate(slack.getTemplatePath());
return MessageTemplate.createMessageFromTemplate(messageData, slack.getTemplatePath());
}

private void executeRequest(CloseableHttpClient client, String uri, List<NameValuePair> formData,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public void sendText(MessageData messageData) throws MessagingException {
.header("Content-Type", ContentType.APPLICATION_FORM_URLENCODED.getMimeType())
.field("chat_id", telegram.getChat())
.field("reply_to_message_id", telegram.getReplyTo() + "")
.field("text", new MessageTemplate(messageData).createMessageFromTemplate(telegram.getTemplatePath()))
.field("text", MessageTemplate.createMessageFromTemplate(messageData, telegram.getTemplatePath()))
.field("parse_mode", "HTML")
.asString()
.getBody();
Expand All @@ -37,7 +37,7 @@ public void sendPhoto(MessageData messageData, byte[] chartImage) throws Messagi
.field("photo", new ByteArrayInputStream(chartImage), ContentType.IMAGE_PNG, "chart.png")
.field("chat_id", telegram.getChat())
.field("reply_to_message_id", telegram.getReplyTo())
.field("caption", new MessageTemplate(messageData).createMessageFromTemplate(telegram.getTemplatePath()))
.field("caption", MessageTemplate.createMessageFromTemplate(messageData, telegram.getTemplatePath()))
.field("parse_mode", "HTML")
.asString()
.getBody();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,17 +1,18 @@
package guru.qa.allure.notifications.template;

import static freemarker.template.Configuration.VERSION_2_3_31;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import guru.qa.allure.notifications.exceptions.MessageBuildException;
import guru.qa.allure.notifications.template.config.TemplateConfig;
import guru.qa.allure.notifications.template.data.MessageData;
import lombok.extern.slf4j.Slf4j;

import java.io.File;
import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;
import java.util.Optional;

/**
* @author kadehar
Expand All @@ -21,32 +22,30 @@
@Slf4j
public class MessageTemplate {

private final MessageData messageData;
private final TemplateConfig templateConfig = new TemplateConfig();

public MessageTemplate(MessageData messageData) {
this.messageData = messageData;
}

public String createMessageFromTemplate(String templatePath) throws MessageBuildException {
log.info("Processing template {}", templatePath);
Template template;
try {
log.info("Parsing template");
File templateAsFile = new File(templatePath);
template = templateAsFile.exists()
? templateConfig.configure(Optional.of(templateAsFile)).getTemplate(templateAsFile.getName())
: templateConfig.configure(Optional.empty()).getTemplate(templatePath);
} catch (IOException ex) {
throw new MessageBuildException(String.format("Unable to parse template %s!", templatePath), ex);
}
Writer writer = new StringWriter();
try {
log.info("Convert template to string");
public static String createMessageFromTemplate(MessageData messageData, String templatePath)
throws MessageBuildException {
try (Writer writer = new StringWriter()) {
log.info("Processing template {}", templatePath);
Template template = getTemplate(templatePath);
log.info("Generating message using template");
template.process(messageData.getValues(), writer);
return writer.toString();
} catch (TemplateException | IOException ex) {
throw new MessageBuildException(String.format("Unable to parse template %s!", templatePath), ex);
}
return writer.toString();
}

private static Template getTemplate(String templatePath) throws IOException {
final Configuration config = new Configuration(VERSION_2_3_31);
config.setDefaultEncoding("UTF-8");

File templateAsFile = new File(templatePath);
if (templateAsFile.exists()) {
config.setDirectoryForTemplateLoading(templateAsFile.getParentFile());
return config.getTemplate(templateAsFile.getName());
} else {
config.setClassForTemplateLoading(MessageTemplate.class, "/");
return config.getTemplate(templatePath);
}
}
}

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ class EmailTests {
private static final String CC = "[email protected], [email protected]";
private static final String BCC = "[email protected]";
private static final String PROJECT = "LETTER PROJECT";
private static final String EMPTY_TEMPLATE_PATH = "/guru/qa/allure/notifications/template/emptyTemplate.ftl";
private static final String EMPTY_TEMPLATE_PATH = "/template/emptyTemplate.ftl";
private static final String TEXT_FROM_TEMPLATE = "for test purposes";
private static final byte[] IMG = new byte[1];

Expand Down
Original file line number Diff line number Diff line change
@@ -1,108 +1,60 @@
package guru.qa.allure.notifications.template;

import static java.lang.ClassLoader.getSystemResource;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.argThat;
import static org.mockito.Mockito.mockConstruction;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.junit.jupiter.params.provider.Arguments.arguments;

import java.io.File;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.HashMap;
import java.util.Optional;
import java.util.stream.Stream;

import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.mockito.Mock;
import org.mockito.MockedConstruction;
import org.mockito.junit.jupiter.MockitoExtension;
import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource;

import freemarker.template.Configuration;
import freemarker.template.Template;
import guru.qa.allure.notifications.config.Config;
import guru.qa.allure.notifications.exceptions.MessageBuildException;
import guru.qa.allure.notifications.json.JSON;
import guru.qa.allure.notifications.model.phrases.Phrases;
import guru.qa.allure.notifications.model.summary.Summary;
import guru.qa.allure.notifications.template.config.TemplateConfig;
import guru.qa.allure.notifications.template.data.MessageData;

@ExtendWith(MockitoExtension.class)
class MessageTemplateTests {
public static final String FILE_NAME = "testTemplate.ftl";

public static final String FILESYSTEM_PATH = "guru/qa/allure/notifications/template/" + FILE_NAME;
public static final String RESOURCES_PATH = "/templates/" + FILE_NAME;

@Mock private MessageData messageData;
@Mock private Configuration configuration;
@Mock private Template template;

@Test
void shouldCreateMessageFromTemplateFromFileSystem() throws MessageBuildException, IOException {
try (MockedConstruction<TemplateConfig> configMock = mockConstruction(TemplateConfig.class,
(mock, context) -> when(mock.configure(any())).thenReturn(configuration))) {
String fileSystemPath = ClassLoader.getSystemResource(FILESYSTEM_PATH).getFile();
when(configuration.getTemplate(FILE_NAME)).thenReturn(template);
when(messageData.getValues()).thenReturn(new HashMap<>());
MessageTemplate messageTemplate = new MessageTemplate(messageData);
messageTemplate.createMessageFromTemplate(fileSystemPath);

TemplateConfig templateConfig = configMock.constructed().get(0);
verify(templateConfig).configure(argThat(f ->
new File(fileSystemPath).toString().equals(f.get().toString())));
verify(configuration).getTemplate(FILE_NAME);
}
}

@Test
void shouldCreateMessageFromTemplateFromJar() throws MessageBuildException, IOException {
try (MockedConstruction<TemplateConfig> configMock = mockConstruction(TemplateConfig.class,
(mock, context) -> when(mock.configure(any())).thenReturn(configuration))) {
when(configuration.getTemplate(RESOURCES_PATH)).thenReturn(template);
when(messageData.getValues()).thenReturn(new HashMap<>());
MessageTemplate messageTemplate = new MessageTemplate(messageData);
messageTemplate.createMessageFromTemplate(RESOURCES_PATH);

TemplateConfig templateConfig = configMock.constructed().get(0);
verify(templateConfig).configure(Optional.empty());
verify(configuration).getTemplate(RESOURCES_PATH);
}
static Stream<Arguments> testData() {
return Stream.of(
arguments("templates/html.ftl", "messages/html.txt"),
arguments("templates/markdown.ftl", "messages/markdown.txt"),
arguments("templates/rocket.ftl", "messages/rocket.txt"),
arguments("templates/telegram.ftl", "messages/telegram.txt"),
arguments("template/testTemplateAsResource.ftl", "messages/customHtml.txt"),
arguments(getSystemResource("template/testTemplateAsFile.ftl").getFile(), "messages/customHtml.txt")
);
}

@ParameterizedTest
@CsvSource({
"templates/html.ftl, guru/qa/allure/notifications/template/messages/html.txt",
"templates/markdown.ftl, guru/qa/allure/notifications/template/messages/markdown.txt",
"templates/rocket.ftl, guru/qa/allure/notifications/template/messages/rocket.txt",
"templates/telegram.ftl, guru/qa/allure/notifications/template/messages/telegram.txt",
"guru/qa/allure/notifications/template/testTemplate.ftl, guru/qa/allure/notifications/template/messages/customHtml.txt"
})
@MethodSource("testData")
void shouldValidateGeneratedMessageFromTemplate(String templatePath, String expectedMessagePath)
throws IOException, URISyntaxException, MessageBuildException {
Config config = new JSON().parseResource(
"/guru/qa/allure/notifications/template/testConfig.json", Config.class);
Summary summary = new JSON().parseResource(
"/guru/qa/allure/notifications/template/testSummary.json", Summary.class);
ClassLoader classLoader = getClass().getClassLoader();
URL testSuitesUrl = classLoader.getResource("guru/qa/allure/notifications/template/testSuites.json");
String suitesSummaryJson = new String(Files.readAllBytes(Paths.get(testSuitesUrl.toURI())), UTF_8);

Config config = new JSON().parseResource("/data/testConfig.json", Config.class);
Summary summary = new JSON().parseResource("/data/testSummary.json", Summary.class);
String suitesSummaryJson = readResource("data/testSuites.json");
Phrases phrases = new JSON().parseResource("/phrases/en.json", Phrases.class);

MessageData testMessageData = new MessageData(config.getBase(), summary, suitesSummaryJson, phrases);
MessageTemplate messageTemplate = new MessageTemplate(testMessageData);
MessageData messageData = new MessageData(config.getBase(), summary, suitesSummaryJson, phrases);

String messageGeneratedFromTemplate = messageTemplate.createMessageFromTemplate(templatePath);
URL expectedMessageUrl = classLoader.getResource(expectedMessagePath);
String expectedMessage = new String(Files.readAllBytes(Paths.get(expectedMessageUrl.toURI())), UTF_8);
String messageGeneratedFromTemplate = MessageTemplate.createMessageFromTemplate(messageData, templatePath);
String expectedMessage = readResource(expectedMessagePath);
assertEquals(expectedMessage, messageGeneratedFromTemplate);
}

private String readResource(String name) throws IOException, URISyntaxException {
URL resourceUrl = getClass().getClassLoader().getResource(name);
return new String(Files.readAllBytes(Paths.get(resourceUrl.toURI())), UTF_8);
}
}
Loading

0 comments on commit 6e1f0ea

Please sign in to comment.