package authz

import (
	"context"
	"sync"
	"testing"

	"github.com/zitadel/zitadel/internal/errors"
)

func Test_VerifyAccessToken(t *testing.T) {

	type args struct {
		ctx      context.Context
		token    string
		verifier *TokenVerifier
		method   string
	}
	tests := []struct {
		name    string
		args    args
		wantErr bool
	}{
		{
			name: "no auth header set",
			args: args{
				ctx:   context.Background(),
				token: "",
			},
			wantErr: true,
		},
		{
			name: "wrong auth header set",
			args: args{
				ctx:   context.Background(),
				token: "Basic sds",
			},
			wantErr: true,
		},
		{
			name: "auth header set",
			args: args{
				ctx:   context.Background(),
				token: "Bearer AUTH",
				verifier: &TokenVerifier{
					authZRepo: &testVerifier{memberships: []*Membership{}},
					clients: func() sync.Map {
						m := sync.Map{}
						m.Store("service", &client{name: "name"})
						return m
					}(),
					authMethods: MethodMapping{"/service/method": Option{Permission: "authenticated"}},
				},
				method: "/service/method",
			},
			wantErr: false,
		},
	}
	for _, tt := range tests {
		t.Run(tt.name, func(t *testing.T) {
			_, _, _, _, _, err := verifyAccessToken(tt.args.ctx, tt.args.token, tt.args.verifier, tt.args.method)
			if tt.wantErr && err == nil {
				t.Errorf("got wrong result, should get err: actual: %v ", err)
			}

			if !tt.wantErr && err != nil {
				t.Errorf("got wrong result, should not get err: actual: %v ", err)
			}

			if tt.wantErr && !errors.IsUnauthenticated(err) {
				t.Errorf("got wrong err: %v ", err)
			}
		})
	}
}