feat: add more tests
This commit is contained in:
272
hermes_test.go
272
hermes_test.go
@ -5,13 +5,42 @@ import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestHermes_ok(t *testing.T) {
|
||||
var testedThemes = []Theme{
|
||||
// Insert your new theme here
|
||||
new(Default),
|
||||
}
|
||||
|
||||
/////////////////////////////////////////////////////
|
||||
// Every theme should display the same information //
|
||||
// Find below the tests to check that //
|
||||
/////////////////////////////////////////////////////
|
||||
|
||||
// Implement this interface when creating a new example checking a common feature of all themes
|
||||
type Example interface {
|
||||
// Create the hermes example with data
|
||||
// Represents the "Given" step in Given/When/Then Workflow
|
||||
getExample() (h Hermes, email Email)
|
||||
// Checks the content of the generated HTML email by asserting content presence or not
|
||||
assertHTMLContent(t *testing.T, s string)
|
||||
// Checks the content of the generated Plaintext email by asserting content presence or not
|
||||
assertPlainTextContent(t *testing.T, s string)
|
||||
}
|
||||
|
||||
// Scenario
|
||||
type SimpleExample struct {
|
||||
theme Theme
|
||||
}
|
||||
|
||||
func (ed *SimpleExample) getExample() (Hermes, Email) {
|
||||
h := Hermes{
|
||||
Theme: ed.theme,
|
||||
Product: Product{
|
||||
Name: "Hermes",
|
||||
Link: "http://hermes.com",
|
||||
Name: "HermesName",
|
||||
Link: "http://hermes-link.com",
|
||||
Copyright: "Copyright © Hermes-Test",
|
||||
Logo: "http://www.duchess-france.org/wp-content/uploads/2016/01/gopher.png",
|
||||
},
|
||||
TextDirection: TDLeftToRight,
|
||||
}
|
||||
|
||||
email := Email{
|
||||
@ -25,6 +54,29 @@ func TestHermes_ok(t *testing.T) {
|
||||
{"Lastname", "Snow"},
|
||||
{"Birthday", "01/01/283"},
|
||||
},
|
||||
Table: Table{
|
||||
Data: [][]Entry{
|
||||
{
|
||||
{Key: "Item", Value: "Golang"},
|
||||
{Key: "Description", Value: "Open source programming language that makes it easy to build simple, reliable, and efficient software"},
|
||||
{Key: "Price", Value: "$10.99"},
|
||||
},
|
||||
{
|
||||
{Key: "Item", Value: "Hermes"},
|
||||
{Key: "Description", Value: "Programmatically create beautiful e-mails using Golang."},
|
||||
{Key: "Price", Value: "$1.99"},
|
||||
},
|
||||
},
|
||||
Columns: Columns{
|
||||
CustomWidth: map[string]string{
|
||||
"Item": "20%",
|
||||
"Price": "15%",
|
||||
},
|
||||
CustomAlignement: map[string]string{
|
||||
"Price": "right",
|
||||
},
|
||||
},
|
||||
},
|
||||
Actions: []Action{
|
||||
{
|
||||
Instructions: "To get started with Hermes, please click here:",
|
||||
@ -40,21 +92,206 @@ func TestHermes_ok(t *testing.T) {
|
||||
},
|
||||
},
|
||||
}
|
||||
return h, email
|
||||
}
|
||||
|
||||
func (ed *SimpleExample) assertHTMLContent(t *testing.T, r string) {
|
||||
|
||||
// Assert on product
|
||||
assert.Contains(t, r, "HermesName", "Product: Should find the name of the product in email")
|
||||
assert.Contains(t, r, "http://hermes-link.com", "Product: Should find the link of the product in email")
|
||||
assert.Contains(t, r, "Copyright © Hermes-Test", "Product: Should find the Copyright of the product in email")
|
||||
assert.Contains(t, r, "http://www.duchess-france.org/wp-content/uploads/2016/01/gopher.png", "Product: Should find the logo of the product in email")
|
||||
|
||||
// Assert on email body
|
||||
assert.Contains(t, r, "Hi Jon Snow", "Name: Should find the name of the person")
|
||||
assert.Contains(t, r, "Welcome to Hermes", "Intro: Should have intro")
|
||||
assert.Contains(t, r, "Birthday", "Dictionary: Should have dictionary")
|
||||
assert.Contains(t, r, "Open source programming language", "Table: Should have table with first row and first column")
|
||||
assert.Contains(t, r, "Programmatically create beautiful e-mails using Golang", "Table: Should have table with second row and first column")
|
||||
assert.Contains(t, r, "$10.99", "Table: Should have table with first row and second column")
|
||||
assert.Contains(t, r, "$1.99", "Table: Should have table with second row and second column")
|
||||
assert.Contains(t, r, "started with Hermes", "Action: Should have instruction")
|
||||
assert.Contains(t, r, "Confirm your account", "Action: Should have button of action")
|
||||
assert.Contains(t, r, "#22BC66", "Action: Button should have given color")
|
||||
assert.Contains(t, r, "https://hermes-example.com/confirm?token=d9729feb74992cc3482b350163a1a010", "Action: Button should have link")
|
||||
assert.Contains(t, r, "Need help, or have questions", "Outro: Should have outro")
|
||||
}
|
||||
|
||||
func (ed *SimpleExample) assertPlainTextContent(t *testing.T, r string) {
|
||||
|
||||
// Assert on product
|
||||
assert.Contains(t, r, "HermesName", "Product: Should find the name of the product in email")
|
||||
assert.Contains(t, r, "http://hermes-link.com", "Product: Should find the link of the product in email")
|
||||
assert.Contains(t, r, "Copyright © Hermes-Test", "Product: Should find the Copyright of the product in email")
|
||||
assert.NotContains(t, r, "http://www.duchess-france.org/wp-content/uploads/2016/01/gopher.png", "Product: Should not find any logo in plain text")
|
||||
|
||||
// Assert on email body
|
||||
assert.Contains(t, r, "Hi Jon Snow", "Name: Should find the name of the person")
|
||||
assert.Contains(t, r, "Welcome to Hermes", "Intro: Should have intro")
|
||||
assert.Contains(t, r, "Birthday", "Dictionary: Should have dictionary")
|
||||
assert.NotContains(t, r, "Open source programming language", "Table: Not possible to have table in plain text")
|
||||
assert.NotContains(t, r, "Programmatically create beautiful e-mails using Golang", "Table: Not possible to have table in plain text")
|
||||
assert.NotContains(t, r, "$10.99", "Table: Not possible to have table in plain text")
|
||||
assert.NotContains(t, r, "$1.99", "Table: Not possible to have table in plain text")
|
||||
assert.Contains(t, r, "started with Hermes", "Action: Should have instruction")
|
||||
assert.NotContains(t, r, "Confirm your account", "Action: Should not have button of action in plain text")
|
||||
assert.NotContains(t, r, "#22BC66", "Action: Button should not have color in plain text")
|
||||
assert.Contains(t, r, "https://hermes-example.com/confirm?token=d9729feb74992cc3482b350163a1a010", "Action: Even if button is not possible in plain text, it should have the link")
|
||||
assert.Contains(t, r, "Need help, or have questions", "Outro: Should have outro")
|
||||
}
|
||||
|
||||
type WithTitleInsteadOfNameExample struct {
|
||||
theme Theme
|
||||
}
|
||||
|
||||
func (ed *WithTitleInsteadOfNameExample) getExample() (Hermes, Email) {
|
||||
h := Hermes{
|
||||
Theme: ed.theme,
|
||||
Product: Product{
|
||||
Name: "Hermes",
|
||||
Link: "http://hermes.com",
|
||||
},
|
||||
}
|
||||
|
||||
email := Email{
|
||||
Body{
|
||||
Name: "Jon Snow",
|
||||
Title: "A new e-mail",
|
||||
},
|
||||
}
|
||||
return h, email
|
||||
}
|
||||
|
||||
func (ed *WithTitleInsteadOfNameExample) assertHTMLContent(t *testing.T, r string) {
|
||||
assert.NotContains(t, r, "Hi Jon Snow", "Name: should not find greetings from Jon Snow because title should be used")
|
||||
assert.Contains(t, r, "A new e-mail", "Title should be used instead of name")
|
||||
}
|
||||
|
||||
func (ed *WithTitleInsteadOfNameExample) assertPlainTextContent(t *testing.T, r string) {
|
||||
assert.NotContains(t, r, "Hi Jon Snow", "Name: should not find greetings from Jon Snow because title should be used")
|
||||
assert.Contains(t, r, "A new e-mail", "Title shoud be used instead of name")
|
||||
}
|
||||
|
||||
type WithGreetingDifferentThanDefault struct {
|
||||
theme Theme
|
||||
}
|
||||
|
||||
func (ed *WithGreetingDifferentThanDefault) getExample() (Hermes, Email) {
|
||||
h := Hermes{
|
||||
Theme: ed.theme,
|
||||
Product: Product{
|
||||
Name: "Hermes",
|
||||
Link: "http://hermes.com",
|
||||
},
|
||||
}
|
||||
|
||||
email := Email{
|
||||
Body{
|
||||
Greeting: "Dear",
|
||||
Name: "Jon Snow",
|
||||
},
|
||||
}
|
||||
return h, email
|
||||
}
|
||||
|
||||
func (ed *WithGreetingDifferentThanDefault) assertHTMLContent(t *testing.T, r string) {
|
||||
assert.NotContains(t, r, "Hi Jon Snow", "Should not find greetings with 'Hi' which is default")
|
||||
assert.Contains(t, r, "Dear Jon Snow", "Should have greeting with Dear")
|
||||
}
|
||||
|
||||
func (ed *WithGreetingDifferentThanDefault) assertPlainTextContent(t *testing.T, r string) {
|
||||
assert.NotContains(t, r, "Hi Jon Snow", "Should not find greetings with 'Hi' which is default")
|
||||
assert.Contains(t, r, "Dear Jon Snow", "Should have greeting with Dear")
|
||||
}
|
||||
|
||||
type WithSignatureDifferentThanDefault struct {
|
||||
theme Theme
|
||||
}
|
||||
|
||||
func (ed *WithSignatureDifferentThanDefault) getExample() (Hermes, Email) {
|
||||
h := Hermes{
|
||||
Theme: ed.theme,
|
||||
Product: Product{
|
||||
Name: "Hermes",
|
||||
Link: "http://hermes.com",
|
||||
},
|
||||
}
|
||||
|
||||
email := Email{
|
||||
Body{
|
||||
Name: "Jon Snow",
|
||||
Signature: "Best regards",
|
||||
},
|
||||
}
|
||||
return h, email
|
||||
}
|
||||
|
||||
func (ed *WithSignatureDifferentThanDefault) assertHTMLContent(t *testing.T, r string) {
|
||||
assert.NotContains(t, r, "Yours truly", "Should not find signature with 'Yours truly' which is default")
|
||||
assert.Contains(t, r, "Best regards", "Should have greeting with Dear")
|
||||
}
|
||||
|
||||
func (ed *WithSignatureDifferentThanDefault) assertPlainTextContent(t *testing.T, r string) {
|
||||
assert.NotContains(t, r, "Yours truly", "Should not find signature with 'Yours truly' which is default")
|
||||
assert.Contains(t, r, "Best regards", "Should have greeting with Dear")
|
||||
}
|
||||
|
||||
// Test all the themes for the features
|
||||
|
||||
func TestThemeSimple(t *testing.T) {
|
||||
for _, theme := range testedThemes {
|
||||
checkExample(t, &SimpleExample{theme})
|
||||
}
|
||||
}
|
||||
|
||||
func TestThemeWithTitleInsteadOfName(t *testing.T) {
|
||||
for _, theme := range testedThemes {
|
||||
checkExample(t, &WithTitleInsteadOfNameExample{theme})
|
||||
}
|
||||
}
|
||||
|
||||
func TestThemeWithGreetingDifferentThanDefault(t *testing.T) {
|
||||
for _, theme := range testedThemes {
|
||||
checkExample(t, &WithGreetingDifferentThanDefault{theme})
|
||||
}
|
||||
}
|
||||
|
||||
func TestThemeWithGreetingDiffrentThanDefault(t *testing.T) {
|
||||
for _, theme := range testedThemes {
|
||||
checkExample(t, &WithSignatureDifferentThanDefault{theme})
|
||||
}
|
||||
}
|
||||
|
||||
func checkExample(t *testing.T, ex Example) {
|
||||
// Given an example
|
||||
h, email := ex.getExample()
|
||||
|
||||
// When generating HTML template
|
||||
r, err := h.GenerateHTML(email)
|
||||
t.Log(r)
|
||||
assert.Nil(t, err)
|
||||
assert.NotEmpty(t, r)
|
||||
|
||||
// Then asserting HTML is OK
|
||||
ex.assertHTMLContent(t, r)
|
||||
|
||||
// When generating plain text template
|
||||
r, err = h.GeneratePlainText(email)
|
||||
t.Log(r)
|
||||
assert.Nil(t, err)
|
||||
assert.NotEmpty(t, r)
|
||||
|
||||
assert.Equal(t, h.Theme.Name(), "default")
|
||||
// Then asserting plain text is OK
|
||||
ex.assertPlainTextContent(t, r)
|
||||
}
|
||||
|
||||
func TestHermes_defaultTextDirection(t *testing.T) {
|
||||
////////////////////////////////////////////
|
||||
// Tests on default values for all themes //
|
||||
// It does not check email content //
|
||||
////////////////////////////////////////////
|
||||
|
||||
func TestHermes_TextDirectionAsDefault(t *testing.T) {
|
||||
h := Hermes{
|
||||
Product: Product{
|
||||
Name: "Hermes",
|
||||
@ -88,4 +325,29 @@ func TestHermes_defaultTextDirection(t *testing.T) {
|
||||
_, err := h.GenerateHTML(email)
|
||||
assert.Nil(t, err)
|
||||
assert.Equal(t, h.TextDirection, TDLeftToRight)
|
||||
assert.Equal(t, h.Theme.Name(), "default")
|
||||
}
|
||||
|
||||
func TestHermes_Default(t *testing.T) {
|
||||
h := Hermes{}
|
||||
setDefaultHermesValues(&h)
|
||||
email := Email{}
|
||||
setDefaultEmailValues(&email)
|
||||
|
||||
assert.Equal(t, h.TextDirection, TDLeftToRight)
|
||||
assert.Equal(t, h.Theme, new(Default))
|
||||
assert.Equal(t, h.Product.Name, "Hermes")
|
||||
assert.Equal(t, h.Product.Copyright, "Copyright © 2017 Hermes. All rights reserved.")
|
||||
|
||||
assert.Empty(t, email.Body.Actions)
|
||||
assert.Empty(t, email.Body.Dictionary)
|
||||
assert.Empty(t, email.Body.Intros)
|
||||
assert.Empty(t, email.Body.Outros)
|
||||
assert.Empty(t, email.Body.Table.Data)
|
||||
assert.Empty(t, email.Body.Table.Columns.CustomWidth)
|
||||
assert.Empty(t, email.Body.Table.Columns.CustomAlignement)
|
||||
|
||||
assert.Equal(t, email.Body.Greeting, "Hi")
|
||||
assert.Equal(t, email.Body.Signature, "Yours truly")
|
||||
assert.Empty(t, email.Body.Title)
|
||||
}
|
||||
|
Reference in New Issue
Block a user