mod_wui_test.go 6.0 KB

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