|
@@ -1,335 +0,0 @@
|
|
|
-package test_test
|
|
|
-
|
|
|
-import (
|
|
|
- "bytes"
|
|
|
- "fmt"
|
|
|
- "io"
|
|
|
- "io/ioutil"
|
|
|
- "log"
|
|
|
- "mime/multipart"
|
|
|
- "net/http"
|
|
|
- "net/textproto"
|
|
|
- "testing"
|
|
|
- "time"
|
|
|
-
|
|
|
- "git.ali33.ru/fcg-xvii/go-tools/json"
|
|
|
-)
|
|
|
-
|
|
|
-var (
|
|
|
- AddrCorrect = "localhost:7000"
|
|
|
- AddrIncorrect = "1.1.1.1:7000"
|
|
|
- Secret = []byte("itsMyWay")
|
|
|
-)
|
|
|
-
|
|
|
-func URL(path string) string {
|
|
|
- return fmt.Sprintf("http://%s%s", AddrCorrect, path)
|
|
|
-}
|
|
|
-
|
|
|
-func sendRequest(uri string, data json.Map, files map[string]io.ReadCloser, auth string) ([]byte, error) {
|
|
|
- log.Println(uri)
|
|
|
- body := &bytes.Buffer{}
|
|
|
- var contentType string
|
|
|
-
|
|
|
- if len(files) == 0 {
|
|
|
- // Если файлов нет, используем application/json
|
|
|
- contentType = "application/json"
|
|
|
- jsonData, err := json.Marshal(data)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- body.Write(jsonData)
|
|
|
- } else {
|
|
|
- // Если есть файлы, используем multipart/form-data
|
|
|
- writer := multipart.NewWriter(body)
|
|
|
-
|
|
|
- // Прикрепление файлов
|
|
|
- for fieldName, file := range files {
|
|
|
- part, err := writer.CreateFormFile(fieldName, fieldName)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- _, err = io.Copy(part, file)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- file.Close()
|
|
|
- }
|
|
|
-
|
|
|
- // Прикрепление JSON как части с Content-Type application/json
|
|
|
- jsonHeader := make(textproto.MIMEHeader)
|
|
|
- jsonHeader.Set("Content-Disposition", `form-data; name="data"`)
|
|
|
- jsonHeader.Set("Content-Type", "application/json")
|
|
|
- jsonPart, err := writer.CreatePart(jsonHeader)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- jsonPart.Write(data.JSON())
|
|
|
-
|
|
|
- err = writer.Close()
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
-
|
|
|
- contentType = writer.FormDataContentType()
|
|
|
- }
|
|
|
-
|
|
|
- req, err := http.NewRequest("POST", uri, body)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
-
|
|
|
- if len(auth) > 0 {
|
|
|
- req.Header.Add("Authorization", "Bearer "+auth)
|
|
|
- }
|
|
|
-
|
|
|
- req.Header.Add("Content-Type", contentType)
|
|
|
-
|
|
|
- client := &http.Client{}
|
|
|
- resp, err := client.Do(req)
|
|
|
- if err != nil {
|
|
|
- return nil, err
|
|
|
- }
|
|
|
- defer resp.Body.Close()
|
|
|
-
|
|
|
- rBody, _ := ioutil.ReadAll(resp.Body)
|
|
|
-
|
|
|
- if resp.StatusCode != http.StatusOK {
|
|
|
- err = fmt.Errorf("failed sending request: %s", resp.Status)
|
|
|
- }
|
|
|
-
|
|
|
- return rBody, err
|
|
|
-}
|
|
|
-
|
|
|
-func initFile(data []byte) io.ReadCloser {
|
|
|
- buf := bytes.NewBuffer(data)
|
|
|
- return io.NopCloser(buf)
|
|
|
-}
|
|
|
-
|
|
|
-//////////////////////////////////////////////////////////////////
|
|
|
-
|
|
|
-type tHello struct {
|
|
|
- Name string `rest:"required"`
|
|
|
-}
|
|
|
-
|
|
|
-func (s *tHello) Validate(r *Request) *Response {
|
|
|
- log.Println("validator...")
|
|
|
- return nil
|
|
|
-}
|
|
|
-
|
|
|
-func (s *tHello) Execute(r *Request) *Response {
|
|
|
- log.Println("execute...")
|
|
|
- resp := NewResponse()
|
|
|
- resp.KeySet("response", fmt.Sprintf("Hello, %v", s.Name))
|
|
|
- return resp
|
|
|
-}
|
|
|
-
|
|
|
-type tApp struct{}
|
|
|
-
|
|
|
-func (s *tApp) Executer(r *Request) (IExecuter, bool) {
|
|
|
- switch r.RPath() {
|
|
|
- case "/hello":
|
|
|
- return &tHello{}, true
|
|
|
- }
|
|
|
- return nil, false
|
|
|
-}
|
|
|
-
|
|
|
-//////////////////////////////////////////////////////////////////
|
|
|
-
|
|
|
-func TestListen(t *testing.T) {
|
|
|
- rest := NewRest(AddrCorrect, Secret, &tApp{})
|
|
|
- err := rest.Listen(time.Second)
|
|
|
- if err != nil {
|
|
|
- t.Log("open", err, rest.opened.Load())
|
|
|
- return
|
|
|
- }
|
|
|
- t.Log("close", rest.Close(), rest.opened.Load())
|
|
|
-}
|
|
|
-
|
|
|
-func TestRequest(t *testing.T) {
|
|
|
- rest := NewRest(AddrCorrect, Secret, &tApp{})
|
|
|
- err := rest.Listen(time.Second)
|
|
|
- if err != nil {
|
|
|
- t.Log("open", err, rest.opened.Load())
|
|
|
- return
|
|
|
- }
|
|
|
- defer rest.Close()
|
|
|
- body, err := sendRequest(
|
|
|
- URL("/hello"),
|
|
|
- json.Map{
|
|
|
- "name": "Anonimous",
|
|
|
- },
|
|
|
- nil,
|
|
|
- "",
|
|
|
- )
|
|
|
- t.Log(string(body), err)
|
|
|
-}
|
|
|
-
|
|
|
-/*
|
|
|
-func TestToken(t *testing.T) {
|
|
|
- commands := NewCommandStore()
|
|
|
- auth := &AuthDebug{}
|
|
|
- commands.AddCommand("/register", auth)
|
|
|
- commands.AddCommand("/login", auth)
|
|
|
- rest := NewRest(AddrCorrect, Secret, commands)
|
|
|
- err := rest.Listen(time.Second)
|
|
|
- if err != nil {
|
|
|
- t.Log("open", err, rest.opened.Load())
|
|
|
- return
|
|
|
- }
|
|
|
- defer rest.Close()
|
|
|
-
|
|
|
- // register
|
|
|
- body, err := sendRequest(
|
|
|
- URL("/register"),
|
|
|
- json.Map{
|
|
|
- "login": "test",
|
|
|
- },
|
|
|
- nil,
|
|
|
- "",
|
|
|
- )
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err, string(body))
|
|
|
- }
|
|
|
- var jm json.Map
|
|
|
- json.Unmarshal(body, &jm)
|
|
|
- token := jm.StringVal("token", "")
|
|
|
- t.Log("token", token)
|
|
|
-
|
|
|
- // auth
|
|
|
- body, err = sendRequest(
|
|
|
- URL("/login"),
|
|
|
- json.Map{},
|
|
|
- nil,
|
|
|
- token,
|
|
|
- )
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err, string(body))
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-func newFielderTest(id, parentID int64, name string, price float64, child *tFielderTest) *tFielderTest {
|
|
|
- f := &tFielderTest{
|
|
|
- ID: id,
|
|
|
- Password: "top-secret",
|
|
|
- ParentID: parentID,
|
|
|
- Name: name,
|
|
|
- Price: price,
|
|
|
- }
|
|
|
- f.Fielder = NewFielder(f)
|
|
|
- return f
|
|
|
-}
|
|
|
-
|
|
|
-type tFielderTest struct {
|
|
|
- *Fielder
|
|
|
- ID int64
|
|
|
- Password string
|
|
|
- ParentID int64
|
|
|
- Name string
|
|
|
- Price float64
|
|
|
- Child *tFielderTest
|
|
|
-}
|
|
|
-
|
|
|
-func (s *tFielderTest) FieldCheck(name string) bool {
|
|
|
- if name == "password" {
|
|
|
- return false
|
|
|
- }
|
|
|
- return true
|
|
|
-}
|
|
|
-
|
|
|
-func TestFielder(t *testing.T) {
|
|
|
- f := newFielderTest(1, 10, "VTBR", 100, nil)
|
|
|
- f1 := newFielderTest(10, 100, "SBER", 1000, nil)
|
|
|
- f.Child = f1
|
|
|
-
|
|
|
- fm, err := f.Fields(
|
|
|
- "id",
|
|
|
- "name",
|
|
|
- "parent_id",
|
|
|
- "price",
|
|
|
- "password",
|
|
|
- )
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
- fm.LogPretty()
|
|
|
-
|
|
|
- f.ID = 11
|
|
|
-
|
|
|
- fm, err = f.Fields(
|
|
|
- "id",
|
|
|
- "name",
|
|
|
- "parent_id",
|
|
|
- "price",
|
|
|
- map[string]any{
|
|
|
- "name": "child",
|
|
|
- "fields": []any{
|
|
|
- "id",
|
|
|
- "name",
|
|
|
- "parent_id",
|
|
|
- map[string]any{
|
|
|
- "name": "child",
|
|
|
- "fields": []any{
|
|
|
- "id",
|
|
|
- },
|
|
|
- },
|
|
|
- },
|
|
|
- },
|
|
|
- )
|
|
|
- if err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
- fm.LogPretty()
|
|
|
-}
|
|
|
-
|
|
|
-func TestCase(t *testing.T) {
|
|
|
- // Тестирование функций
|
|
|
- testCamel := "ParentID"
|
|
|
- testSnake := "parent_id"
|
|
|
-
|
|
|
- snake := CamelToSnake(testCamel)
|
|
|
- camel := SnakeToCamel(testSnake)
|
|
|
-
|
|
|
- println(testCamel, "->", snake)
|
|
|
- println(testSnake, "->", camel)
|
|
|
-}
|
|
|
-
|
|
|
-// Serialize /////////////////////////////////////////////////
|
|
|
-
|
|
|
-type tSChild struct {
|
|
|
- ID int64 `rest:"required"`
|
|
|
- ParentID int64
|
|
|
- Name string
|
|
|
-}
|
|
|
-
|
|
|
-type tSerializeCommand struct {
|
|
|
- ID int64 `rest:"required;"`
|
|
|
- ParentID int64
|
|
|
- Name string
|
|
|
- Child *tSChild `rest:"required"`
|
|
|
- TestFileTxt io.ReadCloser `rest:"required;file"`
|
|
|
-}
|
|
|
-
|
|
|
-func TestSerialize(t *testing.T) {
|
|
|
- jm := json.Map{
|
|
|
- "id": 10,
|
|
|
- "parent_id": 1,
|
|
|
- "name": "Cooler",
|
|
|
- "child": map[string]any{
|
|
|
- "id": 101,
|
|
|
- "parent_id": 10,
|
|
|
- "name": "Childer...",
|
|
|
- },
|
|
|
- }
|
|
|
- files := map[string]io.ReadCloser{
|
|
|
- "test_file.txt": io.NopCloser(bytes.NewBuffer([]byte("Test file contents"))),
|
|
|
- }
|
|
|
-
|
|
|
- r := &tSerializeCommand{}
|
|
|
-
|
|
|
- if err := serializeRequest(r, jm, files, ""); err != nil {
|
|
|
- t.Fatal(err)
|
|
|
- }
|
|
|
-
|
|
|
- t.Log(r)
|
|
|
-}
|
|
|
-*/
|