88 "net/http/httptest"
99 "reflect"
1010 "testing"
11+ "time"
1112
13+ "github.com/golang-jwt/jwt/v5"
1214 "infolinks-backend/internal/errs"
1315 "infolinks-backend/internal/models"
1416)
@@ -38,9 +40,24 @@ func (f *fakePageViewService) List(ctx context.Context) ([]models.PageView, erro
3840}
3941
4042func TestHandlePostPageView (t * testing.T ) {
43+ h := testHandler (t )
44+ validAdminToken := signTestToken (t , h .jwtSecret , jwt.MapClaims {
45+ "admin" : true ,
46+ "exp" : time .Now ().Add (time .Hour ).Unix (),
47+ })
48+ nonAdminToken := signTestToken (t , h .jwtSecret , jwt.MapClaims {
49+ "admin" : false ,
50+ "exp" : time .Now ().Add (time .Hour ).Unix (),
51+ })
52+ expiredAdminToken := signTestToken (t , h .jwtSecret , jwt.MapClaims {
53+ "admin" : true ,
54+ "exp" : time .Now ().Add (- time .Hour ).Unix (),
55+ })
56+
4157 tests := []struct {
4258 name string
4359 body string
60+ authHeader string
4461 createErr error
4562 statusWanted int
4663 errMsg string
@@ -54,6 +71,37 @@ func TestHandlePostPageView(t *testing.T) {
5471 wantCalls : 1 ,
5572 resultWanted : & models.PageView {Page : "home" },
5673 },
74+ {
75+ name : "204 skips insert for valid admin bearer token" ,
76+ body : `{"page":"home"}` ,
77+ authHeader : "Bearer " + validAdminToken ,
78+ statusWanted : http .StatusNoContent ,
79+ wantCalls : 0 ,
80+ },
81+ {
82+ name : "201 records visit when admin token is expired" ,
83+ body : `{"page":"home"}` ,
84+ authHeader : "Bearer " + expiredAdminToken ,
85+ statusWanted : http .StatusCreated ,
86+ wantCalls : 1 ,
87+ resultWanted : & models.PageView {Page : "home" },
88+ },
89+ {
90+ name : "201 records visit when token is not admin" ,
91+ body : `{"page":"home"}` ,
92+ authHeader : "Bearer " + nonAdminToken ,
93+ statusWanted : http .StatusCreated ,
94+ wantCalls : 1 ,
95+ resultWanted : & models.PageView {Page : "home" },
96+ },
97+ {
98+ name : "201 records visit when bearer token is invalid" ,
99+ body : `{"page":"home"}` ,
100+ authHeader : "Bearer not-a-jwt" ,
101+ statusWanted : http .StatusCreated ,
102+ wantCalls : 1 ,
103+ resultWanted : & models.PageView {Page : "home" },
104+ },
57105 {
58106 name : "400 invalid JSON body" ,
59107 body : `{` ,
@@ -76,6 +124,9 @@ func TestHandlePostPageView(t *testing.T) {
76124 h := testHandler (t , withPageView (fake ))
77125 req := httptest .NewRequest (http .MethodPost , "/api/page_views" , bytes .NewBufferString (tt .body ))
78126 req .Header .Set ("Content-Type" , "application/json" )
127+ if tt .authHeader != "" {
128+ req .Header .Set ("Authorization" , tt .authHeader )
129+ }
79130 rr := httptest .NewRecorder ()
80131
81132 h .handlePostPageView (rr , req )
@@ -84,6 +135,16 @@ func TestHandlePostPageView(t *testing.T) {
84135 t .Fatalf ("status: got %d want %d body=%q" , rr .Code , tt .statusWanted , rr .Body .String ())
85136 }
86137
138+ if tt .statusWanted == http .StatusNoContent {
139+ if fake .createCalls != tt .wantCalls {
140+ t .Fatalf ("service.Create calls: got %d want %d" , fake .createCalls , tt .wantCalls )
141+ }
142+ if rr .Body .Len () != 0 {
143+ t .Fatalf ("expected empty body, got %q" , rr .Body .String ())
144+ }
145+ return
146+ }
147+
87148 if tt .statusWanted != http .StatusCreated {
88149 var got map [string ]string
89150 if err := json .NewDecoder (rr .Body ).Decode (& got ); err != nil {
0 commit comments