Skip to content

Commit

Permalink
feat: add tests
Browse files Browse the repository at this point in the history
  • Loading branch information
martinsaporiti committed Dec 18, 2023
1 parent 175627f commit 7d8363f
Show file tree
Hide file tree
Showing 5 changed files with 263 additions and 28 deletions.
6 changes: 4 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@ export PATH := $(BIN):$(PATH)

BUILD_CMD := $(GO) install -ldflags "-X main.build=${VERSION}"



.PHONY: build/docker
build/docker: ## Build the docker image.
DOCKER_BUILDKIT=1 \
Expand All @@ -30,6 +28,10 @@ $(BIN)/golangci-lint: go.mod go.sum
$(GO) install github.com/golangci/golangci-lint/cmd/golangci-lint


.PHONY: tests
tests:
$(GO) test -v ./...

## Generate API files
.PHONY: api
api: $(BIN)/oapi-codegen
Expand Down
21 changes: 6 additions & 15 deletions internal/api/main_test.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,13 @@
package api

import (
"context"
"net/http"
"encoding/json"
"testing"

"github.com/go-chi/chi/v5"
"github.com/iden3/go-iden3-auth/v2/loaders"
"github.com/stretchr/testify/require"

"github.com/0xPolygonID/verifier-backend/internal/config"
"github.com/0xPolygonID/verifier-backend/internal/errors"
)

