mod_wui_test.go 6.1 KB

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