Skip to content

Commit 3efed18

Browse files
Merge pull request #17 from solomonng2001/solomon/add-curl-test-cases-for-create-and-edit
Solomon/add curl test cases for create and edit
2 parents 5242266 + 0a054a7 commit 3efed18

File tree

6 files changed

+361
-1
lines changed

6 files changed

+361
-1
lines changed
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
# Ignore private key json file
22
cs3219-g24-firebase-adminsdk-9cm7h-b1675603ab.json
3+
test_create_api_results.txt
4+
test_list_api_results.txt
5+
test_update_api_results.txt

services/question-service/handlers/create.go

Lines changed: 120 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,48 @@ func (s *Service) CreateQuestion(w http.ResponseWriter, r *http.Request) {
2424
}
2525

2626
// Validation
27-
// TODO: Duplicate checking for question name
27+
// Check if title is empty
28+
if question.Title == "" {
29+
http.Error(w, "Title is required", http.StatusBadRequest)
30+
return
31+
}
32+
33+
// Check if description is empty
34+
if question.Description == "" {
35+
http.Error(w, "Description is required", http.StatusBadRequest)
36+
return
37+
}
38+
39+
//// Check if complexity is empty
40+
//// Decode JSON already checks for valid complexity
41+
//if question.Complexity == models.Empty {
42+
// http.Error(w, "Complexity is required", http.StatusBadRequest)
43+
// return
44+
//}
45+
46+
// Check if categories is empty
47+
if len(question.Categories) == 0 {
48+
http.Error(w, "Categories is required", http.StatusBadRequest)
49+
return
50+
}
51+
52+
// Check if title is unique
53+
iter := s.Client.Collection("questions").Where("title", "==", question.Title).Documents(ctx)
54+
for {
55+
doc, err := iter.Next()
56+
if err == iterator.Done {
57+
break
58+
}
59+
if err != nil {
60+
http.Error(w, "Error fetching question", http.StatusInternalServerError)
61+
return
62+
}
63+
64+
if doc != nil {
65+
http.Error(w, "Question title already exists", http.StatusBadRequest)
66+
return
67+
}
68+
}
2869

2970
// Reference to the document where we store the last ID
3071
counterDocRef := s.Client.Collection("counters").Doc("questions")
@@ -91,3 +132,81 @@ func (s *Service) CreateQuestion(w http.ResponseWriter, r *http.Request) {
91132

92133
fmt.Fprintf(w, "Question with ID %s created successfully", question.DocRefID)
93134
}
135+
136+
// Manual test cases
137+
//
138+
// Successful case
139+
//curl -X POST http://localhost:8080/questions \
140+
//-H "Content-Type: application/json" \
141+
//-d '{
142+
//"title": "Sample Question",
143+
//"description": "This is a sample description.",
144+
//"complexity": "medium",
145+
//"categories": ["Data Structures", "Algorithms"]
146+
//}'
147+
//
148+
// Missing question
149+
//curl -X POST http://localhost:8080/questions \
150+
//-H "Content-Type: application/json" \
151+
//-d '{
152+
//"description": "This is a sample description.",
153+
//"complexity": "medium",
154+
//"categories": ["Data Structures", "Algorithms"]
155+
//}'
156+
//
157+
// Missing description
158+
//curl -X POST http://localhost:8080/questions \
159+
//-H "Content-Type: application/json" \
160+
//-d '{
161+
//"title": "Sample Question 1",
162+
//"complexity": "medium",
163+
//"categories": ["Data Structures", "Algorithms"]
164+
//}'
165+
//
166+
// Missing complexity
167+
//curl -X POST http://localhost:8080/questions \
168+
//-H "Content-Type: application/json" \
169+
//-d '{
170+
//"title": "Sample Question 2",
171+
//"description": "This is a sample description.",
172+
//"categories": ["Data Structures", "Algorithms"]
173+
//}'
174+
//
175+
// Missing categories
176+
//curl -X POST http://localhost:8080/questions \
177+
//-H "Content-Type: application/json" \
178+
//-d '{
179+
//"title": "Sample Question 3",
180+
//"description": "This is a sample description.",
181+
//"complexity": "medium",
182+
//}'
183+
//
184+
// Invalid complexity
185+
//curl -X POST http://localhost:8080/questions \
186+
//-H "Content-Type: application/json" \
187+
//-d '{
188+
//"title": "Sample Question 4",
189+
//"description": "This is a sample description.",
190+
//"complexity": "extreme",
191+
//"categories": ["Data Structures", "Algorithms"]
192+
//}'
193+
//
194+
// Duplicate question title
195+
//curl -X POST http://localhost:8080/questions \
196+
//-H "Content-Type: application/json" \
197+
//-d '{
198+
//"title": "Sample Question",
199+
//"description": "This is a sample description.",
200+
//"complexity": "medium",
201+
//"categories": ["Data Structures", "Algorithms"]
202+
//}'
203+
//
204+
// Incorrect JSON
205+
//curl -X POST http://localhost:8080/questions \
206+
//-H "Content-Type: application/json" \
207+
//-d '{
208+
//"title": "Sample Question",
209+
//"description": "This is a sample description.",
210+
//"complexity": "medium",
211+
//"categories": ["Data Structures", "Algorithms"
212+
//}'

