@@ -4,19 +4,21 @@ import (
44 "backend/internal/api/request"
55 "backend/internal/db"
66 "context"
7+ "errors"
78 "io"
89 "log/slog"
910 "net/http"
1011 "net/http/httptest"
1112 "strings"
1213 "testing"
14+
15+ clerk "github.com/clerk/clerk-sdk-go/v2"
1316 "github.com/stretchr/testify/assert"
1417 "github.com/stretchr/testify/mock"
1518)
1619
1720type MockService struct {
1821 mock.Mock
19-
2022}
2123
2224func (m * MockService ) GetNoteById (ctx context.Context , noteID int ) (db.Note , error ) {
@@ -44,6 +46,13 @@ func (m *MockService) CreateNote(ctx context.Context, clerkid string) (int, erro
4446 return args .Int (0 ), args .Error (1 )
4547}
4648
49+ func authenticatedRequest (req * http.Request , userID string ) * http.Request {
50+ claims := & clerk.SessionClaims {}
51+ claims .Subject = userID
52+ ctx := clerk .ContextWithSessionClaims (req .Context (), claims )
53+ return req .WithContext (ctx )
54+ }
55+
4756func TestNoteHandler (t * testing.T ) {
4857 mockService := new (MockService )
4958
@@ -52,8 +61,8 @@ func TestNoteHandler(t *testing.T) {
5261 Return (db.Note {ID : 1 }, nil )
5362
5463 handler := Handler {Service : mockService ,
55- Logger : slog .New (slog .NewTextHandler (io .Discard ,nil )),
56- }
64+ Logger : slog .New (slog .NewTextHandler (io .Discard , nil )),
65+ }
5766
5867 req := httptest .NewRequest (http .MethodGet , "/notes/1" , nil )
5968 w := httptest .NewRecorder ()
@@ -72,8 +81,8 @@ func TestNoteListHandler(t *testing.T) {
7281 Return ([]db.Note {}, nil )
7382
7483 handler := Handler {Service : mockService ,
75- Logger : slog .New (slog .NewTextHandler (io .Discard ,nil )),
76- }
84+ Logger : slog .New (slog .NewTextHandler (io .Discard , nil )),
85+ }
7786
7887 req := httptest .NewRequest (http .MethodGet , "/notes" , nil )
7988 w := httptest .NewRecorder ()
@@ -92,34 +101,114 @@ func TestUpdateNoteHandler(t *testing.T) {
92101 Return (nil )
93102
94103 handler := Handler {Service : mockService ,
104+ Logger : slog .New (slog .NewTextHandler (io .Discard , nil )),
105+ }
106+
107+ body := `{"title":"test","content":{}}`
108+ req := httptest .NewRequest (http .MethodPatch , "/notes/1" , strings .NewReader (body ))
109+ w := httptest .NewRecorder ()
110+ req .Header .Set ("Content-Type" , "application/json" )
111+
112+ handler .UpdateNoteHandler (w , req )
95113
96- Logger : slog .New (slog .NewTextHandler (io .Discard ,nil )),
114+ assert .Equal (t , http .StatusOK , w .Code )
115+ mockService .AssertExpectations (t )
97116}
98117
99- body := `{"title":"test","content":{}}`
100- req := httptest .NewRequest (http .MethodPatch , "/notes/1" ,
101- strings .NewReader (body ))
118+ func TestUpdateNoteHandlerRejectsInvalidJSON (t * testing.T ) {
119+ mockService := new (MockService )
120+ handler := Handler {Service : mockService ,
121+ Logger : slog .New (slog .NewTextHandler (io .Discard , nil )),
122+ }
102123
124+ req := httptest .NewRequest (http .MethodPatch , "/notes/1" , strings .NewReader (`{"title":` ))
125+ w := httptest .NewRecorder ()
103126 req .Header .Set ("Content-Type" , "application/json" )
127+
128+ handler .UpdateNoteHandler (w , req )
129+
130+ assert .Equal (t , http .StatusBadRequest , w .Code )
131+ mockService .AssertNotCalled (t , "UpdateNodeById" , mock .Anything , mock .Anything , mock .Anything )
132+ }
133+
134+ func TestUpdateNoteHandlerReturnsInternalServerErrorOnUpdateFailure (t * testing.T ) {
135+ mockService := new (MockService )
136+ mockService .
137+ On ("UpdateNodeById" , mock .Anything , mock .Anything , 1 ).
138+ Return (errors .New ("update failed" ))
139+
140+ handler := Handler {Service : mockService ,
141+ Logger : slog .New (slog .NewTextHandler (io .Discard , nil )),
142+ }
143+
144+ body := `{"title":"test","content":{}}`
145+ req := httptest .NewRequest (http .MethodPatch , "/notes/1" , strings .NewReader (body ))
104146 w := httptest .NewRecorder ()
147+ req .Header .Set ("Content-Type" , "application/json" )
105148
106149 handler .UpdateNoteHandler (w , req )
107150
151+ assert .Equal (t , http .StatusInternalServerError , w .Code )
108152 mockService .AssertExpectations (t )
109153}
110154
111- func TestDelNoteHandler (t * testing.T ) {
155+ func TestImportNotesHandlerRejectsInvalidJSONBeforeCreate (t * testing.T ) {
112156 mockService := new (MockService )
157+ handler := Handler {Service : mockService ,
158+ Logger : slog .New (slog .NewTextHandler (io .Discard , nil )),
159+ }
160+
161+ req := httptest .NewRequest (http .MethodPost , "/notes/imports" , strings .NewReader (`{"title":` ))
162+ req = authenticatedRequest (req , "user_123" )
163+ req .Header .Set ("Content-Type" , "application/json" )
164+ w := httptest .NewRecorder ()
165+
166+ handler .ImportNotesHandler (w , req )
167+
168+ assert .Equal (t , http .StatusBadRequest , w .Code )
169+ mockService .AssertNotCalled (t , "CreateNote" , mock .Anything , mock .Anything )
170+ mockService .AssertNotCalled (t , "UpdateNodeById" , mock .Anything , mock .Anything , mock .Anything )
171+ mockService .AssertNotCalled (t , "DelNoteById" , mock .Anything , mock .Anything )
172+ }
113173
174+ func TestImportNotesHandlerDeletesCreatedNoteOnUpdateFailure (t * testing.T ) {
175+ mockService := new (MockService )
114176 mockService .
115- On ("DelNoteById" , mock .Anything , 1 ).
177+ On ("CreateNote" , mock .Anything , "user_123" ).
178+ Return (42 , nil )
179+ mockService .
180+ On ("UpdateNodeById" , mock .Anything , mock .Anything , 42 ).
181+ Return (errors .New ("update failed" ))
182+ mockService .
183+ On ("DelNoteById" , mock .Anything , 42 ).
116184 Return (nil )
117185
118-
119186 handler := Handler {Service : mockService ,
120- Logger : slog .New (slog .NewTextHandler (io .Discard ,nil )),
187+ Logger : slog .New (slog .NewTextHandler (io .Discard , nil )),
188+ }
189+
190+ body := `{"title":"test","content":{}}`
191+ req := httptest .NewRequest (http .MethodPost , "/notes/imports" , strings .NewReader (body ))
192+ req = authenticatedRequest (req , "user_123" )
193+ req .Header .Set ("Content-Type" , "application/json" )
194+ w := httptest .NewRecorder ()
195+
196+ handler .ImportNotesHandler (w , req )
197+
198+ assert .Equal (t , http .StatusInternalServerError , w .Code )
199+ mockService .AssertExpectations (t )
121200}
122201
202+ func TestDelNoteHandler (t * testing.T ) {
203+ mockService := new (MockService )
204+
205+ mockService .
206+ On ("DelNoteById" , mock .Anything , 1 ).
207+ Return (nil )
208+
209+ handler := Handler {Service : mockService ,
210+ Logger : slog .New (slog .NewTextHandler (io .Discard , nil )),
211+ }
123212
124213 req := httptest .NewRequest (http .MethodDelete , "/notes/1" , nil )
125214 w := httptest .NewRecorder ()
@@ -128,5 +217,3 @@ func TestDelNoteHandler(t *testing.T) {
128217
129218 mockService .AssertExpectations (t )
130219}
131-
132-
0 commit comments