go/i18n_test.go
Snider f1ed1f0ac5 feat: WithService with v0.3.3 name discovery + IPC handler auto-registration
- WithService now calls factory, discovers service name from package path via
  reflect/runtime (last path segment, _test suffix stripped, lowercased), and
  calls RegisterService — which handles Startable/Stoppable/HandleIPCEvents
- If factory returns nil Value (self-registered), WithService returns OK without
  a second registration
- Add contract_test.go with _Good/_Bad tests covering all three code paths
- Fix core.go Cli() accessor: use ServiceFor[*Cli](c, "cli") (was cli.New())
- Fix pre-existing })) → }}) syntax errors in command_test, service_test, lock_test
- Fix pre-existing Options{...} → NewOptions(...) in core_test, data_test,
  drive_test, i18n_test (Options is a struct, not a slice)

Co-Authored-By: Virgil <virgil@lethean.io>
2026-03-24 20:02:53 +00:00

96 lines
2.5 KiB
Go

package core_test
import (
"testing"
. "dappco.re/go/core"
"github.com/stretchr/testify/assert"
)
// --- I18n ---
func TestI18n_Good(t *testing.T) {
c := New().Value.(*Core)
assert.NotNil(t, c.I18n())
}
func TestI18n_AddLocales_Good(t *testing.T) {
c := New().Value.(*Core)
r := c.Data().New(NewOptions(
Option{Key: "name", Value: "lang"},
Option{Key: "source", Value: testFS},
Option{Key: "path", Value: "testdata"},
))
if r.OK {
c.I18n().AddLocales(r.Value.(*Embed))
}
r2 := c.I18n().Locales()
assert.True(t, r2.OK)
assert.Len(t, r2.Value.([]*Embed), 1)
}
func TestI18n_Locales_Empty_Good(t *testing.T) {
c := New().Value.(*Core)
r := c.I18n().Locales()
assert.True(t, r.OK)
assert.Empty(t, r.Value.([]*Embed))
}
// --- Translator (no translator registered) ---
func TestI18n_Translate_NoTranslator_Good(t *testing.T) {
c := New().Value.(*Core)
// Without a translator, Translate returns the key as-is
r := c.I18n().Translate("greeting.hello")
assert.True(t, r.OK)
assert.Equal(t, "greeting.hello", r.Value)
}
func TestI18n_SetLanguage_NoTranslator_Good(t *testing.T) {
c := New().Value.(*Core)
r := c.I18n().SetLanguage("de")
assert.True(t, r.OK) // no-op without translator
}
func TestI18n_Language_NoTranslator_Good(t *testing.T) {
c := New().Value.(*Core)
assert.Equal(t, "en", c.I18n().Language())
}
func TestI18n_AvailableLanguages_NoTranslator_Good(t *testing.T) {
c := New().Value.(*Core)
langs := c.I18n().AvailableLanguages()
assert.Equal(t, []string{"en"}, langs)
}
func TestI18n_Translator_Nil_Good(t *testing.T) {
c := New().Value.(*Core)
assert.False(t, c.I18n().Translator().OK)
}
// --- Translator (with mock) ---
type mockTranslator struct {
lang string
}
func (m *mockTranslator) Translate(id string, args ...any) Result {
return Result{"translated:" + id, true}
}
func (m *mockTranslator) SetLanguage(lang string) error { m.lang = lang; return nil }
func (m *mockTranslator) Language() string { return m.lang }
func (m *mockTranslator) AvailableLanguages() []string { return []string{"en", "de", "fr"} }
func TestI18n_WithTranslator_Good(t *testing.T) {
c := New().Value.(*Core)
tr := &mockTranslator{lang: "en"}
c.I18n().SetTranslator(tr)
assert.Equal(t, tr, c.I18n().Translator().Value)
assert.Equal(t, "translated:hello", c.I18n().Translate("hello").Value)
assert.Equal(t, "en", c.I18n().Language())
assert.Equal(t, []string{"en", "de", "fr"}, c.I18n().AvailableLanguages())
c.I18n().SetLanguage("de")
assert.Equal(t, "de", c.I18n().Language())
}