mod_wui_test.go 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  1. package mod_wui
  2. import (
  3. "net/http"
  4. "net/url"
  5. "os"
  6. "strings"
  7. "testing"
  8. "time"
  9. "github.com/gofiber/fiber/v3"
  10. mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
  11. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs"
  12. "gitp78su.ipnodns.ru/svi/kern/v4/lev1/mock_env"
  13. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kctx"
  14. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kmonolit"
  15. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/kspec"
  16. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_button"
  17. "gitp78su.ipnodns.ru/svi/kern/v4/lev2/wui/wui_label"
  18. )
  19. const (
  20. baseUrl = "http://localhost:18380/"
  21. pathStore = "/store/store_mod_wui"
  22. )
  23. type tester struct {
  24. t *testing.T
  25. me *mock_env.MockEnv
  26. kCtx kspec.IKernelCtx
  27. fiberApp *fiber.App
  28. mod *ModuleWui
  29. }
  30. func TestModKernelCtx(t *testing.T) {
  31. sf := &tester{
  32. t: t,
  33. me: mock_env.MakeEnv(),
  34. kCtx: kctx.GetKernelCtx(),
  35. }
  36. _ = os.Unsetenv("LOCAL_STORE_PATH")
  37. _ = os.Setenv("LOCAL_STORE_PATH", pathStore)
  38. _ = os.Unsetenv("LOCAL_HTTP_URL")
  39. _ = os.Setenv("LOCAL_HTTP_URL", baseUrl)
  40. fnClear := func() {
  41. pwd := sf.me.Pwd().String() + pathStore
  42. _ = os.RemoveAll(pwd)
  43. }
  44. fnClear()
  45. defer fnClear()
  46. sf.kCtx.Set(defs.Txt("monolitName"),
  47. "test_monolit",
  48. defs.Txt("test"))
  49. sf.new()
  50. sf.click()
  51. sf.done()
  52. }
  53. // Кто-то кликнул в сети на кнопку.
  54. func (sf *tester) click() {
  55. sf.t.Log("click")
  56. sf.clickBad1()
  57. sf.clickBad2()
  58. sf.clickGood1()
  59. sf.clickGood2()
  60. sf.clickBad3()
  61. }
  62. // С кривой POST-формой.
  63. func (sf *tester) clickBad3() {
  64. sf.t.Log("clickBad3")
  65. btn := wui_button.NewWuiButton(defs.Txt("test_btn"), sf.fnClick)
  66. // Данные формы
  67. reader := strings.NewReader("tra-ta-ta")
  68. req, err := http.NewRequest(http.MethodPost, "/wui/click/"+btn.Id().String(), reader)
  69. if err != nil {
  70. sf.t.Fatalf("clickBad3(): in net request, err=%v", err)
  71. }
  72. req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
  73. req.Header.Add("Token-1", "123;original-1")
  74. req.Header.Add("Token-2", "")
  75. resp, err := sf.fiberApp.Test(req)
  76. if err != nil {
  77. sf.t.Fatalf("clickBad3(): in make POST, err=%v", err)
  78. }
  79. defer func() {
  80. _ = resp.Body.Close()
  81. }()
  82. if resp.StatusCode != http.StatusOK {
  83. sf.t.Fatalf("clickBad3(): status(%v)!=200", resp.StatusCode)
  84. }
  85. }
  86. // С POST-формой.
  87. func (sf *tester) clickGood2() {
  88. sf.t.Log("clickGood2")
  89. btn := wui_button.NewWuiButton(defs.Txt("test_btn"), sf.fnClick)
  90. // Данные формы
  91. formData := url.Values{
  92. "username": {"john_doe"},
  93. "email": {"john.doe@example.com"},
  94. "password": {"s3cr3t", "valid"},
  95. }
  96. reader := strings.NewReader(formData.Encode())
  97. req, err := http.NewRequest(http.MethodPost, "/wui/click/"+btn.Id().String(), reader)
  98. if err != nil {
  99. sf.t.Fatalf("clickGood2(): in net request, err=%v", err)
  100. }
  101. req.Header.Add("Content-Type", "application/x-www-form-urlencoded")
  102. req.Header.Add("Token-1", "123;original-1")
  103. req.Header.Add("Token-2", "")
  104. req.Header.Clone().Add("Token-1", "555;original-2")
  105. resp, err := sf.fiberApp.Test(req)
  106. if err != nil {
  107. sf.t.Fatalf("clickGood2(): in make POST, err=%v", err)
  108. }
  109. defer func() {
  110. _ = resp.Body.Close()
  111. }()
  112. if resp.StatusCode != http.StatusOK {
  113. sf.t.Fatalf("clickGood2(): status(%v)!=200", resp.StatusCode)
  114. }
  115. }
  116. // Без POST-формы.
  117. func (sf *tester) clickGood1() {
  118. sf.t.Log("clickGood1")
  119. btn := wui_button.NewWuiButton(defs.Txt("test_btn"), sf.fnClick)
  120. req, err := http.NewRequest(http.MethodPost, "/wui/click/"+btn.Id().String(), nil)
  121. if err != nil {
  122. sf.t.Fatalf("clickGood1(): in net request, err=%v", err)
  123. }
  124. resp, err := sf.fiberApp.Test(req)
  125. if err != nil {
  126. sf.t.Fatalf("clickGood1(): in make POST, err=%v", err)
  127. }
  128. defer func() {
  129. _ = resp.Body.Close()
  130. }()
  131. if resp.StatusCode != http.StatusOK {
  132. sf.t.Fatalf("clickGood1(): status(%v)!=200", resp.StatusCode)
  133. }
  134. }
  135. // Обратный вызов клика.
  136. func (sf *tester) fnClick(dict map[string]string) mL0.IResult[defs.ITxtFix] {
  137. sf.t.Log("fnClick")
  138. return mL0.NewOk(defs.TxtFix("test_click"))
  139. }
  140. // Неправильный тип объекта.
  141. func (sf *tester) clickBad2() {
  142. sf.t.Log("clickBad2")
  143. lbl := wui_label.NewWuiLabel(defs.Txt("test_lbl")).
  144. Hassert(defs.Txt("clickBad2()"))
  145. req, err := http.NewRequest(http.MethodPost, "/wui/click/"+lbl.Id().String(), nil)
  146. if err != nil {
  147. sf.t.Fatalf("clickBad2(): in net request, err=%v", err)
  148. }
  149. resp, err := sf.fiberApp.Test(req)
  150. if err != nil {
  151. sf.t.Fatalf("clickBad2(): in make POST, err=%v", err)
  152. }
  153. defer func() {
  154. _ = resp.Body.Close()
  155. }()
  156. if resp.StatusCode != http.StatusOK {
  157. sf.t.Fatalf("clickBad2(): status(%v)!=200", resp.StatusCode)
  158. }
  159. }
  160. // Нет такой кнопки.
  161. func (sf *tester) clickBad1() {
  162. sf.t.Log("clickBad1")
  163. req, err := http.NewRequest(http.MethodPost, "/wui/click/ert", nil)
  164. if err != nil {
  165. sf.t.Fatalf("clickBad1(): in net request, err=%v", err)
  166. }
  167. resp, err := sf.fiberApp.Test(req)
  168. if err != nil {
  169. sf.t.Fatalf("clickBad1(): in make POST, err=%v", err)
  170. }
  171. defer func() {
  172. _ = resp.Body.Close()
  173. }()
  174. if resp.StatusCode != http.StatusOK {
  175. sf.t.Fatalf("clickBad1(): status(%v)!=200", resp.StatusCode)
  176. }
  177. }
  178. // Завершение работы.
  179. func (sf *tester) done() {
  180. sf.t.Log("done")
  181. if log := sf.mod.Log(); log != sf.mod.log {
  182. sf.t.Fatalf("done(): log is bad")
  183. }
  184. sf.kCtx.Cancel()
  185. sf.kCtx.Wg().Wait()
  186. if isWork := sf.mod.IsWork(); isWork.IsOk() {
  187. sf.t.Fatalf("done(): isWork==true")
  188. }
  189. }
  190. // Создание нового модуля HTTP-сервера.
  191. func (sf *tester) new() {
  192. sf.t.Log("new")
  193. // sf.newBad1()
  194. sf.newGood1()
  195. }
  196. func (sf *tester) newGood1() {
  197. sf.t.Log("newGood1")
  198. _ = mock_env.MakeEnv()
  199. _ = os.Unsetenv("LOCAL_HTTP_URL")
  200. _ = os.Setenv("LOCAL_HTTP_URL", "http://localhost:18334/")
  201. sf.mod = GetModuleWui()
  202. kCtx := kctx.GetKernelCtx()
  203. kCtx.Set(defs.Txt("isLocal"), true, "type msg bus")
  204. _ = kmonolit.GetMonolit("test_monolit")
  205. _ = GetModuleWui()
  206. sf.mod.Run()
  207. for {
  208. time.Sleep(time.Millisecond * 1)
  209. if sf.mod.IsWork().IsOk() {
  210. break
  211. }
  212. }
  213. sf.fiberApp = sf.mod.kServHttp.Fiber()
  214. }
  215. // нет ничего для создания модуля
  216. // func (sf *tester) newBad1() {
  217. // sf.t.Log("newBad1")
  218. // defer func() {
  219. // if _panic := recover(); _panic == nil {
  220. // sf.t.Fatalf("newBad1(): panic==nil")
  221. // }
  222. // }()
  223. // _ = GetModuleWui()
  224. // }