Skip to content

Commit 5cf57d5

Browse files
Add unit tests for sourcemap upload command
Co-Authored-By: [email protected] <[email protected]>
1 parent babf768 commit 5cf57d5

File tree

1 file changed

+191
-0
lines changed

1 file changed

+191
-0
lines changed

cmd/sourcemaps/upload_test.go

Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
package sourcemaps
2+
3+
import (
4+
"encoding/json"
5+
"net/http"
6+
"net/http/httptest"
7+
"os"
8+
"path/filepath"
9+
"testing"
10+
11+
"github.com/spf13/cobra"
12+
"github.com/stretchr/testify/assert"
13+
14+
"github.com/launchdarkly/ldcli/internal/resources"
15+
)
16+
17+
func TestVerifyApiKey(t *testing.T) {
18+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
19+
assert.Equal(t, http.MethodPost, r.Method)
20+
assert.Equal(t, "application/json", r.Header.Get("Content-Type"))
21+
assert.Equal(t, "test-api-key", r.Header.Get("ApiKey"))
22+
23+
response := `{"data":{"api_key_to_org_id":"org123"}}`
24+
w.Header().Set("Content-Type", "application/json")
25+
w.WriteHeader(http.StatusOK)
26+
_, _ = w.Write([]byte(response))
27+
}))
28+
defer server.Close()
29+
30+
orgID, err := verifyApiKey("test-api-key", server.URL)
31+
assert.NoError(t, err)
32+
assert.Equal(t, "org123", orgID)
33+
34+
invalidServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
35+
response := `{"data":{"api_key_to_org_id":"0"}}`
36+
w.Header().Set("Content-Type", "application/json")
37+
w.WriteHeader(http.StatusOK)
38+
_, _ = w.Write([]byte(response))
39+
}))
40+
defer invalidServer.Close()
41+
42+
_, err = verifyApiKey("invalid-key", invalidServer.URL)
43+
assert.Error(t, err)
44+
assert.Contains(t, err.Error(), "invalid API key")
45+
}
46+
47+
func TestGetSourceMapUploadUrls(t *testing.T) {
48+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
49+
assert.Equal(t, http.MethodPost, r.Method)
50+
assert.Equal(t, "application/json", r.Header.Get("Content-Type"))
51+
52+
var requestBody map[string]interface{}
53+
err := json.NewDecoder(r.Body).Decode(&requestBody)
54+
assert.NoError(t, err)
55+
assert.Contains(t, requestBody, "query")
56+
assert.Contains(t, requestBody, "variables")
57+
58+
variables, ok := requestBody["variables"].(map[string]interface{})
59+
assert.True(t, ok)
60+
assert.Equal(t, "test-api-key", variables["api_key"])
61+
assert.NotNil(t, variables["paths"])
62+
63+
response := `{"data":{"get_source_map_upload_urls":["https://example.com/upload1","https://example.com/upload2"]}}`
64+
w.Header().Set("Content-Type", "application/json")
65+
w.WriteHeader(http.StatusOK)
66+
_, _ = w.Write([]byte(response))
67+
}))
68+
defer server.Close()
69+
70+
paths := []string{"path1", "path2"}
71+
urls, err := getSourceMapUploadUrls("test-api-key", paths, server.URL)
72+
assert.NoError(t, err)
73+
assert.Equal(t, 2, len(urls))
74+
assert.Equal(t, "https://example.com/upload1", urls[0])
75+
assert.Equal(t, "https://example.com/upload2", urls[1])
76+
77+
errorServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
78+
response := `{"data":{"get_source_map_upload_urls":[]}}`
79+
w.Header().Set("Content-Type", "application/json")
80+
w.WriteHeader(http.StatusOK)
81+
_, _ = w.Write([]byte(response))
82+
}))
83+
defer errorServer.Close()
84+
85+
_, err = getSourceMapUploadUrls("test-api-key", paths, errorServer.URL)
86+
assert.Error(t, err)
87+
assert.Contains(t, err.Error(), "unable to generate source map upload urls")
88+
}
89+
90+
func TestGetS3Key(t *testing.T) {
91+
key := getS3Key("org123", "v1.0", "base/path", "file.js.map")
92+
assert.Equal(t, "org123/v1.0/base/path/file.js.map", key)
93+
94+
key = getS3Key("org123", "", "base/path", "file.js.map")
95+
assert.Equal(t, "org123/unversioned/base/path/file.js.map", key)
96+
97+
key = getS3Key("org123", "v1.0", "", "file.js.map")
98+
assert.Equal(t, "org123/v1.0/file.js.map", key)
99+
100+
key = getS3Key("org123", "v1.0", "base/path", "file.js.map")
101+
assert.Equal(t, "org123/v1.0/base/path/file.js.map", key)
102+
}
103+
104+
func TestUploadFile(t *testing.T) {
105+
tempDir, err := os.MkdirTemp("", "sourcemap-test")
106+
assert.NoError(t, err)
107+
defer os.RemoveAll(tempDir)
108+
109+
tempFile := filepath.Join(tempDir, "test.js.map")
110+
err = os.WriteFile(tempFile, []byte("test content"), 0644)
111+
assert.NoError(t, err)
112+
113+
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
114+
assert.Equal(t, http.MethodPut, r.Method)
115+
116+
body, err := os.ReadAll(r.Body)
117+
assert.NoError(t, err)
118+
assert.Equal(t, "test content", string(body))
119+
120+
w.WriteHeader(http.StatusOK)
121+
}))
122+
defer server.Close()
123+
124+
err = uploadFile(tempFile, server.URL, "test.js.map")
125+
assert.NoError(t, err)
126+
127+
errorServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
128+
w.WriteHeader(http.StatusInternalServerError)
129+
}))
130+
defer errorServer.Close()
131+
132+
err = uploadFile(tempFile, errorServer.URL, "test.js.map")
133+
assert.Error(t, err)
134+
assert.Contains(t, err.Error(), "upload failed with status code: 500")
135+
}
136+
137+
func TestNewUploadCmd(t *testing.T) {
138+
client := resources.NewClient("")
139+
cmd := NewUploadCmd(client)
140+
141+
assert.Equal(t, "upload", cmd.Use)
142+
assert.Equal(t, "Upload sourcemaps", cmd.Short)
143+
assert.Contains(t, cmd.Long, "LaunchDarkly error monitoring")
144+
145+
assert.NotNil(t, cmd.Flags().Lookup(apiKeyFlag))
146+
assert.NotNil(t, cmd.Flags().Lookup(appVersionFlag))
147+
assert.NotNil(t, cmd.Flags().Lookup(pathFlag))
148+
assert.NotNil(t, cmd.Flags().Lookup(basePathFlag))
149+
assert.NotNil(t, cmd.Flags().Lookup(backendUrlFlag))
150+
151+
requiredFlags := cmd.Flags().Lookup(apiKeyFlag).Annotations["required"]
152+
assert.Equal(t, []string{"true"}, requiredFlags)
153+
}
154+
155+
func TestRunE(t *testing.T) {
156+
client := resources.NewClient("")
157+
cmd := &cobra.Command{}
158+
args := []string{}
159+
160+
tempDir, err := os.MkdirTemp("", "sourcemap-test")
161+
assert.NoError(t, err)
162+
defer os.RemoveAll(tempDir)
163+
164+
testMapFile := filepath.Join(tempDir, "test.js.map")
165+
err = os.WriteFile(testMapFile, []byte("{}"), 0644)
166+
assert.NoError(t, err)
167+
168+
verifyServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
169+
response := `{"data":{"api_key_to_org_id":"org123"}}`
170+
w.Header().Set("Content-Type", "application/json")
171+
w.WriteHeader(http.StatusOK)
172+
_, _ = w.Write([]byte(response))
173+
}))
174+
defer verifyServer.Close()
175+
176+
urlsServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
177+
response := `{"data":{"get_source_map_upload_urls":["https://example.com/upload"]}}`
178+
w.Header().Set("Content-Type", "application/json")
179+
w.WriteHeader(http.StatusOK)
180+
_, _ = w.Write([]byte(response))
181+
}))
182+
defer urlsServer.Close()
183+
184+
uploadServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
185+
w.WriteHeader(http.StatusOK)
186+
}))
187+
defer uploadServer.Close()
188+
189+
runFunc := runE(client)
190+
assert.NotNil(t, runFunc)
191+
}

0 commit comments

Comments
 (0)