feat: notification service
This commit is contained in:
@@ -17,9 +17,9 @@ func TestNewCatalogBuildsImmutableRegistry(t *testing.T) {
|
||||
rootDir := t.TempDir()
|
||||
writeTemplateFile(t, rootDir, filepath.Join("auth.login_code", "en", "subject.tmpl"), "Your login code")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("auth.login_code", "en", "text.tmpl"), "Code: {{.code}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn_ready", "fr-fr", "subject.tmpl"), "Tour {{.turn_number}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn_ready", "fr-fr", "text.tmpl"), "Bonjour {{with .player}}{{.name}}{{end}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn_ready", "fr-fr", "html.tmpl"), "<p>{{.player.name}}</p>")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn.ready", "fr-fr", "subject.tmpl"), "Tour {{.turn_number}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn.ready", "fr-fr", "text.tmpl"), "Bonjour {{with .player}}{{.name}}{{end}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn.ready", "fr-fr", "html.tmpl"), "<p>{{.player.name}}</p>")
|
||||
|
||||
catalog, err := NewCatalog(rootDir)
|
||||
require.NoError(t, err)
|
||||
@@ -27,7 +27,7 @@ func TestNewCatalogBuildsImmutableRegistry(t *testing.T) {
|
||||
|
||||
locale, err := common.ParseLocale("fr-FR")
|
||||
require.NoError(t, err)
|
||||
resolved, err := catalog.Lookup(common.TemplateID("game.turn_ready"), locale)
|
||||
resolved, err := catalog.Lookup(common.TemplateID("game.turn.ready"), locale)
|
||||
require.NoError(t, err)
|
||||
require.False(t, resolved.LocaleFallbackUsed())
|
||||
require.Equal(t, common.Locale("fr-FR"), resolved.ResolvedLocale())
|
||||
@@ -66,15 +66,15 @@ func TestCatalogLookupFallsBackToEnglish(t *testing.T) {
|
||||
rootDir := t.TempDir()
|
||||
writeTemplateFile(t, rootDir, filepath.Join("auth.login_code", "en", "subject.tmpl"), "Your login code")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("auth.login_code", "en", "text.tmpl"), "Code: {{.code}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn_ready", "en", "subject.tmpl"), "Turn {{.turn_number}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn_ready", "en", "text.tmpl"), "Hello {{.player.name}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn.ready", "en", "subject.tmpl"), "Turn {{.turn_number}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn.ready", "en", "text.tmpl"), "Hello {{.player.name}}")
|
||||
|
||||
catalog, err := NewCatalog(rootDir)
|
||||
require.NoError(t, err)
|
||||
|
||||
locale, err := common.ParseLocale("fr-FR")
|
||||
require.NoError(t, err)
|
||||
resolved, err := catalog.Lookup(common.TemplateID("game.turn_ready"), locale)
|
||||
resolved, err := catalog.Lookup(common.TemplateID("game.turn.ready"), locale)
|
||||
require.NoError(t, err)
|
||||
require.True(t, resolved.LocaleFallbackUsed())
|
||||
require.Equal(t, common.Locale("en"), resolved.ResolvedLocale())
|
||||
@@ -86,15 +86,15 @@ func TestCatalogLookupRejectsMissingEnglishFallback(t *testing.T) {
|
||||
rootDir := t.TempDir()
|
||||
writeTemplateFile(t, rootDir, filepath.Join("auth.login_code", "en", "subject.tmpl"), "Your login code")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("auth.login_code", "en", "text.tmpl"), "Code: {{.code}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn_ready", "fr-FR", "subject.tmpl"), "Tour {{.turn_number}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn_ready", "fr-FR", "text.tmpl"), "Bonjour {{.player.name}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn.ready", "fr-FR", "subject.tmpl"), "Tour {{.turn_number}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn.ready", "fr-FR", "text.tmpl"), "Bonjour {{.player.name}}")
|
||||
|
||||
catalog, err := NewCatalog(rootDir)
|
||||
require.NoError(t, err)
|
||||
|
||||
locale, err := common.ParseLocale("de-DE")
|
||||
require.NoError(t, err)
|
||||
_, err = catalog.Lookup(common.TemplateID("game.turn_ready"), locale)
|
||||
_, err = catalog.Lookup(common.TemplateID("game.turn.ready"), locale)
|
||||
require.Error(t, err)
|
||||
require.True(t, errors.Is(err, ErrFallbackMissing))
|
||||
}
|
||||
@@ -111,7 +111,7 @@ func TestCatalogLookupRejectsUnknownTemplateFamily(t *testing.T) {
|
||||
|
||||
locale, err := common.ParseLocale("en")
|
||||
require.NoError(t, err)
|
||||
_, err = catalog.Lookup(common.TemplateID("game.turn_ready"), locale)
|
||||
_, err = catalog.Lookup(common.TemplateID("game.turn.ready"), locale)
|
||||
require.Error(t, err)
|
||||
require.True(t, errors.Is(err, ErrTemplateNotFound))
|
||||
}
|
||||
@@ -143,8 +143,8 @@ func TestCatalogVersionIsDeterministic(t *testing.T) {
|
||||
rootDir := t.TempDir()
|
||||
writeTemplateFile(t, rootDir, filepath.Join("auth.login_code", "en", "subject.tmpl"), "Your login code")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("auth.login_code", "en", "text.tmpl"), "Code: {{.code}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn_ready", "en", "subject.tmpl"), "Turn {{.turn_number}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn_ready", "en", "text.tmpl"), "Hello {{.player.name}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn.ready", "en", "subject.tmpl"), "Turn {{.turn_number}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn.ready", "en", "text.tmpl"), "Hello {{.player.name}}")
|
||||
|
||||
firstCatalog, err := NewCatalog(rootDir)
|
||||
require.NoError(t, err)
|
||||
@@ -153,9 +153,9 @@ func TestCatalogVersionIsDeterministic(t *testing.T) {
|
||||
|
||||
locale, err := common.ParseLocale("en")
|
||||
require.NoError(t, err)
|
||||
firstResolved, err := firstCatalog.Lookup(common.TemplateID("game.turn_ready"), locale)
|
||||
firstResolved, err := firstCatalog.Lookup(common.TemplateID("game.turn.ready"), locale)
|
||||
require.NoError(t, err)
|
||||
secondResolved, err := secondCatalog.Lookup(common.TemplateID("game.turn_ready"), locale)
|
||||
secondResolved, err := secondCatalog.Lookup(common.TemplateID("game.turn.ready"), locale)
|
||||
require.NoError(t, err)
|
||||
|
||||
require.Equal(t, firstResolved.Template().Version, secondResolved.Template().Version)
|
||||
@@ -173,8 +173,8 @@ func TestNewCatalogRejectsMissingRequiredStartupTemplate(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
rootDir := t.TempDir()
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn_ready", "en", "subject.tmpl"), "Turn {{.turn_number}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn_ready", "en", "text.tmpl"), "Hello {{.player.name}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn.ready", "en", "subject.tmpl"), "Turn {{.turn_number}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn.ready", "en", "text.tmpl"), "Hello {{.player.name}}")
|
||||
|
||||
_, err := NewCatalog(rootDir)
|
||||
require.Error(t, err)
|
||||
@@ -187,8 +187,8 @@ func TestNewCatalogRejectsBrokenTemplateParse(t *testing.T) {
|
||||
rootDir := t.TempDir()
|
||||
writeTemplateFile(t, rootDir, filepath.Join("auth.login_code", "en", "subject.tmpl"), "Your login code")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("auth.login_code", "en", "text.tmpl"), "Code: {{.code}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn_ready", "en", "subject.tmpl"), "{{if .turn_number}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn_ready", "en", "text.tmpl"), "Hello {{.player.name}}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn.ready", "en", "subject.tmpl"), "{{if .turn_number}")
|
||||
writeTemplateFile(t, rootDir, filepath.Join("game.turn.ready", "en", "text.tmpl"), "Hello {{.player.name}}")
|
||||
|
||||
_, err := NewCatalog(rootDir)
|
||||
require.Error(t, err)
|
||||
|
||||
@@ -0,0 +1,58 @@
|
||||
package templates
|
||||
|
||||
import (
|
||||
"path/filepath"
|
||||
"runtime"
|
||||
"testing"
|
||||
|
||||
"galaxy/mail/internal/domain/common"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
var expectedNotificationTemplateIDs = []common.TemplateID{
|
||||
"geo.review_recommended",
|
||||
"game.turn.ready",
|
||||
"game.finished",
|
||||
"game.generation_failed",
|
||||
"lobby.runtime_paused_after_start",
|
||||
"lobby.application.submitted",
|
||||
"lobby.membership.approved",
|
||||
"lobby.membership.rejected",
|
||||
"lobby.invite.created",
|
||||
"lobby.invite.redeemed",
|
||||
"lobby.invite.expired",
|
||||
}
|
||||
|
||||
func TestCheckedInTemplateCatalogIncludesNotificationEnglishAssets(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
catalog, err := NewCatalog(checkedInTemplateRoot(t))
|
||||
require.NoError(t, err)
|
||||
|
||||
locale, err := common.ParseLocale("en")
|
||||
require.NoError(t, err)
|
||||
|
||||
authTemplate, err := catalog.Lookup(common.TemplateID("auth.login_code"), locale)
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, common.Locale("en"), authTemplate.ResolvedLocale())
|
||||
require.False(t, authTemplate.LocaleFallbackUsed())
|
||||
|
||||
for _, templateID := range expectedNotificationTemplateIDs {
|
||||
resolved, err := catalog.Lookup(templateID, locale)
|
||||
require.NoErrorf(t, err, "lookup checked-in template %s", templateID)
|
||||
require.Equalf(t, common.Locale("en"), resolved.ResolvedLocale(), "template %s must resolve to en", templateID)
|
||||
require.Falsef(t, resolved.LocaleFallbackUsed(), "template %s must not use fallback for en", templateID)
|
||||
}
|
||||
}
|
||||
|
||||
func checkedInTemplateRoot(t *testing.T) string {
|
||||
t.Helper()
|
||||
|
||||
_, thisFile, _, ok := runtime.Caller(0)
|
||||
if !ok {
|
||||
require.FailNow(t, "runtime.Caller failed")
|
||||
}
|
||||
|
||||
return filepath.Clean(filepath.Join(filepath.Dir(thisFile), "..", "..", "..", "templates"))
|
||||
}
|
||||
Reference in New Issue
Block a user