summaryrefslogtreecommitdiff
path: root/internal/server/api_test.go
blob: 07510b06814d6fb8dd90d9d1c05de97dda25d77d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
package server

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

	"github.com/eduvpn/eduvpn-common/internal/test"
	"github.com/go-errors/errors"
)

func getErrorMsg(err error) string {
	if err == nil {
		return ""
	}
	return err.Error()
}

func compareEndpoints(ep1 Endpoints, ep2 Endpoints) bool {
	v3_1 := ep1.API.V3
	v3_2 := ep2.API.V3
	return v3_1.API == v3_2.API && v3_1.Authorization == v3_2.Authorization && v3_1.Token == v3_2.Token
}

func Test_APIGetEndpoints(t *testing.T) {
	handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintln(w, "Hello!")
	})
	hs := &test.HandlerSet{}
	hs.SetHandler(handler)
	s := test.NewServer(hs)
	defer s.Close()

	c, err := s.Client()
	if err != nil {
		t.Fatalf("failed to get client for test server endpoints: %v", err)
	}

	testCases := []struct {
		epl EndpointList
		err error
	}{
		{
			epl: EndpointList{
				API:           "https://example.com/1",
				Authorization: "https://example.com/2",
				Token:         "https://example.com/3",
			},
			err: nil,
		},
		{
			epl: EndpointList{
				API:           "http://example.com/1",
				Authorization: "https://example.com/2",
				Token:         "https://example.com/3",
			},
			err: errors.New("API scheme: 'http', is not equal to 'https'"),
		},
		{
			epl: EndpointList{
				API:           "https://example.com/1",
				Authorization: "https://example.com/2",
				Token:         "ftp://example.com/3",
			},
			err: errors.New("API scheme: 'https', is not equal to token scheme: 'ftp'"),
		},
	}

	for _, tc := range testCases {
		ep := &Endpoints{
			API: EndpointsVersions{
				V3: tc.epl,
			},
		}
		// Update the handler
		hs.SetHandler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
			w.Header().Set("Content-Type", "application/json")

			jsonStr, err := json.Marshal(ep)
			if err != nil {
				t.Fatalf("failed to marshal JSON for test case: %v, err: %v", tc, err)
			}

			fmt.Fprintln(w, string(jsonStr))
		}))
		gotEP, err := APIGetEndpoints(s.URL, c)
		if getErrorMsg(err) != getErrorMsg(tc.err) {
			t.Fatalf("Errors not equal, want err: %v, got: %v", tc.err, err)
		}
		// The error was not nil, continue because endpoints should not be compared
		if tc.err != nil {
			continue
		}
		if ep == nil {
			t.Fatalf("No test case endpoints")
		}
		if gotEP == nil {
			t.Fatalf("Got no endpoints for nil error")
		}
		// if no error then the endpoints should be equal
		if !compareEndpoints(*ep, *gotEP) {
			t.Fatalf("Endpoints are not equal, got: %v, want: %v", gotEP, ep)
		}
	}
}