services/question-service/models/question.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,13 @@ import (
88

99
type ComplexityType int
1010

11+
//const (
12+
// Empty ComplexityType = iota
13+
// Easy
14+
// Medium
15+
// Hard
16+
//)
17+
1118
const (
1219
Easy ComplexityType = iota
1320
Medium
@@ -40,6 +47,7 @@ func ParseComplexity(complexityStr string) (ComplexityType, error) {
4047
case "hard":
4148
return Hard, nil
4249
default:
50+
//return Empty, fmt.Errorf("invalid complexity level: %s", complexityStr)
4351
return Easy, fmt.Errorf("invalid complexity level: %s", complexityStr)
4452
}
4553
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
#!/bin/bash
2+
3+
# Output file
4+
output_file="test_create_api_results.txt"
5+
6+
cd .. || { echo "Failed to navigate to parent directory."; exit 1; }
7+
go run populate.go || { echo "Failed to populate database."; exit 1; }
8+
cd - || { echo "Failed to navigate back."; exit 1; }
9+
10+
> "$output_file"
11+
12+
# List of curl commands (formatted properly)
13+
requests=(
14+
# Successful case
15+
"curl -X POST http://localhost:8080/questions \
16+
-H 'Content-Type: application/json' \
17+
-d '{\"title\": \"Sample Question\", \"description\": \"This is a sample description.\", \"complexity\": \"medium\", \"categories\": [\"Data Structures\", \"Algorithms\"]}'"
18+
19+
# Missing question
20+
"curl -X POST http://localhost:8080/questions \
21+
-H 'Content-Type: application/json' \
22+
-d '{\"description\": \"This is a sample description.\", \"complexity\": \"medium\", \"categories\": [\"Data Structures\", \"Algorithms\"]}'"
23+
24+
# Missing description
25+
"curl -X POST http://localhost:8080/questions \
26+
-H 'Content-Type: application/json' \
27+
-d '{\"title\": \"Sample Question 1\", \"complexity\": \"medium\", \"categories\": [\"Data Structures\", \"Algorithms\"]}'"
28+
29+
# Missing complexity
30+
"curl -X POST http://localhost:8080/questions \
31+
-H 'Content-Type: application/json' \
32+
-d '{\"title\": \"Sample Question 2\", \"description\": \"This is a sample description.\", \"categories\": [\"Data Structures\", \"Algorithms\"]}'"
33+
34+
# Missing categories
35+
"curl -X POST http://localhost:8080/questions \
36+
-H 'Content-Type: application/json' \
37+
-d '{\"title\": \"Sample Question 3\", \"description\": \"This is a sample description.\", \"complexity\": \"medium\"}'"
38+
39+
# Invalid complexity
40+
"curl -X POST http://localhost:8080/questions \
41+
-H 'Content-Type: application/json' \
42+
-d '{\"title\": \"Sample Question 4\", \"description\": \"This is a sample description.\", \"complexity\": \"extreme\", \"categories\": [\"Data Structures\", \"Algorithms\"]}'"
43+
44+
# Duplicate question title
45+
"curl -X POST http://localhost:8080/questions \
46+
-H 'Content-Type: application/json' \
47+
-d '{\"title\": \"Sample Question\", \"description\": \"This is a sample description.\", \"complexity\": \"medium\", \"categories\": [\"Data Structures\", \"Algorithms\"]}'"
48+
49+
# Incorrect JSON
50+
"curl -X POST http://localhost:8080/questions \
51+
-H 'Content-Type: application/json' \
52+
-d '{\"title\": \"Sample Question\", \"description\": \"This is a sample description.\", \"complexity\": \"medium\", \"categories\": [\"Data Structures\", \"Algorithms\"}'"
53+
)
54+
55+
# Execute each request and save the output to the file
56+
for request in "${requests[@]}"; do
57+
echo "Executing: $request" >> "$output_file"
58+
echo "Response:" >> "$output_file"
59+
eval $request >> "$output_file"
60+
echo -e "\n" >> "$output_file"
61+
done
62+
63+
echo "All requests executed. Results saved in $output_file."
Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,106 @@
1+
#!/bin/bash
2+
3+
# Output file
4+
output_file="test_list_api_results.txt"
5+
6+
cd .. || { echo "Failed to navigate to parent directory."; exit 1; }
7+
go run populate.go || { echo "Failed to populate database."; exit 1; }
8+
cd - || { echo "Failed to navigate back."; exit 1; }
9+
10+
# Clear the output file
11+
> "$output_file"
12+
13+
# List of curl commands
14+
requests=(
15+
"GET http://localhost:8080/questions"
16+
"GET http://localhost:8080/questions?offset=10"
17+
"GET http://localhost:8080/questions?title=Reverse%20a%20String"
18+
"GET http://localhost:8080/questions?complexity=easy,medium"
19+
"GET http://localhost:8080/questions?categories=Algorithms,Data%20Structures"
20+
"GET http://localhost:8080/questions?categories=Algorithms,Data%20Structures&complexity=easy,medium"
21+
"GET http://localhost:8080/questions?categories=Algorithms,Strings&title=Reverse%20a%20String"
22+
"GET http://localhost:8080/questions?complexity=easy,medium&title=Reverse%20a%20String"
23+
"GET http://localhost:8080/questions?complexity=easy,medium&title=Reverse%20a%20String&categories=Algorithms,Strings"
24+
"GET http://localhost:8080/questions?sortField=title&sortValue=asc&offset=10"
25+
"GET http://localhost:8080/questions?sortField=title&sortValue=desc&offset=10"
26+
"GET http://localhost:8080/questions?sortField=createdAt&sortValue=asc&offset=10"
27+
"GET http://localhost:8080/questions?sortField=createdAt&sortValue=desc&offset=10"
28+
"GET http://localhost:8080/questions?sortField=complexity&sortValue=asc&offset=10"
29+
"GET http://localhost:8080/questions?sortField=complexity&sortValue=desc&offset=10"
30+
"GET http://localhost:8080/questions?sortField=id&sortValue=asc&offset=10"
31+
"GET http://localhost:8080/questions?sortField=id&sortValue=desc&offset=10"
32+
"GET http://localhost:8080/questions?limit=5"
33+
"GET http://localhost:8080/questions?limit=5&offset=10"
34+
"GET http://localhost:8080/questions?title=Reverse%20a%20String&sortField=complexity&sortValue=asc"
35+
"GET http://localhost:8080/questions?title=Reverse%20a%20String&sortField=complexity&sortValue=desc"
36+
"GET http://localhost:8080/questions?complexity=easy,medium&sortField=complexity&sortValue=asc"
37+
"GET http://localhost:8080/questions?complexity=easy,medium&sortField=complexity&sortValue=desc"
38+
"GET http://localhost:8080/questions?categories=Algorithms,Data%20Structures&sortField=complexity&sortValue=asc"
39+
"GET http://localhost:8080/questions?categories=Algorithms,Data%20Structures&sortField=complexity&sortValue=desc"
40+
"GET http://localhost:8080/questions?categories=Algorithms,Data%20Structures&complexity=easy,medium&sortField=complexity&sortValue=asc"
41+
"GET http://localhost:8080/questions?categories=Algorithms,Data%20Structures&complexity=easy,medium&sortField=complexity&sortValue=desc"
42+
"GET http://localhost:8080/questions?categories=Algorithms,Strings&title=Reverse%20a%20String&sortField=complexity&sortValue=asc"
43+
"GET http://localhost:8080/questions?categories=Algorithms,Strings&title=Reverse%20a%20String&sortField=complexity&sortValue=desc"
44+
"GET http://localhost:8080/questions?complexity=easy,medium&title=Reverse%20a%20String&sortField=complexity&sortValue=asc"
45+
"GET http://localhost:8080/questions?complexity=easy,medium&title=Reverse%20a%20String&sortField=complexity&sortValue=desc"
46+
"GET http://localhost:8080/questions?complexity=easy,medium&title=Reverse%20a%20String&categories=Algorithms,Strings&sortField=complexity&sortValue=asc"
47+
"GET http://localhost:8080/questions?complexity=easy,medium&title=Reverse%20a%20String&categories=Algorithms,Strings&sortField=complexity&sortValue=desc"
48+
"GET http://localhost:8080/questions?title=Reverse%20a%20String&sortField=createdAt&sortValue=asc"
49+
"GET http://localhost:8080/questions?title=Reverse%20a%20String&sortField=createdAt&sortValue=desc"
50+
"GET http://localhost:8080/questions?complexity=easy,medium&sortField=createdAt&sortValue=asc"
51+
"GET http://localhost:8080/questions?complexity=easy,medium&sortField=createdAt&sortValue=desc"
52+
"GET http://localhost:8080/questions?categories=Algorithms,Data%20Structures&sortField=createdAt&sortValue=asc"
53+
"GET http://localhost:8080/questions?categories=Algorithms,Data%20Structures&sortField=createdAt&sortValue=desc"
54+
"GET http://localhost:8080/questions?categories=Algorithms,Data%20Structures&complexity=easy,medium&sortField=createdAt&sortValue=asc"
55+
"GET http://localhost:8080/questions?categories=Algorithms,Data%20Structures&complexity=easy,medium&sortField=createdAt&sortValue=desc"
56+
"GET http://localhost:8080/questions?categories=Algorithms,Strings&title=Reverse%20a%20String&sortField=createdAt&sortValue=asc"
57+
"GET http://localhost:8080/questions?categories=Algorithms,Strings&title=Reverse%20a%20String&sortField=createdAt&sortValue=desc"
58+
"GET http://localhost:8080/questions?complexity=easy,medium&title=Reverse%20a%20String&sortField=createdAt&sortValue=asc"
59+
"GET http://localhost:8080/questions?complexity=easy,medium&title=Reverse%20a%20String&sortField=createdAt&sortValue=desc"
60+
"GET http://localhost:8080/questions?complexity=easy,medium&title=Reverse%20a%20String&categories=Algorithms,Strings&sortField=createdAt&sortValue=asc"
61+
"GET http://localhost:8080/questions?complexity=easy,medium&title=Reverse%20a%20String&categories=Algorithms,Strings&sortField=createdAt&sortValue=desc"
62+
"GET http://localhost:8080/questions?title=Reverse%20a%20String&sortField=id&sortValue=asc"
63+
"GET http://localhost:8080/questions?title=Reverse%20a%20String&sortField=id&sortValue=desc"
64+
"GET http://localhost:8080/questions?complexity=easy,medium&sortField=id&sortValue=asc"
65+
"GET http://localhost:8080/questions?complexity=easy,medium&sortField=id&sortValue=desc"
66+
"GET http://localhost:8080/questions?categories=Algorithms,Data%20Structures&sortField=id&sortValue=asc"
67+
"GET http://localhost:8080/questions?categories=Algorithms,Data%20Structures&sortField=id&sortValue=desc"
68+
"GET http://localhost:8080/questions?categories=Algorithms,Data%20Structures&complexity=easy,medium&sortField=id&sortValue=asc"
69+
"GET http://localhost:8080/questions?categories=Algorithms,Data%20Structures&complexity=easy,medium&sortField=id&sortValue=desc"
70+
"GET http://localhost:8080/questions?categories=Algorithms,Strings&title=Reverse%20a%20String&sortField=id&sortValue=asc"
71+
"GET http://localhost:8080/questions?categories=Algorithms,Strings&title=Reverse%20a%20String&sortField=id&sortValue=desc"
72+
"GET http://localhost:8080/questions?complexity=easy,medium&title=Reverse%20a%20String&sortField=id&sortValue=asc"
73+
"GET http://localhost:8080/questions?complexity=easy,medium&title=Reverse%20a%20String&sortField=id&sortValue=desc"
74+
"GET http://localhost:8080/questions?complexity=easy,medium&title=Reverse%20a%20String&categories=Algorithms,Strings&sortField=id&sortValue=asc"
75+
"GET http://localhost:8080/questions?complexity=easy,medium&title=Reverse%20a%20String&categories=Algorithms,Strings&sortField=id&sortValue=desc"
76+
"GET http://localhost:8080/questions?title=Reverse%20a%20String&sortField=title&sortValue=asc"
77+
"GET http://localhost:8080/questions?title=Reverse%20a%20String&sortField=title&sortValue=desc"
78+
"GET http://localhost:8080/questions?complexity=easy,medium&sortField=title&sortValue=asc"
79+
"GET http://localhost:8080/questions?complexity=easy,medium&sortField=title&sortValue=desc"
80+
"GET http://localhost:8080/questions?categories=Algorithms,Data%20Structures&sortField=title&sortValue=asc"
81+
"GET http://localhost:8080/questions?categories=Algorithms,Data%20Structures&sortField=title&sortValue=desc"
82+
"GET http://localhost:8080/questions?categories=Algorithms,Data%20Structures&complexity=easy,medium&sortField=title&sortValue=asc"
83+
"GET http://localhost:8080/questions?categories=Algorithms,Data%20Structures&complexity=easy,medium&sortField=title&sortValue=desc"
84+
"GET http://localhost:8080/questions?categories=Algorithms,Strings&title=Reverse%20a%20String&sortField=title&sortValue=asc"
85+
"GET http://localhost:8080/questions?categories=Algorithms,Strings&title=Reverse%20a%20String&sortField=title&sortValue=desc"
86+
"GET http://localhost:8080/questions?complexity=easy,medium&title=Reverse%20a%20String&sortField=title&sortValue=asc"
87+
"GET http://localhost:8080/questions?complexity=easy,medium&title=Reverse%20a%20String&sortField=title&sortValue=desc"
88+
"GET http://localhost:8080/questions?complexity=easy,medium&title=Reverse%20a%20String&categories=Algorithms,Strings&sortField=title&sortValue=asc"
89+
"GET http://localhost:8080/questions?complexity=easy,medium&title=Reverse%20a%20String&categories=Algorithms,Strings&sortField=title&sortValue=desc"
90+
"GET http://localhost:8080/questions?complexity=InvalidComplexity"
91+
"GET http://localhost:8080/questions?InvalidFilterField=InvalidComplexity"
92+
"GET http://localhost:8080/questions?sortField=InvalidSortField&sortValue=asc"
93+
"GET http://localhost:8080/questions?sortField=complexity&&sortValue=InvalidSortValue"
94+
)
95+
96+
# Execute each request and save the output to the file
97+
for request in "${requests[@]}"; do
98+
method=$(echo $request | cut -d' ' -f1)
99+
url=$(echo $request | cut -d' ' -f2)
100+
echo "Executing: $request" >> "$output_file"
101+
echo "Response:" >> "$output_file"
102+
curl -s -X $method "$url" >> "$output_file"
103+
echo -e "\n" >> "$output_file"
104+
done
105+
106+
echo "All requests executed. Results saved in $output_file."
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
#!/bin/bash
2+
3+
# Output file
4+
output_file="test_update_api_results.txt"
5+
6+
> "$output_file"
7+
8+
docRefID="VlnxEsVxduJPhkCU9zQq"
9+
10+
# List of curl commands (formatted properly)
11+
requests=(
12+
# Successful case
13+
"curl -X PUT http://localhost:8080/questions/$docRefID \
14+
-H 'Content-Type: application/json' \
15+
-d '{\"title\": \"Sample Question\", \"description\": \"This is a sample description.\", \"complexity\": \"medium\", \"categories\": [\"Data Structures\", \"Algorithms\"]}'"
16+
17+
# Missing question
18+
"curl -X PUT http://localhost:8080/questions/$docRefID \
19+
-H 'Content-Type: application/json' \
20+
-d '{\"description\": \"This is a sample description.\", \"complexity\": \"medium\", \"categories\": [\"Data Structures\", \"Algorithms\"]}'"
21+
22+
# Missing description
23+
"curl -X PUT http://localhost:8080/questions/$docRefID \
24+
-H 'Content-Type: application/json' \
25+
-d '{\"title\": \"Sample Question 1\", \"complexity\": \"medium\", \"categories\": [\"Data Structures\", \"Algorithms\"]}'"
26+
27+
# Missing complexity
28+
"curl -X PUT http://localhost:8080/questions/$docRefID \
29+
-H 'Content-Type: application/json' \
30+
-d '{\"title\": \"Sample Question 2\", \"description\": \"This is a sample description.\", \"categories\": [\"Data Structures\", \"Algorithms\"]}'"
31+
32+
# Missing categories
33+
"curl -X PUT http://localhost:8080/questions/$docRefID \
34+
-H 'Content-Type: application/json' \
35+
-d '{\"title\": \"Sample Question 3\", \"description\": \"This is a sample description.\", \"complexity\": \"medium\"}'"
36+
37+
# Invalid complexity
38+
"curl -X PUT http://localhost:8080/questions/$docRefID \
39+
-H 'Content-Type: application/json' \
40+
-d '{\"title\": \"Sample Question 4\", \"description\": \"This is a sample description.\", \"complexity\": \"extreme\", \"categories\": [\"Data Structures\", \"Algorithms\"]}'"
41+
42+
# Duplicate question title
43+
"curl -X PUT http://localhost:8080/questions/$docRefID \
44+
-H 'Content-Type: application/json' \
45+
-d '{\"title\": \"Sample Question\", \"description\": \"This is a sample description.\", \"complexity\": \"medium\", \"categories\": [\"Data Structures\", \"Algorithms\"]}'"
46+
47+
# Incorrect JSON
48+
"curl -X PUT http://localhost:8080/questions/$docRefID \
49+
-H 'Content-Type: application/json' \
50+
-d '{\"title\": \"Sample Question\", \"description\": \"This is a sample description.\", \"complexity\": \"medium\", \"categories\": [\"Data Structures\", \"Algorithms\"}'"
51+
)
52+
53+
# Execute each request and save the output to the file
54+
for request in "${requests[@]}"; do
55+
echo "Executing: $request" >> "$output_file"
56+
echo "Response:" >> "$output_file"
57+
eval $request >> "$output_file"
58+
echo -e "\n" >> "$output_file"
59+
done
60+
61+
echo "All requests executed. Results saved in $output_file."

0 commit comments

Comments
 (0)