// Copyright 2024 Matthew Rich . All rights reserved. package resource import ( "context" _ "encoding/json" "fmt" "github.com/stretchr/testify/assert" _ "gopkg.in/yaml.v3" "io" "log/slog" "net/http" "net/http/httptest" _ "net/url" _ "os" _ "path/filepath" _ "strings" "testing" "regexp" ) func TestNewHTTPResource(t *testing.T) { h := NewHTTP() assert.NotNil(t, h) } func TestHTTPDecode(t *testing.T) { h := NewHTTP() assert.NotNil(t, h) decl:=` endpoint: "https://example.foo" body: |- test body ` assert.Nil(t, h.LoadDecl(decl)) assert.Equal(t, "test body", h.Content) } func TestHTTPRead(t *testing.T) { h := NewHTTP() assert.NotNil(t, h) server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { assert.Equal(t, req.URL.String(), "/resource/user/foo") n,e := rw.Write([]byte(` type: "user" attributes: name: "foo" gecos: "foo user" `)) assert.Nil(t, e) assert.Greater(t, n, 0) })) defer server.Close() decl := fmt.Sprintf(` endpoint: "%s/resource/user/foo" `, server.URL) assert.Nil(t, h.LoadDecl(decl)) _,e := h.Read(context.Background()) assert.Nil(t, e) assert.Greater(t, len(h.Content), 0) assert.Nil(t, h.Validate()) } func TestHTTPCreate(t *testing.T) { ctx := context.Background() userdecl := ` type: "user" attributes: name: "foo" gecos: "foo user" ` h := NewHTTP() assert.NotNil(t, h) server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { defer req.Body.Close() assert.Equal(t, req.URL.String(), "/resource/user") body, err := io.ReadAll(req.Body) assert.Nil(t, err) assert.Equal(t, userdecl, string(body)) assert.Equal(t, "application/yaml", req.Header.Get("content-type")) })) defer server.Close() re := regexp.MustCompile(`(?m)^(.*)$`) decl := fmt.Sprintf(` endpoint: "%s/resource/user" headers: - name: "content-type" value: "application/yaml" body: | %s `, server.URL, re.ReplaceAllString(userdecl, " $1")) assert.Nil(t, h.LoadDecl(decl)) assert.Greater(t, len(h.Content), 0) slog.Info("TestHTTPCreate()", "resource", h, "decl", decl) e := h.Create(ctx) assert.Nil(t, e) }