/
t3
/
cli
Обзор
Документация
Войти
/
t3
/
cli
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
master
test/bridge_test.go
219 строк
6 KB
Ivan
renamed init to user_init
09 июл 2026, 12:22
09 июл 2026, 12:22
70d8b88
Код
Авторство
О чём код?
package test import ( "log/slog" "os" "testing" "github.com/dop251/goja" "gitverse.ru/t3/cli/internal/engine" "gitverse.ru/t3/cli/internal/engine/bridge" "gitverse.ru/t3/cli/internal/metrics" ) func TestBridgeGlobalThisAccessible(t *testing.T) { registry := metrics.NewRegistry("test-host") vm := goja.New() bridge.NewMetrics(vm, registry) _, err := vm.RunString(` var t3obj = globalThis.t3; if (typeof t3obj === 'undefined' || t3obj === null) { throw new Error("globalThis.t3 is undefined"); } if (typeof t3obj.Counter !== 'function') { throw new Error("t3.Counter is not a function"); } var c = t3obj.Counter("test_counter"); if (typeof c === 'undefined' || c === null) { throw new Error("t3.Counter returned undefined"); } c.add(5); if (c.value() !== 5) { throw new Error("counter value is not 5, got: " + c.value()); } `) if err != nil { t.Fatal(err) } snap := registry.Snapshot() if len(snap.CustomMetrics) == 0 { t.Fatal("custom metrics snapshot is empty - bridge Counter did not register") } t.Logf("snapshot custom metrics count: %d", len(snap.CustomMetrics)) for _, cm := range snap.CustomMetrics { t.Logf(" %s (%s) = %d", cm.Name, cm.Type, cm.Value.GetCounter()) } } func TestBridgeRegistryIntegration(t *testing.T) { registry := metrics.NewRegistry("test-host") vm := goja.New() bridge.NewMetrics(vm, registry) _, err := vm.RunString(` var c = globalThis.t3.Counter("http_requests"); if (typeof c === 'undefined') { throw new Error("Counter returned undefined"); } `) if err != nil { t.Fatal(err) } snap := registry.Snapshot() if len(snap.CustomMetrics) != 1 { t.Fatalf("expected 1 custom metric in snapshot, got %d", len(snap.CustomMetrics)) } if snap.CustomMetrics[0].Name != "http_requests" { t.Fatalf("expected name 'http_requests', got '%s'", snap.CustomMetrics[0].Name) } } func TestBridgeNilRegistry(t *testing.T) { vm := goja.New() bridge.NewMetrics(vm, nil) _, err := vm.RunString(` var c = globalThis.t3.Counter("test"); if (typeof c === 'undefined' || c === null) { throw new Error("expected a stub counter object for nil registry"); } c.add(5); if (c.value() !== 0) { throw new Error("stub counter value should be 0, got: " + c.value()); } var g = globalThis.t3.Gauge("test_gauge"); g.set(3.14); if (g.value() !== 0) { throw new Error("stub gauge value should be 0, got: " + g.value()); } var h = globalThis.t3.Histogram("test_histogram"); h.record(1.0); `) if err != nil { t.Fatal(err) } } func TestFullBundleEndToEnd(t *testing.T) { registry := metrics.NewRegistry("test-host") logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelDebug})) // Minified bundle that uses globalThis.t3.Counter at module level, // mimicking the helloworld output structure bundle := []byte(` "use strict";var script=(()=>{var e=globalThis;function n(t){let r=e.t3;if(r)return r.Counter(t);return null}var o=n("http_requests");return {setup:function(){return {token:"123"}},user_init:function(t){return {email:"user1@example.com",token:t.token}},default:function(t){o.add(1)},teardown:function(t){}}})(); `) en, err := engine.NewEngine(bundle) if err != nil { t.Fatal(err) } inst, err := en.NewInstance(&engine.InstanceConfig{ Logger: logger, Metrics: registry, }) if err != nil { t.Fatal(err) } defaultFunc, ok := inst.GetFunc("default") if !ok { t.Fatal("default function not found") } data := inst.GetRuntime().NewObject() data.Set("userId", 1) data.Set("iteration", 0) _, err = defaultFunc.Call(data) if err != nil { t.Fatal(err) } snap := registry.Snapshot() if len(snap.CustomMetrics) == 0 { t.Fatal("custom metrics snapshot empty - bridge is broken for full bundle scenario") } t.Logf("full bundle end-to-end: %d custom metrics", len(snap.CustomMetrics)) for _, cm := range snap.CustomMetrics { t.Logf(" %s (%s) = %d", cm.Name, cm.Type, cm.Value.GetCounter()) } } func TestActualHelloworldBundleEndToEnd(t *testing.T) { registry := metrics.NewRegistry("test-host") logger := slog.New(slog.NewTextHandler(os.Stdout, &slog.HandlerOptions{Level: slog.LevelDebug})) bundle, err := os.ReadFile("../../helloworld/output/bundle.js") if err != nil { t.Fatal(err) } en, err := engine.NewEngine(bundle) if err != nil { t.Fatal(err) } inst, err := en.NewInstance(&engine.InstanceConfig{ Logger: logger, Metrics: registry, }) if err != nil { t.Fatal(err) } setupFunc, ok := inst.GetFunc("setup") if !ok { t.Fatal("setup function not found") } setupResult, err := setupFunc.Call(goja.Undefined()) if err != nil { t.Fatal(err) } setupData := setupResult.Export() t.Logf("setup returned: %v", setupData) initFunc, ok := inst.GetFunc("user_init") if !ok { t.Fatal("user_init function not found") } vm := inst.GetRuntime() initResult, err := initFunc.Call(vm.ToValue(setupData)) if err != nil { t.Fatal(err) } initObj := initResult.ToObject(vm) defaultFunc, ok := inst.GetFunc("default") if !ok { t.Fatal("default function not found") } // Run 3 iterations for i := 0; i < 3; i++ { data := vm.NewObject() data.Set("userId", 1) data.Set("iteration", int64(i)) data.Set("init", initObj) _, err = defaultFunc.Call(data) if err != nil { t.Fatal(err) } } snap := registry.Snapshot() if len(snap.CustomMetrics) == 0 { t.Fatal("custom metrics snapshot empty with actual helloworld bundle") } t.Logf("actual helloworld bundle: %d custom metrics", len(snap.CustomMetrics)) for _, cm := range snap.CustomMetrics { t.Logf(" %s (%s) = %d", cm.Name, cm.Type, cm.Value.GetCounter()) } }