var (
Expand All @@ -18,7 +16,6 @@ var (
)

func TestMain(m *testing.M) {

cfg = config.Config{
Host: "http://localhost",
ApiPort: "3000",
Expand All @@ -40,14 +37,8 @@ func TestMain(m *testing.M) {
m.Run()
}

func getHandler(ctx context.Context, server *Server) http.Handler {
mux := chi.NewRouter()
RegisterStatic(mux)
return HandlerFromMux(NewStrictHandlerWithOptions(
server,
nil,
StrictHTTPServerOptions{
RequestErrorHandlerFunc: errors.RequestErrorHandlerFunc,
},
), mux)
func jsonToMap(t *testing.T, jsonStr string) map[string]interface{} {
result := make(map[string]interface{})
require.NoError(t, json.Unmarshal([]byte(jsonStr), &result))
return result
}
36 changes: 36 additions & 0 deletions internal/api/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -359,5 +359,41 @@ func checkRequest(request SignInRequestObject) (SignInResponseObject, error) {
}}, nil
}

query := request.Body.Query
if query == nil {
log.Error("query is nil")
return SignIn400JSONResponse{N400JSONResponse: N400JSONResponse{
Message: "query is nil",
}}, nil
}

if query["context"] == nil || query["context"] == "" {
log.Error("context is empty")
return SignIn400JSONResponse{N400JSONResponse: N400JSONResponse{
Message: "context is empty",
}}, nil
}

if query["type"] == nil || query["type"] == "" {
log.Error("type is empty")
return SignIn400JSONResponse{N400JSONResponse: N400JSONResponse{
Message: "type is empty",
}}, nil
}

if query["allowedIssuers"] == nil {
log.Error("allowedIssuers is nil")
return SignIn400JSONResponse{N400JSONResponse: N400JSONResponse{
Message: "allowedIssuers is empty",
}}, nil
}

if query["credentialSubject"] == nil {
log.Error("credentialSubject is nil")
return SignIn400JSONResponse{N400JSONResponse: N400JSONResponse{
Message: "credentialSubject is empty",
}}, nil
}

return nil, nil
}
227 changes: 216 additions & 11 deletions internal/api/server_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package api

import (
"context"
"encoding/json"
"net/http"
"strconv"
"strings"
Expand Down Expand Up @@ -133,27 +132,239 @@ func TestSignIn(t *testing.T) {
},
},
},
{
name: "valid request for credentialAtomicQueryMTPV2 circuit with KYCAgeCredential",
body: SignInRequestObject{
Body: &SignInJSONRequestBody{
Network: "mumbai",
CircuitID: "credentialAtomicQueryMTPV2",
Query: jsonToMap(t, `{
"context": "https://raw.githubusercontent.com/iden3/claim-schema-vocab/main/schemas/json-ld/kyc-v3.json-ld",
"allowedIssuers": ["*"],
"type": "KYCAgeCredential",
"credentialSubject": {
"birthday": {
"$eq": 19960424
}
}
}`),
},
},
expected: expected{
httpCode: http.StatusOK,
SignInResponseObject: SignIn200JSONResponse{
QrCode: QRCode{
Body: bodyType{
Scope: &[]Scope{
{
CircuitId: "credentialAtomicQueryMTPV2",
Id: 1,
Query: map[string]interface{}{
"allowedIssuers": []interface{}{"*"},
"context": "https://raw.githubusercontent.com/iden3/claim-schema-vocab/main/schemas/json-ld/kyc-v3.json-ld",
"credentialSubject": map[string]interface{}{
"birthday": map[string]interface{}{
"$eq": float64(19960424),
},
},
"type": "KYCAgeCredential",
},
},
},
},
From: cfg.MumbaiSenderDID,
To: nil,
Typ: "application/iden3comm-plain-json",
Type: "https://iden3-communication.io/authorization/1.0/request",
},
},
},
},
{
name: "invalid request - invalid network",
body: SignInRequestObject{
Body: &SignInJSONRequestBody{
Network: "invalid",
},
},
expected: expected{
httpCode: http.StatusBadRequest,
SignInResponseObject: SignIn400JSONResponse{
N400JSONResponse{
Message: "invalid network",
},
},
},
},
{
name: "invalid request - invalid circuitID",
body: SignInRequestObject{
Body: &SignInJSONRequestBody{
Network: "mumbai",
CircuitID: "invalid",
},
},
expected: expected{
httpCode: http.StatusBadRequest,
SignInResponseObject: SignIn400JSONResponse{
N400JSONResponse{
Message: "invalid circuitID, just credentialAtomicQuerySigV2 and credentialAtomicQueryMTPV2 are supported",
},
},
},
},
{
name: "invalid request - invalid query - no context",
body: SignInRequestObject{
Body: &SignInJSONRequestBody{
Network: "mumbai",
CircuitID: "credentialAtomicQuerySigV2",
Query: jsonToMap(t, `{
}`),
},
},
expected: expected{
httpCode: http.StatusBadRequest,
SignInResponseObject: SignIn400JSONResponse{
N400JSONResponse{
Message: "context is empty",
},
},
},
},
{
name: "invalid request - invalid query - context empty",
body: SignInRequestObject{
Body: &SignInJSONRequestBody{
Network: "mumbai",
CircuitID: "credentialAtomicQuerySigV2",
Query: jsonToMap(t, `{
"context": ""
}`),
},
},
expected: expected{
httpCode: http.StatusBadRequest,
SignInResponseObject: SignIn400JSONResponse{
N400JSONResponse{
Message: "context is empty",
},
},
},
},
{
name: "invalid request - invalid query - no type",
body: SignInRequestObject{
Body: &SignInJSONRequestBody{
Network: "mumbai",
CircuitID: "credentialAtomicQuerySigV2",
Query: jsonToMap(t, `{
"context": "https://raw.githubusercontent.com/iden3/claim-schema-vocab/main/schemas/json-ld/kyc-v3.json-ld"
}`),
},
},
expected: expected{
httpCode: http.StatusBadRequest,
SignInResponseObject: SignIn400JSONResponse{
N400JSONResponse{
Message: "type is empty",
},
},
},
},
{
name: "invalid request - invalid query - empty type",
body: SignInRequestObject{
Body: &SignInJSONRequestBody{
Network: "mumbai",
CircuitID: "credentialAtomicQuerySigV2",
Query: jsonToMap(t, `{
"context": "https://raw.githubusercontent.com/iden3/claim-schema-vocab/main/schemas/json-ld/kyc-v3.json-ld",
"type": ""
}`),
},
},
expected: expected{
httpCode: http.StatusBadRequest,
SignInResponseObject: SignIn400JSONResponse{
N400JSONResponse{
Message: "type is empty",
},
},
},
},
{
name: "invalid request - invalid query - no allowedIssuers",
body: SignInRequestObject{
Body: &SignInJSONRequestBody{
Network: "mumbai",
CircuitID: "credentialAtomicQuerySigV2",
Query: jsonToMap(t, `{
"context": "https://raw.githubusercontent.com/iden3/claim-schema-vocab/main/schemas/json-ld/kyc-v3.json-ld",
"type": "KYCAgeCredential"
}`),
},
},
expected: expected{
httpCode: http.StatusBadRequest,
SignInResponseObject: SignIn400JSONResponse{
N400JSONResponse{
Message: "allowedIssuers is empty",
},
},
},
},
{
name: "invalid request - invalid query - no credentialSubject",
body: SignInRequestObject{
Body: &SignInJSONRequestBody{
Network: "mumbai",
CircuitID: "credentialAtomicQuerySigV2",
Query: jsonToMap(t, `{
"context": "https://raw.githubusercontent.com/iden3/claim-schema-vocab/main/schemas/json-ld/kyc-v3.json-ld",
"type": "KYCAgeCredential",
"allowedIssuers": ["*"]
}`),
},
},
expected: expected{
httpCode: http.StatusBadRequest,
SignInResponseObject: SignIn400JSONResponse{
N400JSONResponse{
Message: "credentialSubject is empty",
},
},
},
},
} {
t.Run(tc.name, func(t *testing.T) {
rr, err := server.SignIn(ctx, tc.body)
require.NoError(t, err)
switch tc.expected.httpCode {
case http.StatusOK:
var response SignIn200JSONResponse
response = rr.(SignIn200JSONResponse)
expected := tc.expected.SignInResponseObject.(SignIn200JSONResponse)
response, ok := rr.(SignIn200JSONResponse)
require.True(t, ok)
expected, ok := tc.expected.SignInResponseObject.(SignIn200JSONResponse)
require.True(t, ok)
require.Equal(t, expected.QrCode.Body.Scope, response.QrCode.Body.Scope)
assert.True(t, isValidCallBack(t, response.QrCode.Body.CallbackUrl))
assert.Equal(t, expected.QrCode.From, response.QrCode.From)
assert.Equal(t, expected.QrCode.Typ, response.QrCode.Typ)
assert.Equal(t, expected.QrCode.Type, response.QrCode.Type)
assert.Equal(t, expected.QrCode.To, response.QrCode.To)

case http.StatusBadRequest:
response, ok := rr.(SignIn400JSONResponse)
require.True(t, ok)
expected, ok := tc.expected.SignInResponseObject.(SignIn400JSONResponse)
require.True(t, ok)
assert.Equal(t, expected.Message, response.Message)
default:
t.Errorf("unexpected http code: %d", tc.expected.httpCode)
}
})
}

}

func isValidCallBack(t *testing.T, url *string) bool {
Expand All @@ -175,9 +386,3 @@ func isValidCallBack(t *testing.T, url *string) bool {
assert.True(t, n > 0)
return true
}

func jsonToMap(t *testing.T, jsonStr string) map[string]interface{} {
result := make(map[string]interface{})
require.NoError(t, json.Unmarshal([]byte(jsonStr), &result))
return result
}
1 change: 1 addition & 0 deletions internal/common/utils.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package common

// ToPointer is a helper function to create a pointer to a value.
func ToPointer[T any](p T) *T {
return &p
}

0 comments on commit 7d8363f

Please sign in to comment.