mod_wui_test.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. package mod_wui
  2. import (
  3. "net/http"
  4. "net/url"
  5. "os"
  6. "strings"
  7. "testing"
  8. "time"
  9. "gitp78su.ipnodns.ru/svi/kern/v4/krn/kctx"
  10. "gitp78su.ipnodns.ru/svi/kern/v4/wui/wbutton"
  11. "gitp78su.ipnodns.ru/svi/kern/v4/wui/wlabel"
  12. "gitp78su.ipnodns.ru/svi/kern/v4/krn/kmonolit"
  13. "gitp78su.ipnodns.ru/svi/kern/v4/krn/kserv_http"
  14. . "gitp78su.ipnodns.ru/svi/kern/v4/lev0/ktypes"
  15. "gitp78su.ipnodns.ru/svi/kern/v4/mock/mock_env"
  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. ctx IKernelCtx
  25. serv IKernelServerHttp
  26. mod IKernelModule
  27. }
  28. func TestModKernelCtx(t *testing.T) {
  29. sf := &tester{
  30. t: t,
  31. me: mock_env.MakeEnv(),
  32. ctx: kctx.GetKernelCtx(),
  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() + pathStore
  40. _ = os.RemoveAll(pwd)
  41. }
  42. fnClear()
  43. defer fnClear()
  44. sf.ctx.Set("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 := wbutton.NewWuiButton("test_btn", sf.fnClick)
  62. fiberApp := sf.serv.Fiber()
  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 := fiberApp.Test(req)
  73. if err != nil {
  74. sf.t.Fatalf("clickBad3(): in make POST, err=%v", err)
  75. }
  76. if resp.StatusCode != 200 {
  77. sf.t.Fatalf("clickBad3(): status(%v)!=200", resp.StatusCode)
  78. }
  79. }
  80. // С POST-формой
  81. func (sf *tester) clickGood2() {
  82. sf.t.Log("clickGood2")
  83. btn := wbutton.NewWuiButton("test_btn", sf.fnClick)
  84. fiberApp := sf.serv.Fiber()
  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 := fiberApp.Test(req)
  101. if err != nil {
  102. sf.t.Fatalf("clickGood2(): in make POST, err=%v", err)
  103. }
  104. if resp.StatusCode != 200 {
  105. sf.t.Fatalf("clickGood2(): status(%v)!=200", resp.StatusCode)
  106. }
  107. }
  108. // Без POST-формы
  109. func (sf *tester) clickGood1() {
  110. sf.t.Log("clickGood1")
  111. btn := wbutton.NewWuiButton("test_btn", sf.fnClick)
  112. fiberApp := sf.serv.Fiber()
  113. req, err := http.NewRequest("POST", "/wui/click/"+btn.Id(), nil)
  114. if err != nil {
  115. sf.t.Fatalf("clickGood1(): in net request, err=%v", err)
  116. }
  117. resp, err := fiberApp.Test(req)
  118. if err != nil {
  119. sf.t.Fatalf("clickGood1(): in make POST, err=%v", err)
  120. }
  121. if resp.StatusCode != 200 {
  122. sf.t.Fatalf("clickGood1(): status(%v)!=200", resp.StatusCode)
  123. }
  124. }
  125. // Обратный вызов клика
  126. func (sf *tester) fnClick(dict map[string]string) string {
  127. sf.t.Log("fnClick")
  128. return "test_click"
  129. }
  130. // Неправильный тип объекта
  131. func (sf *tester) clickBad2() {
  132. sf.t.Log("clickBad2")
  133. lbl := wlabel.NewWuiLabel("test_lbl")
  134. fiberApp := sf.serv.Fiber()
  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 := fiberApp.Test(req)
  140. if err != nil {
  141. sf.t.Fatalf("clickBad2(): in make POST, err=%v", err)
  142. }
  143. if resp.StatusCode != 200 {
  144. sf.t.Fatalf("clickBad2(): status(%v)!=200", resp.StatusCode)
  145. }
  146. }
  147. // Нет такой кнопки
  148. func (sf *tester) clickBad1() {
  149. sf.t.Log("clickBad1")
  150. fiberApp := sf.serv.Fiber()
  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 := fiberApp.Test(req)
  156. if err != nil {
  157. sf.t.Fatalf("clickBad1(): in make POST, err=%v", err)
  158. }
  159. if resp.StatusCode != 200 {
  160. sf.t.Fatalf("clickBad1(): status(%v)!=200", resp.StatusCode)
  161. }
  162. }
  163. // Завершение работы
  164. func (sf *tester) done() {
  165. sf.t.Log("done")
  166. if log := sf.mod.Log(); log != sf.mod.(*ModuleWui).log {
  167. sf.t.Fatalf("done(): log is bad")
  168. }
  169. sf.ctx.Cancel()
  170. sf.ctx.Wg().Wait()
  171. if isWork := sf.mod.IsWork(); isWork {
  172. sf.t.Fatalf("done(): isWork==true")
  173. }
  174. }
  175. // Создание нового модуля HTTP-сервера
  176. func (sf *tester) new() {
  177. sf.t.Log("new")
  178. // sf.newBad1()
  179. sf.newGood1()
  180. }
  181. func (sf *tester) newGood1() {
  182. sf.t.Log("newGood1")
  183. _ = mock_env.MakeEnv()
  184. _ = os.Unsetenv("LOCAL_HTTP_URL")
  185. os.Setenv("LOCAL_HTTP_URL", "http://localhost:18330/")
  186. sf.mod = GetModuleWui().Hassert("newGood1()")
  187. kCtx := kctx.GetKernelCtx()
  188. kCtx.Set("isLocal", true, "type msg bus")
  189. _ = kmonolit.GetMonolit("test_monolit")
  190. sf.serv = kserv_http.GetKernelServHttp().Hassert("newGood1()")
  191. _ = GetModuleWui()
  192. if sf.mod == nil {
  193. sf.t.Fatalf("newGood1(): mod==nil")
  194. }
  195. go sf.mod.Run()
  196. for {
  197. time.Sleep(time.Millisecond * 1)
  198. if sf.mod.IsWork() {
  199. break
  200. }
  201. }
  202. go sf.serv.Run()
  203. }
  204. // нет ничего для создания модуля
  205. // func (sf *tester) newBad1() {
  206. // sf.t.Log("newBad1")
  207. // defer func() {
  208. // if _panic := recover(); _panic == nil {
  209. // sf.t.Fatalf("newBad1(): panic==nil")
  210. // }
  211. // }()
  212. // _ = GetModuleWui()
  213. // }