locale_test.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package discord
  2. import (
  3. "context"
  4. "encoding/json"
  5. "net/http"
  6. "net/http/httptest"
  7. "os"
  8. "testing"
  9. "github.com/mhsanaei/3x-ui/v3/internal/eventbus"
  10. "github.com/mhsanaei/3x-ui/v3/internal/web/locale"
  11. )
  12. type fixedTgLang struct{}
  13. func (fixedTgLang) GetTgLang() (string, error) { return "en-US", nil }
  14. // TestMain loads the real translation files so embeds render text instead of bare keys.
  15. func TestMain(m *testing.M) {
  16. if err := locale.InitLocalizer(os.DirFS("../.."), fixedTgLang{}); err != nil {
  17. panic(err)
  18. }
  19. os.Exit(m.Run())
  20. }
  21. func TestDiscordMessagesFollowDiscordLang(t *testing.T) {
  22. const lang = "ru-RU"
  23. settingService := setupTestDB(t)
  24. _ = settingService.SetDiscordLang(lang)
  25. _ = settingService.SetDiscordBotToken("token")
  26. _ = settingService.SetDiscordChannelId("ch-1")
  27. _ = settingService.SetDiscordAdminIds("admin-1")
  28. titles := make(chan string, 4)
  29. server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  30. var p MessagePayload
  31. _ = json.NewDecoder(r.Body).Decode(&p)
  32. if len(p.Embeds) > 0 {
  33. titles <- p.Embeds[0].Title
  34. }
  35. w.WriteHeader(http.StatusOK)
  36. }))
  37. defer server.Close()
  38. svc := NewDiscordService(settingService)
  39. svc.SetBaseURL(server.URL)
  40. svc.SetHTTPClient(server.Client())
  41. sentTitle := func(t *testing.T) string {
  42. t.Helper()
  43. select {
  44. case title := <-titles:
  45. return title
  46. default:
  47. t.Fatal("no embed reached Discord")
  48. return ""
  49. }
  50. }
  51. cases := []struct {
  52. key string
  53. render func(t *testing.T) string
  54. }{
  55. {"discord.test.title", func(t *testing.T) string {
  56. if err := svc.SendTest(context.Background()); err != nil {
  57. t.Fatalf("SendTest: %v", err)
  58. }
  59. return sentTitle(t)
  60. }},
  61. {"discord.alerts.xrayCrash", func(t *testing.T) string {
  62. embed, _ := NewSubscriber(settingService, svc).FormatEmbed(eventbus.Event{Type: eventbus.EventXrayCrash})
  63. return embed.Title
  64. }},
  65. {"discord.report.title", func(t *testing.T) string {
  66. payload, _, err := svc.BuildReport(context.Background(), nil, nil)
  67. if err != nil {
  68. t.Fatalf("BuildReport: %v", err)
  69. }
  70. return payload.Embeds[0].Title
  71. }},
  72. {"discord.commands.helpTitle", func(t *testing.T) string {
  73. msg := MessageCreateData{ChannelID: "ch-1", Content: "!help"}
  74. msg.Author.ID = "admin-1"
  75. NewGatewayClient(svc, settingService, nil, nil, nil).handleMessage(context.Background(), msg)
  76. return sentTitle(t)
  77. }},
  78. }
  79. for _, tc := range cases {
  80. t.Run(tc.key, func(t *testing.T) {
  81. want := locale.I18nForLang(lang, tc.key)
  82. if want == locale.I18nForLang("en-US", tc.key) {
  83. t.Fatalf("%s has no distinct %s translation", tc.key, lang)
  84. }
  85. if got := tc.render(t); got != want {
  86. t.Fatalf("title = %q, want the %s text %q", got, lang, want)
  87. }
  88. })
  89. }
  90. }