package mod_wui import ( "net/http" "net/url" "os" "strings" "testing" "time" "github.com/gofiber/fiber/v3" "gitp78su.ipnodns.ru/svi/kern/v4/d0" "gitp78su.ipnodns.ru/svi/kern/v4/d1/mock_env" "gitp78su.ipnodns.ru/svi/kern/v4/d2" "gitp78su.ipnodns.ru/svi/kern/v4/d2/kmonolit" "gitp78su.ipnodns.ru/svi/kern/v4/d2/wui/wui_button" "gitp78su.ipnodns.ru/svi/kern/v4/d2/wui/wui_label" ) const ( baseUrl = "http://localhost:18380/" pathStore = "/store/store_mod_wui" ) type tester struct { t *testing.T me *mock_env.MockEnv kCtx *d2.KernCtx fiberApp *fiber.App mod *ModuleWui owner *d0.LOwner } func TestModKernelCtx(t *testing.T) { owner := d0.LetOwner(1, "isol_kern_ctx") sf := &tester{ t: t, owner: owner, me: mock_env.MakeEnv(owner), kCtx: d2.GetKernCtx(), } _ = os.Unsetenv("LOCAL_STORE_PATH") _ = os.Setenv("LOCAL_STORE_PATH", pathStore) _ = os.Unsetenv("LOCAL_HTTP_URL") _ = os.Setenv("LOCAL_HTTP_URL", baseUrl) fnClear := func() { pwd := sf.me.Pwd().String() + pathStore _ = os.RemoveAll(pwd) } fnClear() defer fnClear() sf.kCtx.Set(d0.LetTxt("monolitName"), "test_monolit", "test") sf.new() sf.click() sf.done() } // Кто-то кликнул в сети на кнопку. func (sf *tester) click() { sf.t.Log("click") sf.clickBad1() sf.clickBad2() sf.clickGood1() sf.clickGood2() sf.clickBad3() } // С кривой POST-формой. func (sf *tester) clickBad3() { sf.t.Log("clickBad3") btn := wui_button.NewWuiButton(d0.LetTxt("test_btn"), sf.fnClick) // Данные формы reader := strings.NewReader("tra-ta-ta") req, err := http.NewRequest(http.MethodPost, "/wui/click/"+btn.Id().String(), reader) if err != nil { sf.t.Fatalf("clickBad3(): in net request, err=%v", err) } req.Header.Add("Content-Type", "application/x-www-form-urlencoded") req.Header.Add("Token-1", "123;original-1") req.Header.Add("Token-2", "") resp, err := sf.fiberApp.Test(req) if err != nil { sf.t.Fatalf("clickBad3(): in make POST, err=%v", err) } defer func() { _ = resp.Body.Close() }() if resp.StatusCode != http.StatusOK { sf.t.Fatalf("clickBad3(): status(%v)!=200", resp.StatusCode) } } // С POST-формой. func (sf *tester) clickGood2() { sf.t.Log("clickGood2") btn := wui_button.NewWuiButton(d0.LetTxt("test_btn"), sf.fnClick) // Данные формы formData := url.Values{ "username": {"john_doe"}, "email": {"john.doe@example.com"}, "password": {"s3cr3t", "valid"}, } reader := strings.NewReader(formData.Encode()) req, err := http.NewRequest(http.MethodPost, "/wui/click/"+btn.Id().String(), reader) if err != nil { sf.t.Fatalf("clickGood2(): in net request, err=%v", err) } req.Header.Add("Content-Type", "application/x-www-form-urlencoded") req.Header.Add("Token-1", "123;original-1") req.Header.Add("Token-2", "") req.Header.Clone().Add("Token-1", "555;original-2") resp, err := sf.fiberApp.Test(req) if err != nil { sf.t.Fatalf("clickGood2(): in make POST, err=%v", err) } defer func() { _ = resp.Body.Close() }() if resp.StatusCode != http.StatusOK { sf.t.Fatalf("clickGood2(): status(%v)!=200", resp.StatusCode) } } // Без POST-формы. func (sf *tester) clickGood1() { sf.t.Log("clickGood1") btn := wui_button.NewWuiButton(d0.LetTxt("test_btn"), sf.fnClick) req, err := http.NewRequest(http.MethodPost, "/wui/click/"+btn.Id().String(), nil) if err != nil { sf.t.Fatalf("clickGood1(): in net request, err=%v", err) } resp, err := sf.fiberApp.Test(req) if err != nil { sf.t.Fatalf("clickGood1(): in make POST, err=%v", err) } defer func() { _ = resp.Body.Close() }() if resp.StatusCode != http.StatusOK { sf.t.Fatalf("clickGood1(): status(%v)!=200", resp.StatusCode) } } // Обратный вызов клика. func (sf *tester) fnClick(dict map[d0.Txt]d0.Txt) *d0.Result[*d0.LTxt] { sf.t.Log("fnClick") return d0.ResOk(d0.LetTxt("test_click")) } // Неправильный тип объекта. func (sf *tester) clickBad2() { sf.t.Log("clickBad2") lbl := wui_label.NewWuiLabel(d0.LetTxt("test_lbl")). Hassert("clickBad2()") req, err := http.NewRequest(http.MethodPost, "/wui/click/"+lbl.Id().String(), nil) if err != nil { sf.t.Fatalf("clickBad2(): in net request, err=%v", err) } resp, err := sf.fiberApp.Test(req) if err != nil { sf.t.Fatalf("clickBad2(): in make POST, err=%v", err) } defer func() { _ = resp.Body.Close() }() if resp.StatusCode != http.StatusOK { sf.t.Fatalf("clickBad2(): status(%v)!=200", resp.StatusCode) } } // Нет такой кнопки. func (sf *tester) clickBad1() { sf.t.Log("clickBad1") req, err := http.NewRequest(http.MethodPost, "/wui/click/ert", nil) if err != nil { sf.t.Fatalf("clickBad1(): in net request, err=%v", err) } resp, err := sf.fiberApp.Test(req) if err != nil { sf.t.Fatalf("clickBad1(): in make POST, err=%v", err) } defer func() { _ = resp.Body.Close() }() if resp.StatusCode != http.StatusOK { sf.t.Fatalf("clickBad1(): status(%v)!=200", resp.StatusCode) } } // Завершение работы. func (sf *tester) done() { sf.t.Log("done") if log := sf.mod.Log(); log != sf.mod.log { sf.t.Fatalf("done(): log is bad") } sf.kCtx.Cancel() sf.kCtx.Wg().Wait() if sf.mod.IsWork() { sf.t.Fatalf("done(): isWork==true") } } // Создание нового модуля HTTP-сервера. func (sf *tester) new() { sf.t.Log("new") // sf.newBad1() sf.newGood1() } func (sf *tester) newGood1() { sf.t.Log("newGood1") _ = mock_env.MakeEnv(sf.owner) _ = os.Unsetenv("LOCAL_HTTP_URL") _ = os.Setenv("LOCAL_HTTP_URL", "http://localhost:18334/") sf.mod = GetModuleWui() kCtx := d2.GetKernCtx() kCtx.Set(d0.LetTxt("isLocal"), true, "type msg bus") _ = kmonolit.LetModMonolit("test_monolit") _ = GetModuleWui() sf.mod.Run() for { time.Sleep(time.Millisecond * 1) if sf.mod.IsWork() { break } } sf.fiberApp = sf.mod.kServHttp.Fiber() } // нет ничего для создания модуля // func (sf *tester) newBad1() { // sf.t.Log("newBad1") // defer func() { // if _panic := recover(); _panic == nil { // sf.t.Fatalf("newBad1(): panic==nil") // } // }() // _ = GetModuleWui() // }