Skip to content

Commit c165b5b

Browse files
committed
VCR and VDR clients
1 parent 0a05ad0 commit c165b5b

File tree

10 files changed

+4854
-2
lines changed

10 files changed

+4854
-2
lines changed

nuts/discovery/bug.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ package discovery
44
// When regenerating code, you need to alter it to map[string]interface{}
55
// This function is there to make sure compilation fails if it's map[string]string
66
var _ = SearchPresentationsParams{
7-
Query: &map[string]interface{}{},
7+
Query: &map[string]string{},
88
}

nuts/discovery/generated.go

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

nuts/util.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package nuts
2+
3+
import (
4+
"errors"
5+
"fmt"
6+
"io"
7+
"net"
8+
"net/http"
9+
"strings"
10+
)
11+
12+
var ErrNutsNodeUnreachable = errors.New("nuts node unreachable")
13+
14+
func UnwrapAPIError(err error) error {
15+
if _, ok := err.(net.Error); ok {
16+
return errors.Join(ErrNutsNodeUnreachable, err)
17+
}
18+
return err
19+
}
20+
21+
func ParseResponse[T any](err error, httpResponse *http.Response, fn func(rsp *http.Response) (*T, error)) (*T, error) {
22+
if err != nil {
23+
return nil, fmt.Errorf("http request failed: %w", UnwrapAPIError(err))
24+
}
25+
if httpResponse.StatusCode < 200 || httpResponse.StatusCode >= 300 {
26+
responseData, _ := io.ReadAll(httpResponse.Body)
27+
detail := "Response data:\n----------------\n" + strings.TrimSpace(string(responseData)) + "\n----------------"
28+
return nil, fmt.Errorf("non-OK status code (status=%s, url=%s)\n%s", httpResponse.Status, httpResponse.Request.URL, detail)
29+
}
30+
result, err := fn(httpResponse)
31+
if err != nil {
32+
return nil, fmt.Errorf("failed to parse response: %w", err)
33+
}
34+
return result, nil
35+
}

nuts/util_test.go

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package nuts
2+
3+
import (
4+
"github.com/stretchr/testify/require"
5+
"io"
6+
"net/http"
7+
"net/http/httptest"
8+
"strings"
9+
"testing"
10+
)
11+
12+
func Test_ParseResponse(t *testing.T) {
13+
fn := func(response *http.Response) (*string, error) {
14+
data, _ := io.ReadAll(response.Body)
15+
result := string(data)
16+
return &result, nil
17+
}
18+
okResponse := func() *http.Response {
19+
return &http.Response{
20+
StatusCode: 200,
21+
Status: "200 OK",
22+
Body: io.NopCloser(strings.NewReader("http-test-response")),
23+
Request: httptest.NewRequest(http.MethodGet, "http://example.com", nil),
24+
}
25+
}
26+
nokResponse := func() *http.Response {
27+
return &http.Response{
28+
StatusCode: 404,
29+
Status: "404 Not Found",
30+
Body: io.NopCloser(strings.NewReader("http-test-response")),
31+
Request: httptest.NewRequest(http.MethodGet, "http://example.com", nil),
32+
}
33+
}
34+
t.Run("error", func(t *testing.T) {
35+
_, err := ParseResponse(io.EOF, okResponse(), fn)
36+
require.EqualError(t, err, "http request failed: EOF")
37+
})
38+
t.Run("parse error", func(t *testing.T) {
39+
_, err := ParseResponse(nil, okResponse(), func(response *http.Response) (*string, error) {
40+
return nil, io.EOF
41+
})
42+
require.EqualError(t, err, "failed to parse response: EOF")
43+
})
44+
t.Run("ok", func(t *testing.T) {
45+
result, err := ParseResponse(nil, okResponse(), fn)
46+
require.NoError(t, err)
47+
require.Equal(t, "http-test-response", *result)
48+
})
49+
t.Run("non-ok status", func(t *testing.T) {
50+
_, err := ParseResponse(nil, nokResponse(), fn)
51+
require.EqualError(t, err, "non-OK status code (status=404 Not Found, url=http://example.com)\nResponse data:\n----------------\nhttp-test-response\n----------------")
52+
})
53+
}

nuts/vcr/codegen.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
//go:generate go run github.com/oapi-codegen/oapi-codegen/v2/cmd/oapi-codegen -o generated.go --config=config.yaml https://nuts-node.readthedocs.io/en/latest/_static/vcr/vcr_v2.yaml
2+
3+
package vcr

nuts/vcr/config.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package: vcr
2+
generate:
3+
models: true
4+
client: true
5+
import-mapping:
6+
"../common/ssi_types.yaml": "github.com/nuts-foundation/go-nuts-client/nuts/common"

0 commit comments

Comments
 (0)