@@ -10,6 +10,7 @@ import (
1010
1111 "github.com/gophish/gophish/config"
1212 "github.com/gophish/gophish/models"
13+ "github.com/stretchr/testify/assert"
1314)
1415
1516type testContext struct {
@@ -112,3 +113,81 @@ func TestSiteImportBaseHref(t *testing.T) {
112113 t .Fatalf ("unexpected response received. expected %s got %s" , expected , cs .HTML )
113114 }
114115}
116+
117+ func TestResendCampaign (t * testing.T ) {
118+ ctx := setupTest (t )
119+ createTestData (t )
120+
121+ t .Run ("Test ResendAll Success" , func (t * testing.T ) {
122+ req := httptest .NewRequest (http .MethodPost , "/api/campaigns/1/resendall" , nil )
123+ req .Header .Set ("Authorization" , "Bearer " + ctx .apiKey )
124+
125+ rr := httptest .NewRecorder ()
126+ ctx .apiServer .ServeHTTP (rr , req )
127+
128+ assert .Equal (t , http .StatusOK , rr .Code )
129+ count , _ := models .CountMailLogs (1 )
130+ assert .Equal (t , int64 (4 ), count , "Expected 4 total mail logs after resend" )
131+ })
132+
133+ t .Run ("Test ResendAll Authorization Failure" , func (t * testing.T ) {
134+ otherUser := models.User {Username : "other" , Role : models.Role {Name : models .RoleUser }}
135+ models .PutUser (& otherUser )
136+ otherCampaign := models.Campaign {Name : "Other Campaign" , UserId : otherUser .Id }
137+ models .PostCampaign (& otherCampaign , otherUser .Id )
138+
139+ req := httptest .NewRequest (http .MethodPost , fmt .Sprintf ("/api/campaigns/%d/resendall" , otherCampaign .Id ), nil )
140+ req .Header .Set ("Authorization" , "Bearer " + ctx .apiKey )
141+
142+ rr := httptest .NewRecorder ()
143+ ctx .apiServer .ServeHTTP (rr , req )
144+
145+ assert .Equal (t , http .StatusNotFound , rr .Code )
146+ })
147+ }
148+
149+ func TestResendResult (t * testing.T ) {
150+ ctx := setupTest (t )
151+ createTestData (t )
152+
153+ t .Run ("Test Resend Single Result Success" , func (t * testing.T ) {
154+ // Get the first result from our test campaign to use its correct public RId
155+ result , err := models .GetFirstResultForCampaign (1 )
156+ assert .NoError (t , err )
157+
158+ // Use the correct result.RId in the URL
159+ req := httptest .NewRequest (http .MethodPost , fmt .Sprintf ("/api/results/%s/resend" , result .RId ), nil )
160+ req .Header .Set ("Authorization" , "Bearer " + ctx .apiKey )
161+
162+ rr := httptest .NewRecorder ()
163+ ctx .apiServer .ServeHTTP (rr , req )
164+
165+ assert .Equal (t , http .StatusOK , rr .Code , "Expected Status OK" )
166+
167+ count , _ := models .CountMailLogs (1 )
168+ assert .Equal (t , int64 (3 ), count , "Expected 3 total mail logs after single resend" )
169+ })
170+
171+ t .Run ("Test Resend Single Result Authorization Failure" , func (t * testing.T ) {
172+ // Create a new, non-admin user
173+ regularUser := models.User {Username : "testuser" , Role : models.Role {Name : models .RoleUser }}
174+ models .PutUser (& regularUser )
175+
176+ // FIX: We must reload the user from the database to get the generated API key.
177+ reloadedUser , err := models .GetUser (regularUser .Id )
178+ assert .NoError (t , err )
179+
180+ // The admin (ctx.admin) owns campaign 1, which was created by createTestData()
181+ resultToTest , _ := models .GetFirstResultForCampaign (1 )
182+
183+ // Now, we make the API call AS the new regularUser by using their reloaded API key.
184+ req := httptest .NewRequest (http .MethodPost , fmt .Sprintf ("/api/results/%s/resend" , resultToTest .RId ), nil )
185+ req .Header .Set ("Authorization" , "Bearer " + reloadedUser .ApiKey )
186+
187+ rr := httptest .NewRecorder ()
188+ ctx .apiServer .ServeHTTP (rr , req )
189+
190+ // The permission check should now fail correctly, giving us the 401 error we expect.
191+ assert .Equal (t , http .StatusUnauthorized , rr .Code )
192+ })
193+ }
0 commit comments