mod_wui_test.go 6.1 KB

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