Skip to content

Commit 62bef8a

Browse files
authored
Merge pull request #12 from maniac-en/mudassir/endpoints
chore: addeds logs and tests
2 parents e2a3424 + 08e4c38 commit 62bef8a

File tree

5 files changed

+378
-31
lines changed

5 files changed

+378
-31
lines changed

db/queries/collections.sql

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,3 +13,7 @@ RETURNING *;
1313
-- name: DeleteCollection :exec
1414
DELETE FROM collections
1515
WHERE id = ?;
16+
17+
-- name: GetCollection :one
18+
SELECT * FROM collections
19+
WHERE id = ?;

internal/collections/collections.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ func (c *CollectionsManager) GetAllCollections(ctx context.Context) ([]database.
2828
}
2929

3030
func (c *CollectionsManager) CreateCollection(ctx context.Context, name string) (database.Collection, error) {
31-
if err := validateCollectionName(name); err != nil {
31+
if err := validateName(name); err != nil {
3232
log.Error("invalid collection name", "name", name, "error", err)
3333
return database.Collection{}, err
3434
}
@@ -44,7 +44,7 @@ func (c *CollectionsManager) CreateCollection(ctx context.Context, name string)
4444
}
4545

4646
func (c *CollectionsManager) UpdateCollectionName(ctx context.Context, name string, collectionId int) (database.Collection, error) {
47-
if err := validateCollectionName(name); err != nil {
47+
if err := validateName(name); err != nil {
4848
log.Error("invalid collection name", "name", name, "error", err)
4949
return database.Collection{}, err
5050
}
@@ -74,7 +74,7 @@ func (c *CollectionsManager) DeleteCollection(ctx context.Context, id int) error
7474
return nil
7575
}
7676

77-
func validateCollectionName(name string) error {
77+
func validateName(name string) error {
7878
name = strings.TrimSpace(name)
7979
if name == "" {
8080
return fmt.Errorf("collection name cannot be empty")
Lines changed: 273 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,273 @@
1+
package collections_test
2+
3+
import (
4+
"context"
5+
"database/sql"
6+
"os"
7+
"testing"
8+
9+
"github.com/maniac-en/req/internal/collections"
10+
"github.com/maniac-en/req/internal/database"
11+
_ "github.com/mattn/go-sqlite3"
12+
)
13+
14+
func setupTestDB(t *testing.T) (*sql.DB, *database.Queries, func()) {
15+
t.Helper()
16+
17+
db, err := sql.Open("sqlite3", ":memory:")
18+
if err != nil {
19+
t.Fatalf("failed to open test db: %v", err)
20+
}
21+
22+
schema, err := os.ReadFile("testdata/schema.sql")
23+
if err != nil {
24+
t.Fatalf("failed to read schema: %v", err)
25+
}
26+
_, err = db.Exec(string(schema))
27+
if err != nil {
28+
t.Fatalf("failed to execute schema: %v", err)
29+
}
30+
31+
queries := database.New(db)
32+
33+
cleanup := func() {
34+
db.Close()
35+
}
36+
return db, queries, cleanup
37+
}
38+
39+
func TestCreateCollection(t *testing.T) {
40+
_, queries, cleanup := setupTestDB(t)
41+
defer cleanup()
42+
43+
manager := collections.NewCollectionsManager(queries)
44+
ctx := context.Background()
45+
46+
collection, err := manager.CreateCollection(ctx, "Test Collection")
47+
if err != nil {
48+
t.Fatalf("expected no error, got %v", err)
49+
}
50+
if collection.Name != "Test Collection" {
51+
t.Errorf("expected name to be 'Test Collection', got %s", collection.Name)
52+
}
53+
}
54+
55+
func TestCreateCollection_Validation(t *testing.T) {
56+
_, queries, cleanup := setupTestDB(t)
57+
defer cleanup()
58+
manager := collections.NewCollectionsManager(queries)
59+
ctx := context.Background()
60+
61+
_, err := manager.CreateCollection(ctx, "")
62+
if err == nil {
63+
t.Errorf("expected error for empty name")
64+
}
65+
66+
longName := make([]byte, 101)
67+
for i := range longName {
68+
longName[i] = 'a'
69+
}
70+
_, err = manager.CreateCollection(ctx, string(longName))
71+
if err == nil {
72+
t.Errorf("expected error for long name")
73+
}
74+
75+
_, err = manager.CreateCollection(ctx, "Invalid/Name")
76+
if err == nil {
77+
t.Errorf("expected error for invalid characters")
78+
}
79+
}
80+
81+
func TestUpdateCollectionName(t *testing.T) {
82+
_, queries, cleanup := setupTestDB(t)
83+
defer cleanup()
84+
manager := collections.NewCollectionsManager(queries)
85+
ctx := context.Background()
86+
87+
collection, _ := manager.CreateCollection(ctx, "Old Name")
88+
updated, err := manager.UpdateCollectionName(ctx, "New Name", int(collection.ID))
89+
if err != nil {
90+
t.Fatalf("update failed: %v", err)
91+
}
92+
if updated.Name != "New Name" {
93+
t.Errorf("expected name to be 'New Name', got %s", updated.Name)
94+
}
95+
}
96+
97+
func TestDeleteCollection(t *testing.T) {
98+
_, queries, cleanup := setupTestDB(t)
99+
defer cleanup()
100+
manager := collections.NewCollectionsManager(queries)
101+
ctx := context.Background()
102+
103+
collection, _ := manager.CreateCollection(ctx, "ToDelete")
104+
err := manager.DeleteCollection(ctx, int(collection.ID))
105+
if err != nil {
106+
t.Fatalf("expected no error, got %v", err)
107+
}
108+
109+
collections, _ := manager.GetAllCollections(ctx)
110+
if len(collections) != 0 {
111+
t.Errorf("expected 0 collections after delete")
112+
}
113+
}
114+
115+
func TestGetAllCollections(t *testing.T) {
116+
_, queries, cleanup := setupTestDB(t)
117+
defer cleanup()
118+
manager := collections.NewCollectionsManager(queries)
119+
ctx := context.Background()
120+
121+
manager.CreateCollection(ctx, "One")
122+
manager.CreateCollection(ctx, "Two")
123+
124+
all, err := manager.GetAllCollections(ctx)
125+
if err != nil {
126+
t.Fatalf("expected no error, got %v", err)
127+
}
128+
if len(all) != 2 {
129+
t.Errorf("expected 2 collections, got %d", len(all))
130+
}
131+
}
132+
133+
func TestCreateEndpoint(t *testing.T) {
134+
_, queries, cleanup := setupTestDB(t)
135+
defer cleanup()
136+
manager := collections.NewCollectionsManager(queries)
137+
ctx := context.Background()
138+
139+
collection, _ := manager.CreateCollection(ctx, "API Group")
140+
endpoint, err := manager.CreateEndpoint(ctx, "Get Users", "GET", "/users", collection.ID)
141+
if err != nil {
142+
t.Fatalf("endpoint creation failed: %v", err)
143+
}
144+
if endpoint.Name != "Get Users" {
145+
t.Errorf("expected endpoint name 'Get Users', got %s", endpoint.Name)
146+
}
147+
}
148+
149+
func TestUpdateEndpoint(t *testing.T) {
150+
_, queries, cleanup := setupTestDB(t)
151+
defer cleanup()
152+
manager := collections.NewCollectionsManager(queries)
153+
ctx := context.Background()
154+
155+
collection, _ := manager.CreateCollection(ctx, "Test")
156+
ep, _ := manager.CreateEndpoint(ctx, "Original", "GET", "/", collection.ID)
157+
158+
updated, err := manager.UpdateEndpoint(ctx, ep.ID, "Updated", "POST", "/new", "hdr", "q", "body")
159+
if err != nil {
160+
t.Fatalf("update failed: %v", err)
161+
}
162+
if updated.Method != "POST" || updated.Url != "/new" {
163+
t.Errorf("update did not apply correctly")
164+
}
165+
}
166+
167+
func TestGetEndpoint(t *testing.T) {
168+
_, queries, cleanup := setupTestDB(t)
169+
defer cleanup()
170+
manager := collections.NewCollectionsManager(queries)
171+
ctx := context.Background()
172+
173+
collection, _ := manager.CreateCollection(ctx, "Test")
174+
ep, _ := manager.CreateEndpoint(ctx, "TestEp", "GET", "/test", collection.ID)
175+
fetched, err := manager.GetEndpoint(ctx, ep.ID)
176+
if err != nil {
177+
t.Fatalf("failed to fetch: %v", err)
178+
}
179+
if fetched.ID != ep.ID {
180+
t.Errorf("expected ID %d, got %d", ep.ID, fetched.ID)
181+
}
182+
}
183+
184+
func TestGetEndpoints(t *testing.T) {
185+
_, queries, cleanup := setupTestDB(t)
186+
defer cleanup()
187+
manager := collections.NewCollectionsManager(queries)
188+
ctx := context.Background()
189+
190+
collection, _ := manager.CreateCollection(ctx, "Batch")
191+
manager.CreateEndpoint(ctx, "One", "GET", "/1", collection.ID)
192+
manager.CreateEndpoint(ctx, "Two", "GET", "/2", collection.ID)
193+
194+
eps, err := manager.GetEndpoints(ctx, collection.ID)
195+
if err != nil {
196+
t.Fatalf("expected no error: %v", err)
197+
}
198+
if len(eps) != 2 {
199+
t.Errorf("expected 2 endpoints, got %d", len(eps))
200+
}
201+
}
202+
203+
func TestCreateEndpoint_InvalidCollectionID(t *testing.T) {
204+
_, queries, cleanup := setupTestDB(t)
205+
defer cleanup()
206+
manager := collections.NewCollectionsManager(queries)
207+
ctx := context.Background()
208+
209+
_, err := manager.CreateEndpoint(ctx, "Name", "GET", "/url", 999)
210+
if err == nil {
211+
t.Errorf("expected error for invalid collection ID")
212+
}
213+
}
214+
215+
func TestUpdateEndpoint_NonExistent(t *testing.T) {
216+
_, queries, cleanup := setupTestDB(t)
217+
defer cleanup()
218+
manager := collections.NewCollectionsManager(queries)
219+
ctx := context.Background()
220+
221+
_, err := manager.UpdateEndpoint(ctx, 999, "Updated", "POST", "/new", "hdr", "q", "body")
222+
if err == nil {
223+
t.Errorf("expected error for non-existent endpoint")
224+
}
225+
}
226+
227+
func TestGetEndpoint_NotFound(t *testing.T) {
228+
_, queries, cleanup := setupTestDB(t)
229+
defer cleanup()
230+
manager := collections.NewCollectionsManager(queries)
231+
ctx := context.Background()
232+
233+
_, err := manager.GetEndpoint(ctx, 999)
234+
if err == nil {
235+
t.Errorf("expected error for non-existent endpoint")
236+
}
237+
}
238+
239+
func newBrokenTestDB(t *testing.T) *database.Queries {
240+
db, err := sql.Open("sqlite3", ":memory:")
241+
if err != nil {
242+
t.Fatalf("failed to open sqlite memory db: %v", err)
243+
}
244+
db.Close()
245+
return database.New(db)
246+
}
247+
248+
func TestGetEndpoints_DBError(t *testing.T) {
249+
db := newBrokenTestDB(t)
250+
251+
manager := collections.NewCollectionsManager(db)
252+
ctx := context.Background()
253+
254+
_, err := manager.GetEndpoints(ctx, 999)
255+
256+
if err == nil {
257+
t.Fatal("expected error, got nil")
258+
}
259+
260+
t.Logf("got expected error: %v", err)
261+
}
262+
263+
func TestDeleteCollection_InvalidID(t *testing.T) {
264+
_, queries, cleanup := setupTestDB(t)
265+
defer cleanup()
266+
manager := collections.NewCollectionsManager(queries)
267+
ctx := context.Background()
268+
269+
err := manager.DeleteCollection(ctx, 999)
270+
if err != nil {
271+
t.Logf("received expected delete error: %v", err)
272+
}
273+
}

0 commit comments

Comments
 (0)