main_test.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package example_test
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io"
  6. "log"
  7. "mime"
  8. "mime/multipart"
  9. "net/http"
  10. "strings"
  11. "testing"
  12. "git.ali33.ru/fcg-xvii/go-tools/json"
  13. )
  14. func SendRequest(uri string, data json.Map, files map[string]io.Reader, auth string) (rData json.Map, rFiles map[string]io.ReadCloser) {
  15. var (
  16. buf io.Reader
  17. contentType string
  18. )
  19. if files == nil {
  20. // json
  21. contentType = "application/json"
  22. buf = bytes.NewBuffer(data.JSON())
  23. } else {
  24. // multipart form
  25. rBuf := bytes.NewBuffer(nil)
  26. form := multipart.NewWriter(rBuf)
  27. // setup content type
  28. contentType = form.FormDataContentType()
  29. // json (data)
  30. field, _ := form.CreateFormField("data")
  31. field.Write(data.JSON())
  32. // files
  33. for name, file := range files {
  34. part, _ := form.CreateFormFile(name, name)
  35. io.Copy(part, file)
  36. }
  37. form.Close()
  38. buf = rBuf
  39. }
  40. req, _ := http.NewRequest(
  41. "POST",
  42. fmt.Sprintf("http://localhost:8080%s", uri),
  43. buf,
  44. )
  45. req.Header.Set("Content-Type", contentType)
  46. if len(auth) > 0 {
  47. req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", auth))
  48. }
  49. client := &http.Client{}
  50. resp, err := client.Do(req)
  51. if err != nil {
  52. log.Fatal(err)
  53. }
  54. if resp.StatusCode != http.StatusOK {
  55. bData, _ := io.ReadAll(resp.Body)
  56. log.Println(string(bData))
  57. json.Unmarshal(bData, &rData)
  58. log.Fatal("bad status code: ", resp.StatusCode, rData.JSONPrettyString())
  59. }
  60. rContentType := resp.Header.Get("Content-Type")
  61. log.Println("---------------------", rContentType)
  62. if rContentType == "application/json" {
  63. bData, _ := io.ReadAll(resp.Body)
  64. log.Println(string(bData))
  65. json.Unmarshal(bData, &rData)
  66. } else if strings.Contains(rContentType, "multipart/form-data") {
  67. rFiles = make(map[string]io.ReadCloser)
  68. _, params, _ := mime.ParseMediaType(resp.Header.Get("Content-Type"))
  69. mReader := multipart.NewReader(resp.Body, params["boundary"])
  70. for {
  71. part, err := mReader.NextPart()
  72. if err == io.EOF {
  73. break // Закончить на конце потока
  74. }
  75. if err != nil {
  76. log.Fatal(err)
  77. }
  78. if part.FormName() == "data" {
  79. bData, _ := io.ReadAll(part)
  80. json.Unmarshal(bData, &rData)
  81. } else {
  82. if fName := part.FileName(); len(fName) > 0 {
  83. rFiles[fName] = part
  84. }
  85. }
  86. }
  87. }
  88. resp.Body.Close()
  89. return
  90. }
  91. func TestExample(t *testing.T) {
  92. var data json.Map
  93. var files map[string]io.ReadCloser
  94. ExampleNew()
  95. t.Log("--- register user ---")
  96. data, _ = SendRequest(
  97. "/user/register",
  98. json.Map{
  99. "name": "First User",
  100. "password": "my-strong-pass",
  101. "group_id": 1,
  102. },
  103. nil,
  104. "",
  105. )
  106. t.Log(data)
  107. t.Log("------------------------------------------")
  108. token := data.String("token", "")
  109. t.Log("token", token)
  110. t.Log("--- set avatar ---")
  111. sFiles := map[string]io.Reader{
  112. "avatar.jpg": bytes.NewBuffer([]byte{1, 2, 3, 4, 5}),
  113. }
  114. data, files = SendRequest(
  115. "/user/set_avatar",
  116. json.Map{},
  117. sFiles,
  118. token,
  119. )
  120. data.LogPretty()
  121. t.Log("------------------------------------------")
  122. t.Log("--- user info ---")
  123. data, files = SendRequest(
  124. "/user/info",
  125. json.Map{
  126. "fields": []string{
  127. "id", "name", "group", "avatar",
  128. },
  129. },
  130. nil,
  131. token,
  132. )
  133. data.LogPretty()
  134. log.Println(files)
  135. t.Log("------------------------------------------")
  136. //ch := make(chan struct{})
  137. //<-ch
  138. }