z_test.goo 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335
  1. package test_test
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io"
  6. "io/ioutil"
  7. "log"
  8. "mime/multipart"
  9. "net/http"
  10. "net/textproto"
  11. "testing"
  12. "time"
  13. "git.ali33.ru/fcg-xvii/go-tools/json"
  14. )
  15. var (
  16. AddrCorrect = "localhost:7000"
  17. AddrIncorrect = "1.1.1.1:7000"
  18. Secret = []byte("itsMyWay")
  19. )
  20. func URL(path string) string {
  21. return fmt.Sprintf("http://%s%s", AddrCorrect, path)
  22. }
  23. func sendRequest(uri string, data json.Map, files map[string]io.ReadCloser, auth string) ([]byte, error) {
  24. log.Println(uri)
  25. body := &bytes.Buffer{}
  26. var contentType string
  27. if len(files) == 0 {
  28. // Если файлов нет, используем application/json
  29. contentType = "application/json"
  30. jsonData, err := json.Marshal(data)
  31. if err != nil {
  32. return nil, err
  33. }
  34. body.Write(jsonData)
  35. } else {
  36. // Если есть файлы, используем multipart/form-data
  37. writer := multipart.NewWriter(body)
  38. // Прикрепление файлов
  39. for fieldName, file := range files {
  40. part, err := writer.CreateFormFile(fieldName, fieldName)
  41. if err != nil {
  42. return nil, err
  43. }
  44. _, err = io.Copy(part, file)
  45. if err != nil {
  46. return nil, err
  47. }
  48. file.Close()
  49. }
  50. // Прикрепление JSON как части с Content-Type application/json
  51. jsonHeader := make(textproto.MIMEHeader)
  52. jsonHeader.Set("Content-Disposition", `form-data; name="data"`)
  53. jsonHeader.Set("Content-Type", "application/json")
  54. jsonPart, err := writer.CreatePart(jsonHeader)
  55. if err != nil {
  56. return nil, err
  57. }
  58. jsonPart.Write(data.JSON())
  59. err = writer.Close()
  60. if err != nil {
  61. return nil, err
  62. }
  63. contentType = writer.FormDataContentType()
  64. }
  65. req, err := http.NewRequest("POST", uri, body)
  66. if err != nil {
  67. return nil, err
  68. }
  69. if len(auth) > 0 {
  70. req.Header.Add("Authorization", "Bearer "+auth)
  71. }
  72. req.Header.Add("Content-Type", contentType)
  73. client := &http.Client{}
  74. resp, err := client.Do(req)
  75. if err != nil {
  76. return nil, err
  77. }
  78. defer resp.Body.Close()
  79. rBody, _ := ioutil.ReadAll(resp.Body)
  80. if resp.StatusCode != http.StatusOK {
  81. err = fmt.Errorf("failed sending request: %s", resp.Status)
  82. }
  83. return rBody, err
  84. }
  85. func initFile(data []byte) io.ReadCloser {
  86. buf := bytes.NewBuffer(data)
  87. return io.NopCloser(buf)
  88. }
  89. //////////////////////////////////////////////////////////////////
  90. type tHello struct {
  91. Name string `rest:"required"`
  92. }
  93. func (s *tHello) Validate(r *Request) *Response {
  94. log.Println("validator...")
  95. return nil
  96. }
  97. func (s *tHello) Execute(r *Request) *Response {
  98. log.Println("execute...")
  99. resp := NewResponse()
  100. resp.KeySet("response", fmt.Sprintf("Hello, %v", s.Name))
  101. return resp
  102. }
  103. type tApp struct{}
  104. func (s *tApp) Executer(r *Request) (IExecuter, bool) {
  105. switch r.RPath() {
  106. case "/hello":
  107. return &tHello{}, true
  108. }
  109. return nil, false
  110. }
  111. //////////////////////////////////////////////////////////////////
  112. func TestListen(t *testing.T) {
  113. rest := NewRest(AddrCorrect, Secret, &tApp{})
  114. err := rest.Listen(time.Second)
  115. if err != nil {
  116. t.Log("open", err, rest.opened.Load())
  117. return
  118. }
  119. t.Log("close", rest.Close(), rest.opened.Load())
  120. }
  121. func TestRequest(t *testing.T) {
  122. rest := NewRest(AddrCorrect, Secret, &tApp{})
  123. err := rest.Listen(time.Second)
  124. if err != nil {
  125. t.Log("open", err, rest.opened.Load())
  126. return
  127. }
  128. defer rest.Close()
  129. body, err := sendRequest(
  130. URL("/hello"),
  131. json.Map{
  132. "name": "Anonimous",
  133. },
  134. nil,
  135. "",
  136. )
  137. t.Log(string(body), err)
  138. }
  139. /*
  140. func TestToken(t *testing.T) {
  141. commands := NewCommandStore()
  142. auth := &AuthDebug{}
  143. commands.AddCommand("/register", auth)
  144. commands.AddCommand("/login", auth)
  145. rest := NewRest(AddrCorrect, Secret, commands)
  146. err := rest.Listen(time.Second)
  147. if err != nil {
  148. t.Log("open", err, rest.opened.Load())
  149. return
  150. }
  151. defer rest.Close()
  152. // register
  153. body, err := sendRequest(
  154. URL("/register"),
  155. json.Map{
  156. "login": "test",
  157. },
  158. nil,
  159. "",
  160. )
  161. if err != nil {
  162. t.Fatal(err, string(body))
  163. }
  164. var jm json.Map
  165. json.Unmarshal(body, &jm)
  166. token := jm.StringVal("token", "")
  167. t.Log("token", token)
  168. // auth
  169. body, err = sendRequest(
  170. URL("/login"),
  171. json.Map{},
  172. nil,
  173. token,
  174. )
  175. if err != nil {
  176. t.Fatal(err, string(body))
  177. }
  178. }
  179. func newFielderTest(id, parentID int64, name string, price float64, child *tFielderTest) *tFielderTest {
  180. f := &tFielderTest{
  181. ID: id,
  182. Password: "top-secret",
  183. ParentID: parentID,
  184. Name: name,
  185. Price: price,
  186. }
  187. f.Fielder = NewFielder(f)
  188. return f
  189. }
  190. type tFielderTest struct {
  191. *Fielder
  192. ID int64
  193. Password string
  194. ParentID int64
  195. Name string
  196. Price float64
  197. Child *tFielderTest
  198. }
  199. func (s *tFielderTest) FieldCheck(name string) bool {
  200. if name == "password" {
  201. return false
  202. }
  203. return true
  204. }
  205. func TestFielder(t *testing.T) {
  206. f := newFielderTest(1, 10, "VTBR", 100, nil)
  207. f1 := newFielderTest(10, 100, "SBER", 1000, nil)
  208. f.Child = f1
  209. fm, err := f.Fields(
  210. "id",
  211. "name",
  212. "parent_id",
  213. "price",
  214. "password",
  215. )
  216. if err != nil {
  217. t.Fatal(err)
  218. }
  219. fm.LogPretty()
  220. f.ID = 11
  221. fm, err = f.Fields(
  222. "id",
  223. "name",
  224. "parent_id",
  225. "price",
  226. map[string]any{
  227. "name": "child",
  228. "fields": []any{
  229. "id",
  230. "name",
  231. "parent_id",
  232. map[string]any{
  233. "name": "child",
  234. "fields": []any{
  235. "id",
  236. },
  237. },
  238. },
  239. },
  240. )
  241. if err != nil {
  242. t.Fatal(err)
  243. }
  244. fm.LogPretty()
  245. }
  246. func TestCase(t *testing.T) {
  247. // Тестирование функций
  248. testCamel := "ParentID"
  249. testSnake := "parent_id"
  250. snake := CamelToSnake(testCamel)
  251. camel := SnakeToCamel(testSnake)
  252. println(testCamel, "->", snake)
  253. println(testSnake, "->", camel)
  254. }
  255. // Serialize /////////////////////////////////////////////////
  256. type tSChild struct {
  257. ID int64 `rest:"required"`
  258. ParentID int64
  259. Name string
  260. }
  261. type tSerializeCommand struct {
  262. ID int64 `rest:"required;"`
  263. ParentID int64
  264. Name string
  265. Child *tSChild `rest:"required"`
  266. TestFileTxt io.ReadCloser `rest:"required;file"`
  267. }
  268. func TestSerialize(t *testing.T) {
  269. jm := json.Map{
  270. "id": 10,
  271. "parent_id": 1,
  272. "name": "Cooler",
  273. "child": map[string]any{
  274. "id": 101,
  275. "parent_id": 10,
  276. "name": "Childer...",
  277. },
  278. }
  279. files := map[string]io.ReadCloser{
  280. "test_file.txt": io.NopCloser(bytes.NewBuffer([]byte("Test file contents"))),
  281. }
  282. r := &tSerializeCommand{}
  283. if err := serializeRequest(r, jm, files, ""); err != nil {
  284. t.Fatal(err)
  285. }
  286. t.Log(r)
  287. }
  288. */