1
0
Fork 0

test(server): repeating slug in test caused race conditions: segfault: nil ptr dereference

This commit is contained in:
Vojtěch Mareš 2024-06-27 19:20:40 +02:00
parent f2bab62e08
commit 0c9cbc9d7a
Signed by: vojtech.mares
GPG key ID: C6827B976F17240D

View file

@ -89,7 +89,7 @@ func TestServer(t *testing.T) {
t.Run("Add training", func(t *testing.T) { t.Run("Add training", func(t *testing.T) {
newTraining := NewTraining{ newTraining := NewTraining{
Name: "Testing Training", Name: "Testing Training: add",
Description: "This is a test training", Description: "This is a test training",
Days: 1, Days: 1,
Pricing: []TrainingPrice{ Pricing: []TrainingPrice{
@ -118,11 +118,13 @@ func TestServer(t *testing.T) {
slugString := slug.NewString(newTraining.Name) slugString := slug.NewString(newTraining.Name)
rr, _ := doPost(t, app, "/v1/trainings", newTraining) createResp, _ := doPost(t, app, "/v1/trainings", newTraining)
assert.Equal(t, http.StatusCreated, rr.StatusCode) defer func() { _ = createResp.Body.Close() }()
assert.Equal(t, http.StatusCreated, createResp.StatusCode)
var resultTraining Training var resultTraining Training
err := json.NewDecoder(rr.Body).Decode(&resultTraining) err := json.NewDecoder(createResp.Body).Decode(&resultTraining)
assert.NoError(t, err, "error unmarshalling response") assert.NoError(t, err, "error unmarshalling response")
assert.Equal(t, newTraining.Name, resultTraining.Name) assert.Equal(t, newTraining.Name, resultTraining.Name)
assert.Equal(t, slugString, resultTraining.Slug) assert.Equal(t, slugString, resultTraining.Slug)
@ -132,18 +134,49 @@ func TestServer(t *testing.T) {
}) })
t.Run("Training not found", func(t *testing.T) { t.Run("Training not found", func(t *testing.T) {
rr, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d", 9999999)) getResp, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d", 9999999))
assert.Equal(t, http.StatusNotFound, rr.StatusCode) defer func() { _ = getResp.Body.Close() }()
assert.Equal(t, http.StatusNotFound, getResp.StatusCode)
var trainingError NotFoundError var trainingError NotFoundError
err := json.NewDecoder(rr.Body).Decode(&trainingError) err := json.NewDecoder(getResp.Body).Decode(&trainingError)
assert.NoError(t, err, "error getting response", err) assert.NoError(t, err, "error getting response", err)
assert.Equal(t, http.StatusNotFound, trainingError.Status) assert.Equal(t, http.StatusNotFound, trainingError.Status)
}) })
t.Run("Get training by slug", func(t *testing.T) {
tr := &training.Training{
Name: "Testing Training: get with slug",
Description: "This is a test training with slug",
Days: 1,
Pricing: []training.Price{
{
Amount: decimal.NewFromInt(200),
Currency: "EUR",
Type: training.OpenTrainingPrice,
},
},
}
_ = handlers.trainingRepository.Create(tr)
getResp, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/by-slug/%s", tr.Slug))
defer func() { _ = getResp.Body.Close() }()
assert.Equal(t, http.StatusOK, getResp.StatusCode)
var trr Training
err := json.NewDecoder(getResp.Body).Decode(&trr)
assert.NoError(t, err, "error unmarshalling response")
assert.Equal(t, tr.Name, trr.Name)
assert.Equal(t, tr.ID, trr.Id)
assert.Equal(t, tr.Slug, trr.Slug)
})
t.Run("List all trainings", func(t *testing.T) { t.Run("List all trainings", func(t *testing.T) {
tr := &training.Training{ tr := &training.Training{
Name: "Testing Training", Name: "Testing Training: list",
Description: "This is a test training", Description: "This is a test training",
Days: 1, Days: 1,
Pricing: []training.Price{ Pricing: []training.Price{
@ -156,11 +189,11 @@ func TestServer(t *testing.T) {
} }
_ = handlers.trainingRepository.Create(tr) _ = handlers.trainingRepository.Create(tr)
rr, _ := doGet(t, app, "/v1/trainings") getResp, _ := doGet(t, app, "/v1/trainings")
assert.Equal(t, http.StatusOK, rr.StatusCode) assert.Equal(t, http.StatusOK, getResp.StatusCode)
var trainings []Training var trainings []Training
err := json.NewDecoder(rr.Body).Decode(&trainings) err := json.NewDecoder(getResp.Body).Decode(&trainings)
assert.NoError(t, err, "error unmarshalling response") assert.NoError(t, err, "error unmarshalling response")
assert.Greater(t, len(trainings), 0) assert.Greater(t, len(trainings), 0)
@ -174,7 +207,7 @@ func TestServer(t *testing.T) {
t.Run("Update training", func(t *testing.T) { t.Run("Update training", func(t *testing.T) {
tr := &training.Training{ tr := &training.Training{
Name: "Testing Training", Name: "Testing Training: update",
Description: "This is a test training", Description: "This is a test training",
Days: 1, Days: 1,
Pricing: []training.Price{ Pricing: []training.Price{
@ -203,11 +236,13 @@ func TestServer(t *testing.T) {
}, },
} }
rr, _ := doPut(t, app, fmt.Sprintf("/v1/trainings/%d", tr.ID), updTr) updateResp, _ := doPut(t, app, fmt.Sprintf("/v1/trainings/%d", tr.ID), updTr)
assert.Equal(t, http.StatusOK, rr.StatusCode) defer func() { _ = updateResp.Body.Close() }()
assert.Equal(t, http.StatusOK, updateResp.StatusCode)
var trr Training var trr Training
err := json.NewDecoder(rr.Body).Decode(&trr) err := json.NewDecoder(updateResp.Body).Decode(&trr)
assert.NoError(t, err, "error unmarshalling response") assert.NoError(t, err, "error unmarshalling response")
assert.Equal(t, updTr.Name, trr.Name) assert.Equal(t, updTr.Name, trr.Name)
assert.Equal(t, updatedSlug, trr.Slug) assert.Equal(t, updatedSlug, trr.Slug)
@ -215,7 +250,7 @@ func TestServer(t *testing.T) {
t.Run("Delete training", func(t *testing.T) { t.Run("Delete training", func(t *testing.T) {
tr := &training.Training{ tr := &training.Training{
Name: "Testing Training", Name: "Testing Training: delete",
Description: "This is a test training", Description: "This is a test training",
Days: 1, Days: 1,
Pricing: []training.Price{ Pricing: []training.Price{
@ -229,32 +264,35 @@ func TestServer(t *testing.T) {
_ = handlers.trainingRepository.Create(tr) _ = handlers.trainingRepository.Create(tr)
rr, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d", tr.ID)) getResp, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d", tr.ID))
assert.Equal(t, http.StatusOK, rr.StatusCode) defer func() { _ = getResp.Body.Close() }()
assert.Equal(t, http.StatusOK, getResp.StatusCode)
var trr Training var trr Training
err := json.NewDecoder(rr.Body).Decode(&trr) err := json.NewDecoder(getResp.Body).Decode(&trr)
assert.NoError(t, err, "error unmarshalling response") assert.NoError(t, err, "error unmarshalling response")
assert.Equal(t, tr.ID, trr.Id) assert.Equal(t, tr.ID, trr.Id)
drr, _ := doDelete(t, app, fmt.Sprintf("/v1/trainings/%d", tr.ID)) drr, _ := doDelete(t, app, fmt.Sprintf("/v1/trainings/%d", tr.ID))
defer func() { _ = drr.Body.Close() }()
assert.Equal(t, http.StatusNoContent, drr.StatusCode) assert.Equal(t, http.StatusNoContent, drr.StatusCode)
rr, _ = doGet(t, app, fmt.Sprintf("/v1/trainings/%d", tr.ID)) deletedTrainingResp, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d", tr.ID))
assert.Equal(t, http.StatusNotFound, rr.StatusCode) defer func() { _ = deletedTrainingResp.Body.Close() }()
assert.Equal(t, http.StatusNotFound, deletedTrainingResp.StatusCode)
var trainingError NotFoundError var trainingError NotFoundError
err = json.NewDecoder(rr.Body).Decode(&trainingError) err = json.NewDecoder(deletedTrainingResp.Body).Decode(&trainingError)
assert.NoError(t, err, "error getting response", err) assert.NoError(t, err, "error getting response", err)
assert.Equal(t, http.StatusNotFound, trainingError.Status) assert.Equal(t, http.StatusNotFound, trainingError.Status)
lrr, _ := doGet(t, app, "/v1/trainings")
assert.Equal(t, http.StatusOK, lrr.StatusCode)
}) })
t.Run("Add training date", func(t *testing.T) { t.Run("Add training date", func(t *testing.T) {
tr := &training.Training{ tr := &training.Training{
Name: "Testing Training for training date", Name: "Testing Training: add date",
Description: "This is a test training for training date", Description: "This is a test training for training date",
Days: 1, Days: 1,
Pricing: []training.Price{ Pricing: []training.Price{
@ -285,12 +323,13 @@ func TestServer(t *testing.T) {
}, },
} }
rr, err := doPost(t, app, fmt.Sprintf("/v1/trainings/%d/dates", tr.ID), newTrainingDate) createResp, err := doPost(t, app, fmt.Sprintf("/v1/trainings/%d/dates", tr.ID), newTrainingDate)
defer func() { _ = createResp.Body.Close() }()
assert.Equal(t, http.StatusCreated, rr.StatusCode) assert.Equal(t, http.StatusCreated, createResp.StatusCode)
var resultTrainingDate TrainingDate var resultTrainingDate TrainingDate
err = json.NewDecoder(rr.Body).Decode(&resultTrainingDate) err = json.NewDecoder(createResp.Body).Decode(&resultTrainingDate)
assert.NoError(t, err, "error unmarshalling response") assert.NoError(t, err, "error unmarshalling response")
assert.Equal(t, newTrainingDate.Address, resultTrainingDate.Address) assert.Equal(t, newTrainingDate.Address, resultTrainingDate.Address)
assert.Equal(t, newTrainingDate.Location, resultTrainingDate.Location) assert.Equal(t, newTrainingDate.Location, resultTrainingDate.Location)
@ -304,7 +343,7 @@ func TestServer(t *testing.T) {
t.Run("Training date not found", func(t *testing.T) { t.Run("Training date not found", func(t *testing.T) {
tr := &training.Training{ tr := &training.Training{
Name: "Testing Training for training date", Name: "Testing Training: date not found",
Description: "This is a test training for training date", Description: "This is a test training for training date",
Days: 1, Days: 1,
Pricing: []training.Price{ Pricing: []training.Price{
@ -318,18 +357,20 @@ func TestServer(t *testing.T) {
_ = handlers.trainingRepository.Create(tr) _ = handlers.trainingRepository.Create(tr)
rr, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d", tr.ID, 999999)) getResp, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d", tr.ID, 999999))
assert.Equal(t, http.StatusNotFound, rr.StatusCode) defer func() { _ = getResp.Body.Close() }()
assert.Equal(t, http.StatusNotFound, getResp.StatusCode)
var trainingError NotFoundError var trainingError NotFoundError
err := json.NewDecoder(rr.Body).Decode(&trainingError) err := json.NewDecoder(getResp.Body).Decode(&trainingError)
assert.NoError(t, err, "error getting response", err) assert.NoError(t, err, "error getting response", err)
assert.Equal(t, http.StatusNotFound, trainingError.Status) assert.Equal(t, http.StatusNotFound, trainingError.Status)
}) })
t.Run("List all training dates", func(t *testing.T) { t.Run("List all training dates", func(t *testing.T) {
tr := &training.Training{ tr := &training.Training{
Name: "Testing Training for training date", Name: "Testing Training: list dates",
Description: "This is a test training for training date", Description: "This is a test training for training date",
Days: 1, Days: 1,
Pricing: []training.Price{ Pricing: []training.Price{
@ -362,18 +403,20 @@ func TestServer(t *testing.T) {
_ = handlers.trainingDateRepository.Create(tr.ID, td) _ = handlers.trainingDateRepository.Create(tr.ID, td)
} }
rr, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates", tr.ID)) getResp, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates", tr.ID))
assert.Equal(t, http.StatusOK, rr.StatusCode) defer func() { _ = getResp.Body.Close() }()
assert.Equal(t, http.StatusOK, getResp.StatusCode)
var trainingDates []TrainingDate var trainingDates []TrainingDate
err := json.NewDecoder(rr.Body).Decode(&trainingDates) err := json.NewDecoder(getResp.Body).Decode(&trainingDates)
assert.NoError(t, err, "error unmarshalling response") assert.NoError(t, err, "error unmarshalling response")
assert.Equal(t, len(trainingDates), trainingCount) assert.Equal(t, len(trainingDates), trainingCount)
}) })
t.Run("Update training date", func(t *testing.T) { t.Run("Update training date", func(t *testing.T) {
tr := &training.Training{ tr := &training.Training{
Name: "Testing Training for training date", Name: "Testing Training: update date",
Description: "This is a test training for training date", Description: "This is a test training for training date",
Days: 1, Days: 1,
Pricing: []training.Price{ Pricing: []training.Price{
@ -416,11 +459,13 @@ func TestServer(t *testing.T) {
}, },
} }
rr, _ := doPut(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d", tr.ID, td.ID), updTd) updateResp, _ := doPut(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d", tr.ID, td.ID), updTd)
assert.Equal(t, http.StatusOK, rr.StatusCode) defer func() { _ = updateResp.Body.Close() }()
assert.Equal(t, http.StatusOK, updateResp.StatusCode)
var tdrr TrainingDate var tdrr TrainingDate
err := json.NewDecoder(rr.Body).Decode(&tdrr) err := json.NewDecoder(updateResp.Body).Decode(&tdrr)
assert.NoError(t, err, "error unmarshalling response") assert.NoError(t, err, "error unmarshalling response")
assert.Equal(t, updTd.Address, tdrr.Address) assert.Equal(t, updTd.Address, tdrr.Address)
assert.Equal(t, updTd.Capacity, tdrr.Capacity) assert.Equal(t, updTd.Capacity, tdrr.Capacity)
@ -434,7 +479,7 @@ func TestServer(t *testing.T) {
t.Run("Delete training date", func(t *testing.T) { t.Run("Delete training date", func(t *testing.T) {
tr := &training.Training{ tr := &training.Training{
Name: "Testing Training for training date", Name: "Testing Training: delete date",
Description: "This is a test training for training date", Description: "This is a test training for training date",
Days: 1, Days: 1,
Pricing: []training.Price{ Pricing: []training.Price{
@ -463,26 +508,32 @@ func TestServer(t *testing.T) {
_ = handlers.trainingDateRepository.Create(tr.ID, td) _ = handlers.trainingDateRepository.Create(tr.ID, td)
rr, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d", tr.ID, td.ID)) getResp, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d", tr.ID, td.ID))
assert.Equal(t, http.StatusOK, rr.StatusCode) defer func() { _ = getResp.Body.Close() }()
assert.Equal(t, http.StatusOK, getResp.StatusCode)
var tdrr TrainingDate var tdrr TrainingDate
err := json.NewDecoder(rr.Body).Decode(&tdrr) err := json.NewDecoder(getResp.Body).Decode(&tdrr)
assert.NoError(t, err, "error unmarshalling response") assert.NoError(t, err, "error unmarshalling response")
assert.Equal(t, td.ID, tdrr.Id) assert.Equal(t, td.ID, tdrr.Id)
drr, _ := doDelete(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d", tr.ID, td.ID)) drr, _ := doDelete(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d", tr.ID, td.ID))
defer func() { _ = drr.Body.Close() }()
assert.Equal(t, http.StatusNoContent, drr.StatusCode) assert.Equal(t, http.StatusNoContent, drr.StatusCode)
rr, _ = doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d", tr.ID, td.ID)) deletedTrainingResp, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d", tr.ID, td.ID))
assert.Equal(t, http.StatusNotFound, rr.StatusCode) defer func() { _ = deletedTrainingResp.Body.Close() }()
assert.Equal(t, http.StatusNotFound, deletedTrainingResp.StatusCode)
var trainingError NotFoundError var trainingError NotFoundError
err = json.NewDecoder(rr.Body).Decode(&trainingError) err = json.NewDecoder(deletedTrainingResp.Body).Decode(&trainingError)
assert.NoError(t, err, "error getting response", err) assert.NoError(t, err, "error getting response", err)
assert.Equal(t, http.StatusNotFound, trainingError.Status) assert.Equal(t, http.StatusNotFound, trainingError.Status)
lrr, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates", tr.ID)) lrr, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates", tr.ID))
defer func() { _ = lrr.Body.Close() }()
assert.Equal(t, http.StatusOK, lrr.StatusCode) assert.Equal(t, http.StatusOK, lrr.StatusCode)
var trainingDates []TrainingDate var trainingDates []TrainingDate
@ -493,7 +544,7 @@ func TestServer(t *testing.T) {
t.Run("List upcoming training dates for training", func(t *testing.T) { t.Run("List upcoming training dates for training", func(t *testing.T) {
tr := &training.Training{ tr := &training.Training{
Name: "Testing Training for training date", Name: "Testing Training: list upcoming dates",
Description: "This is a test training for training date", Description: "This is a test training for training date",
Days: 1, Days: 1,
Pricing: []training.Price{ Pricing: []training.Price{
@ -524,18 +575,20 @@ func TestServer(t *testing.T) {
_ = handlers.trainingDateRepository.Create(tr.ID, td) _ = handlers.trainingDateRepository.Create(tr.ID, td)
} }
rr, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/upcoming-dates", tr.ID)) getResp, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/upcoming-dates", tr.ID))
assert.Equal(t, http.StatusOK, rr.StatusCode) defer func() { _ = getResp.Body.Close() }()
assert.Equal(t, http.StatusOK, getResp.StatusCode)
var trainingDatesReturned []TrainingDate var trainingDatesReturned []TrainingDate
err := json.NewDecoder(rr.Body).Decode(&trainingDatesReturned) err := json.NewDecoder(getResp.Body).Decode(&trainingDatesReturned)
assert.NoError(t, err, "error unmarshalling response") assert.NoError(t, err, "error unmarshalling response")
assert.Equal(t, len(trainingDatesReturned), upcomingTrainingCount) assert.Equal(t, len(trainingDatesReturned), upcomingTrainingCount)
}) })
t.Run("List all upcoming training dates", func(t *testing.T) { t.Run("List all upcoming training dates", func(t *testing.T) {
tr1 := &training.Training{ tr1 := &training.Training{
Name: "Testing Training for training date 1", Name: "Testing Training: list dates for training id=1",
Description: "This is a test training for training date", Description: "This is a test training for training date",
Days: 1, Days: 1,
Pricing: []training.Price{ Pricing: []training.Price{
@ -622,11 +675,13 @@ func TestServer(t *testing.T) {
_ = handlers.trainingDateRepository.Create(tr3.ID, td3) _ = handlers.trainingDateRepository.Create(tr3.ID, td3)
} }
rr, _ := doGet(t, app, "/v1/trainings/upcoming-dates") getResp, _ := doGet(t, app, "/v1/trainings/upcoming-dates")
assert.Equal(t, http.StatusOK, rr.StatusCode) defer func() { _ = getResp.Body.Close() }()
assert.Equal(t, http.StatusOK, getResp.StatusCode)
var trainingDatesReturned ListAllUpcomingTrainingDatesResponse var trainingDatesReturned ListAllUpcomingTrainingDatesResponse
err := json.NewDecoder(rr.Body).Decode(&trainingDatesReturned) err := json.NewDecoder(getResp.Body).Decode(&trainingDatesReturned)
assert.NoError(t, err, "error unmarshalling response") assert.NoError(t, err, "error unmarshalling response")
assert.Equal(t, len(allTrainings), len(trainingDatesReturned)) assert.Equal(t, len(allTrainings), len(trainingDatesReturned))
@ -639,7 +694,7 @@ func TestServer(t *testing.T) {
t.Run("Training date attendee not found", func(t *testing.T) { t.Run("Training date attendee not found", func(t *testing.T) {
tr := &training.Training{ tr := &training.Training{
Name: "Testing Training for training date", Name: "Testing Training: attendee not found",
Description: "This is a test training for training date", Description: "This is a test training for training date",
Days: 1, Days: 1,
Pricing: []training.Price{ Pricing: []training.Price{
@ -668,18 +723,20 @@ func TestServer(t *testing.T) {
} }
_ = handlers.trainingDateRepository.Create(tr.ID, td) _ = handlers.trainingDateRepository.Create(tr.ID, td)
rr, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d", tr.ID, td.ID, 99999999)) getResp, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d", tr.ID, td.ID, 99999999))
assert.Equal(t, http.StatusNotFound, rr.StatusCode) defer func() { _ = getResp.Body.Close() }()
assert.Equal(t, http.StatusNotFound, getResp.StatusCode)
var notFound NotFoundError var notFound NotFoundError
err := json.NewDecoder(rr.Body).Decode(&notFound) err := json.NewDecoder(getResp.Body).Decode(&notFound)
assert.NoError(t, err, "error getting response", err) assert.NoError(t, err, "error getting response", err)
assert.Equal(t, http.StatusNotFound, notFound.Status) assert.Equal(t, http.StatusNotFound, notFound.Status)
}) })
t.Run("Add training date attendee", func(t *testing.T) { t.Run("Add training date attendee", func(t *testing.T) {
tr := &training.Training{ tr := &training.Training{
Name: "Testing Training for training date", Name: "Testing Training: add attendee",
Description: "This is a test training for training date", Description: "This is a test training for training date",
Days: 1, Days: 1,
Pricing: []training.Price{ Pricing: []training.Price{
@ -717,11 +774,13 @@ func TestServer(t *testing.T) {
IsStudent: new(bool), IsStudent: new(bool),
} }
rr, _ := doPost(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees", tr.ID, td.ID), newTrainingDateAttendee) createResp, _ := doPost(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees", tr.ID, td.ID), newTrainingDateAttendee)
assert.Equal(t, http.StatusCreated, rr.StatusCode) defer func() { _ = createResp.Body.Close() }()
assert.Equal(t, http.StatusCreated, createResp.StatusCode)
var attendeeResponse TrainingDateAttendee var attendeeResponse TrainingDateAttendee
err := json.NewDecoder(rr.Body).Decode(&attendeeResponse) err := json.NewDecoder(createResp.Body).Decode(&attendeeResponse)
assert.NoError(t, err, "error getting response", err) assert.NoError(t, err, "error getting response", err)
assert.Equal(t, newTrainingDateAttendee.Name, attendeeResponse.Name) assert.Equal(t, newTrainingDateAttendee.Name, attendeeResponse.Name)
assert.Equal(t, newTrainingDateAttendee.Email, attendeeResponse.Email) assert.Equal(t, newTrainingDateAttendee.Email, attendeeResponse.Email)
@ -737,7 +796,7 @@ func TestServer(t *testing.T) {
t.Run("List all training date attendees", func(t *testing.T) { t.Run("List all training date attendees", func(t *testing.T) {
tr := &training.Training{ tr := &training.Training{
Name: "Testing Training for training date", Name: "Testing Training: list attendees",
Description: "This is a test training for training date", Description: "This is a test training for training date",
Days: 1, Days: 1,
Pricing: []training.Price{ Pricing: []training.Price{
@ -785,11 +844,13 @@ func TestServer(t *testing.T) {
attendees[i] = *nAtd attendees[i] = *nAtd
} }
rr, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees", tr.ID, td.ID)) getResp, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees", tr.ID, td.ID))
assert.Equal(t, http.StatusOK, rr.StatusCode) defer func() { _ = getResp.Body.Close() }()
assert.Equal(t, http.StatusOK, getResp.StatusCode)
var attendeesResponse ListTrainingDateAttendeesResponse var attendeesResponse ListTrainingDateAttendeesResponse
err := json.NewDecoder(rr.Body).Decode(&attendeesResponse) err := json.NewDecoder(getResp.Body).Decode(&attendeesResponse)
assert.NoError(t, err, "error getting response", err) assert.NoError(t, err, "error getting response", err)
assert.Equal(t, attendeeCount, len(attendeesResponse)) assert.Equal(t, attendeeCount, len(attendeesResponse))
@ -810,7 +871,7 @@ func TestServer(t *testing.T) {
t.Run("Get training date attendee", func(t *testing.T) { t.Run("Get training date attendee", func(t *testing.T) {
tr := &training.Training{ tr := &training.Training{
Name: "Testing Training for training date", Name: "Test training: get attendee",
Description: "This is a test training for training date", Description: "This is a test training for training date",
Days: 1, Days: 1,
Pricing: []training.Price{ Pricing: []training.Price{
@ -854,10 +915,11 @@ func TestServer(t *testing.T) {
_ = handlers.trainingDateAttendeeRepository.Create(td.ID, attendee) _ = handlers.trainingDateAttendeeRepository.Create(td.ID, attendee)
rr, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d", tr.ID, td.ID, attendee.ID)) getResp, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d", tr.ID, td.ID, attendee.ID))
defer func() { _ = getResp.Body.Close() }()
var resultTrainingDateAttendee TrainingDateAttendee var resultTrainingDateAttendee TrainingDateAttendee
err := json.NewDecoder(rr.Body).Decode(&resultTrainingDateAttendee) err := json.NewDecoder(getResp.Body).Decode(&resultTrainingDateAttendee)
assert.NoError(t, err, "error unmarshalling response") assert.NoError(t, err, "error unmarshalling response")
assert.Equal(t, attendee.Name, resultTrainingDateAttendee.Name) assert.Equal(t, attendee.Name, resultTrainingDateAttendee.Name)
assert.Equal(t, attendee.Email, string(resultTrainingDateAttendee.Email)) assert.Equal(t, attendee.Email, string(resultTrainingDateAttendee.Email))
@ -873,7 +935,7 @@ func TestServer(t *testing.T) {
t.Run("Update training date attendee", func(t *testing.T) { t.Run("Update training date attendee", func(t *testing.T) {
tr := &training.Training{ tr := &training.Training{
Name: "Testing Training for training date", Name: "Testing Training: update attendee",
Description: "This is a test training for training date", Description: "This is a test training for training date",
Days: 1, Days: 1,
Pricing: []training.Price{ Pricing: []training.Price{
@ -926,11 +988,13 @@ func TestServer(t *testing.T) {
IsStudent: new(bool), IsStudent: new(bool),
} }
rr, _ := doPut(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d", tr.ID, td.ID, attendee.ID), newTrainingDateAttendee) updateResp, _ := doPut(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d", tr.ID, td.ID, attendee.ID), newTrainingDateAttendee)
assert.Equal(t, http.StatusOK, rr.StatusCode) defer func() { _ = updateResp.Body.Close() }()
assert.Equal(t, http.StatusOK, updateResp.StatusCode)
var attendeeResponse UpdateTrainingDateAttendeeResponse var attendeeResponse UpdateTrainingDateAttendeeResponse
err := json.NewDecoder(rr.Body).Decode(&attendeeResponse) err := json.NewDecoder(updateResp.Body).Decode(&attendeeResponse)
assert.NoError(t, err, "error getting response", err) assert.NoError(t, err, "error getting response", err)
assert.Equal(t, newTrainingDateAttendee.Name, attendeeResponse.Name) assert.Equal(t, newTrainingDateAttendee.Name, attendeeResponse.Name)
assert.Equal(t, newTrainingDateAttendee.Email, attendeeResponse.Email) assert.Equal(t, newTrainingDateAttendee.Email, attendeeResponse.Email)
@ -946,7 +1010,7 @@ func TestServer(t *testing.T) {
t.Run("Delete training date attendee", func(t *testing.T) { t.Run("Delete training date attendee", func(t *testing.T) {
tr := &training.Training{ tr := &training.Training{
Name: "Testing Training for training date", Name: "Testing Training: delete attendee",
Description: "This is a test training for training date", Description: "This is a test training for training date",
Days: 1, Days: 1,
Pricing: []training.Price{ Pricing: []training.Price{
@ -991,13 +1055,19 @@ func TestServer(t *testing.T) {
_ = handlers.trainingDateAttendeeRepository.Create(td.ID, attendee) _ = handlers.trainingDateAttendeeRepository.Create(td.ID, attendee)
rr, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d", tr.ID, td.ID, attendee.ID)) rr, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d", tr.ID, td.ID, attendee.ID))
defer func() { _ = rr.Body.Close() }()
assert.Equal(t, http.StatusOK, rr.StatusCode) assert.Equal(t, http.StatusOK, rr.StatusCode)
rr, _ = doDelete(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d", tr.ID, td.ID, attendee.ID)) deleteResp, _ := doDelete(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d", tr.ID, td.ID, attendee.ID))
assert.Equal(t, http.StatusNoContent, rr.StatusCode) defer func() { _ = deleteResp.Body.Close() }()
rr, _ = doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d", tr.ID, td.ID, attendee.ID)) assert.Equal(t, http.StatusNoContent, deleteResp.StatusCode)
assert.Equal(t, http.StatusNotFound, rr.StatusCode)
deletedResp, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d", tr.ID, td.ID, attendee.ID))
defer func() { _ = deletedResp.Body.Close() }()
assert.Equal(t, http.StatusNotFound, deletedResp.StatusCode)
}) })
t.Run("Mark training date attendee as paid", func(t *testing.T) { t.Run("Mark training date attendee as paid", func(t *testing.T) {
@ -1051,6 +1121,8 @@ func TestServer(t *testing.T) {
_ = handlers.trainingDateAttendeeRepository.Create(td.ID, attendee) _ = handlers.trainingDateAttendeeRepository.Create(td.ID, attendee)
rr, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d", tr.ID, td.ID, attendee.ID)) rr, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d", tr.ID, td.ID, attendee.ID))
defer func() { _ = rr.Body.Close() }()
assert.Equal(t, http.StatusOK, rr.StatusCode) assert.Equal(t, http.StatusOK, rr.StatusCode)
var attendeeResponse TrainingDateAttendee var attendeeResponse TrainingDateAttendee
@ -1058,24 +1130,28 @@ func TestServer(t *testing.T) {
assert.NoError(t, err, "error unmarshalling response") assert.NoError(t, err, "error unmarshalling response")
assert.Equal(t, !paid.Paid, attendeeResponse.HasPaid) assert.Equal(t, !paid.Paid, attendeeResponse.HasPaid)
rr, _ = doPut(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d/paid", tr.ID, td.ID, attendee.ID), paid) updateResp, _ := doPut(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d/paid", tr.ID, td.ID, attendee.ID), paid)
assert.Equal(t, http.StatusOK, rr.StatusCode) defer func() { _ = updateResp.Body.Close() }()
err = json.NewDecoder(rr.Body).Decode(&attendeeResponse) assert.Equal(t, http.StatusOK, updateResp.StatusCode)
err = json.NewDecoder(updateResp.Body).Decode(&attendeeResponse)
assert.NoError(t, err, "error unmarshalling response") assert.NoError(t, err, "error unmarshalling response")
assert.Equal(t, paid.Paid, attendeeResponse.HasPaid) assert.Equal(t, paid.Paid, attendeeResponse.HasPaid)
rr, _ = doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d", tr.ID, td.ID, attendee.ID)) getAttendeeResp, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d", tr.ID, td.ID, attendee.ID))
assert.Equal(t, http.StatusOK, rr.StatusCode) defer func() { _ = getAttendeeResp.Body.Close() }()
err = json.NewDecoder(rr.Body).Decode(&attendeeResponse) assert.Equal(t, http.StatusOK, getAttendeeResp.StatusCode)
err = json.NewDecoder(getAttendeeResp.Body).Decode(&attendeeResponse)
assert.NoError(t, err, "error unmarshalling response") assert.NoError(t, err, "error unmarshalling response")
assert.Equal(t, paid.Paid, attendeeResponse.HasPaid) assert.Equal(t, paid.Paid, attendeeResponse.HasPaid)
}) })
t.Run("Mark training date attendee as attended", func(t *testing.T) { t.Run("Mark training date attendee as attended", func(t *testing.T) {
tr := &training.Training{ tr := &training.Training{
Name: "Testing Training for training date", Name: "Testing Training: mark attendee as attended",
Description: "This is a test training for training date", Description: "This is a test training for training date",
Days: 1, Days: 1,
Pricing: []training.Price{ Pricing: []training.Price{
@ -1124,6 +1200,8 @@ func TestServer(t *testing.T) {
_ = handlers.trainingDateAttendeeRepository.Create(td.ID, attendee) _ = handlers.trainingDateAttendeeRepository.Create(td.ID, attendee)
rr, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d", tr.ID, td.ID, attendee.ID)) rr, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d", tr.ID, td.ID, attendee.ID))
defer func() { _ = rr.Body.Close() }()
assert.Equal(t, http.StatusOK, rr.StatusCode) assert.Equal(t, http.StatusOK, rr.StatusCode)
var attendeeResponse TrainingDateAttendee var attendeeResponse TrainingDateAttendee
@ -1131,24 +1209,28 @@ func TestServer(t *testing.T) {
assert.NoError(t, err, "error unmarshalling response") assert.NoError(t, err, "error unmarshalling response")
assert.Equal(t, !attended.Attended, attendeeResponse.HasAttended) assert.Equal(t, !attended.Attended, attendeeResponse.HasAttended)
rr, _ = doPut(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d/attended", tr.ID, td.ID, attendee.ID), attended) updateResp, _ := doPut(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d/attended", tr.ID, td.ID, attendee.ID), attended)
assert.Equal(t, http.StatusOK, rr.StatusCode) defer func() { _ = updateResp.Body.Close() }()
err = json.NewDecoder(rr.Body).Decode(&attendeeResponse) assert.Equal(t, http.StatusOK, updateResp.StatusCode)
err = json.NewDecoder(updateResp.Body).Decode(&attendeeResponse)
assert.NoError(t, err, "error unmarshalling response") assert.NoError(t, err, "error unmarshalling response")
assert.Equal(t, attended.Attended, attendeeResponse.HasAttended) assert.Equal(t, attended.Attended, attendeeResponse.HasAttended)
rr, _ = doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d", tr.ID, td.ID, attendee.ID)) getAttendeeResp, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/%d", tr.ID, td.ID, attendee.ID))
assert.Equal(t, http.StatusOK, rr.StatusCode) defer func() { _ = getAttendeeResp.Body.Close() }()
err = json.NewDecoder(rr.Body).Decode(&attendeeResponse) assert.Equal(t, http.StatusOK, getAttendeeResp.StatusCode)
err = json.NewDecoder(getAttendeeResp.Body).Decode(&attendeeResponse)
assert.NoError(t, err, "error unmarshalling response") assert.NoError(t, err, "error unmarshalling response")
assert.Equal(t, attended.Attended, attendeeResponse.HasAttended) assert.Equal(t, attended.Attended, attendeeResponse.HasAttended)
}) })
t.Run("Get count of training date attendees", func(t *testing.T) { t.Run("Get count of training date attendees", func(t *testing.T) {
tr := &training.Training{ tr := &training.Training{
Name: "Testing Training for training date", Name: "Testing Training: get attendee count",
Description: "This is a test training for training date", Description: "This is a test training for training date",
Days: 1, Days: 1,
Pricing: []training.Price{ Pricing: []training.Price{
@ -1195,6 +1277,8 @@ func TestServer(t *testing.T) {
} }
rr, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/count", tr.ID, td.ID)) rr, _ := doGet(t, app, fmt.Sprintf("/v1/trainings/%d/dates/%d/attendees/count", tr.ID, td.ID))
defer func() { _ = rr.Body.Close() }()
assert.Equal(t, http.StatusOK, rr.StatusCode) assert.Equal(t, http.StatusOK, rr.StatusCode)
var attendeesResponse GetTrainingDateAttendeeCountResponse var attendeesResponse GetTrainingDateAttendeeCountResponse