11package app
22
33import (
4- "encoding/json"
5- "fmt"
64 "net/http"
75 "net/http/httptest"
86 "testing"
9-
10- "github.com/julwrites/ScriptureBot/pkg/utils"
117)
128
139func TestSubmitQuery (t * testing.T ) {
14- // Mock server
15- ts := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
16- // Check headers
17- if r .Header .Get ("Content-Type" ) != "application/json" {
18- t .Errorf ("Expected Content-Type application/json, got %s" , r .Header .Get ("Content-Type" ))
19- }
20-
21- // Decode request to verify it
22- var req QueryRequest
23- if err := json .NewDecoder (r .Body ).Decode (& req ); err != nil {
24- http .Error (w , "Bad Request" , http .StatusBadRequest )
25- return
26- }
27-
28- // Simple response based on input
29- if req .Query .Prompt == "error" {
30- w .WriteHeader (http .StatusInternalServerError )
31- w .Write ([]byte (`{"error": {"code": 500, "message": "simulated error"}}` ))
32- return
33- }
34-
35- if req .Query .Prompt == "badjson" {
36- w .WriteHeader (http .StatusOK )
37- w .Write ([]byte (`{invalid json` ))
38- return
39- }
40-
41- // Success response
42- resp := VerseResponse {Verse : "Success Verse" }
43- json .NewEncoder (w ).Encode (resp )
44- }))
10+ handler := newMockApiHandler ()
11+ ts := httptest .NewServer (handler )
4512 defer ts .Close ()
4613
47- // Set env vars
48- defer setEnv ("BIBLE_API_URL" , ts .URL )()
49-
50- // Test Case 1: Success
5114 t .Run ("Success" , func (t * testing.T ) {
15+ defer setEnv ("BIBLE_API_URL" , ts .URL )()
16+ ResetAPIConfigCache ()
17+
5218 req := QueryRequest {Query : QueryObject {Prompt : "hello" }}
53- var resp VerseResponse
19+ var resp OQueryResponse
5420 err := SubmitQuery (req , & resp , "" )
5521 if err != nil {
5622 t .Errorf ("Unexpected error: %v" , err )
5723 }
58- if resp .Verse != "Success Verse " {
59- t .Errorf ("Expected 'Success Verse ', got '%s'" , resp .Verse )
24+ if resp .Text != "Answer text " {
25+ t .Errorf ("Expected 'Answer text ', got '%s'" , resp .Text )
6026 }
6127 })
6228
63- // Test Case 2: API Error
6429 t .Run ("API Error" , func (t * testing.T ) {
30+ handler .statusCode = http .StatusInternalServerError
31+ handler .rawResponse = `{"error": {"code": 500, "message": "simulated error"}}`
32+ defer func () { // Reset handler
33+ handler .statusCode = http .StatusOK
34+ handler .rawResponse = ""
35+ }()
36+
37+ defer setEnv ("BIBLE_API_URL" , ts .URL )()
38+ ResetAPIConfigCache ()
39+
6540 req := QueryRequest {Query : QueryObject {Prompt : "error" }}
6641 var resp VerseResponse
6742 err := SubmitQuery (req , & resp , "" )
6843 if err == nil {
6944 t .Error ("Expected error, got nil" )
7045 }
71- // Expect error message to contain "simulated error"
72- if err != nil && err .Error () != "api error (500): simulated error" {
46+ if err .Error () != "api error (500): simulated error" {
7347 t .Errorf ("Expected specific API error, got: %v" , err )
7448 }
7549 })
7650
77- // Test Case 3: Bad JSON Response
7851 t .Run ("Bad JSON" , func (t * testing.T ) {
52+ handler .rawResponse = `{invalid json`
53+ defer func () { handler .rawResponse = "" }()
54+
55+ defer setEnv ("BIBLE_API_URL" , ts .URL )()
56+ ResetAPIConfigCache ()
57+
7958 req := QueryRequest {Query : QueryObject {Prompt : "badjson" }}
8059 var resp VerseResponse
8160 err := SubmitQuery (req , & resp , "" )
@@ -84,13 +63,8 @@ func TestSubmitQuery(t *testing.T) {
8463 }
8564 })
8665
87- // Test Case 4: No URL set
8866 t .Run ("No URL" , func (t * testing.T ) {
89- // Temporarily unset/clear the env var
90- restore := setEnv ("BIBLE_API_URL" , "" )
91- defer restore ()
92- // Also unset PROJECT_ID to avoid Secret Manager lookup
93- defer utils .SetEnv ("GCLOUD_PROJECT_ID" , "" )()
67+ defer setEnv ("BIBLE_API_URL" , "" )()
9468 ResetAPIConfigCache ()
9569
9670 req := QueryRequest {}
@@ -101,65 +75,3 @@ func TestSubmitQuery(t *testing.T) {
10175 }
10276 })
10377}
104-
105- func TestGetAPIConfig_SecretManagerFallback (t * testing.T ) {
106- // Ensure Env Vars are empty
107- defer utils .SetEnv ("BIBLE_API_URL" , "" )()
108- defer utils .SetEnv ("BIBLE_API_KEY" , "" )()
109- defer utils .SetEnv ("GCLOUD_PROJECT_ID" , "test-project" )()
110- ResetAPIConfigCache ()
111-
112- // Mock the secret function
113- oldGetSecret := getSecretFunc
114- defer func () { getSecretFunc = oldGetSecret }()
115-
116- getSecretFunc = func (project , name string ) (string , error ) {
117- if project != "test-project" {
118- return "" , fmt .Errorf ("unexpected project: %s" , project )
119- }
120- if name == "BIBLE_API_URL" {
121- return "http://secret-url.com" , nil
122- }
123- if name == "BIBLE_API_KEY" {
124- return "secret-key" , nil
125- }
126- return "" , fmt .Errorf ("unexpected secret: %s" , name )
127- }
128-
129- url , key := getAPIConfig ("" )
130-
131- if url != "http://secret-url.com" {
132- t .Errorf ("Expected URL 'http://secret-url.com', got '%s'" , url )
133- }
134- if key != "secret-key" {
135- t .Errorf ("Expected Key 'secret-key', got '%s'" , key )
136- }
137- }
138-
139- func TestGetAPIConfig_PassedProjectID (t * testing.T ) {
140- // Ensure Env Vars are empty, including GCLOUD_PROJECT_ID
141- defer utils .SetEnv ("BIBLE_API_URL" , "" )()
142- defer utils .SetEnv ("BIBLE_API_KEY" , "" )()
143- defer utils .SetEnv ("GCLOUD_PROJECT_ID" , "" )()
144- ResetAPIConfigCache ()
145-
146- // Mock the secret function
147- oldGetSecret := getSecretFunc
148- defer func () { getSecretFunc = oldGetSecret }()
149-
150- getSecretFunc = func (project , name string ) (string , error ) {
151- if project != "passed-project" {
152- return "" , fmt .Errorf ("unexpected project: %s" , project )
153- }
154- if name == "BIBLE_API_URL" {
155- return "http://secret-url-passed.com" , nil
156- }
157- return "" , fmt .Errorf ("unexpected secret: %s" , name )
158- }
159-
160- url , _ := getAPIConfig ("passed-project" )
161-
162- if url != "http://secret-url-passed.com" {
163- t .Errorf ("Expected URL 'http://secret-url-passed.com', got '%s'" , url )
164- }
165- }
0 commit comments