Show responses on admin page
This commit is contained in:
@ -216,6 +216,7 @@ type GetEventResponseSummaryQuery struct {
|
||||
|
||||
type GetEventResponseSummaryResult struct {
|
||||
TotalResponses int
|
||||
PerHourCounts map[date.Date]map[int]int
|
||||
}
|
||||
|
||||
func (s *Store) GetEventResponseSummary(ctx context.Context, query GetEventResponseSummaryQuery) (GetEventResponseSummaryResult, error) {
|
||||
@ -253,6 +254,29 @@ func (s *Store) GetEventResponseSummary(ctx context.Context, query GetEventRespo
|
||||
if err != nil {
|
||||
return GetEventResponseSummaryResult{}, err
|
||||
}
|
||||
|
||||
result.PerHourCounts = make(map[date.Date]map[int]int)
|
||||
const perHourCountQuery = `
|
||||
SELECT date, time, COUNT(*)
|
||||
FROM response
|
||||
JOIN response_time ON response.id = response_time.response_id
|
||||
WHERE event_id = ?
|
||||
GROUP BY date, time;`
|
||||
err = sqlitex.Exec(conn, perHourCountQuery,
|
||||
func(stmt *sqlite.Stmt) error {
|
||||
d, err := date.Parse(dbDateLayout, stmt.ColumnText(0))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if result.PerHourCounts[d] == nil {
|
||||
result.PerHourCounts[d] = make(map[int]int)
|
||||
}
|
||||
result.PerHourCounts[d][stmt.ColumnInt(1)] = stmt.ColumnInt(2)
|
||||
return nil
|
||||
}, query.EventID)
|
||||
if err != nil {
|
||||
return GetEventResponseSummaryResult{}, err
|
||||
}
|
||||
return result, nil
|
||||
}
|
||||
|
||||
|
@ -69,13 +69,6 @@ func TestGetEventResponseSummary(t *testing.T) {
|
||||
return responses.TotalResponses
|
||||
}
|
||||
|
||||
createEmptyResponse := func(is *is.I, eventID string) {
|
||||
_, err = store.CreateEventResponse(context.Background(), back.CreateEventResponseCommand{
|
||||
EventID: eventID,
|
||||
})
|
||||
is.NoErr(err)
|
||||
}
|
||||
|
||||
t.Run("TotalResponses counts the number of responses created", func(t *testing.T) {
|
||||
is := is.New(t)
|
||||
|
||||
@ -83,26 +76,86 @@ func TestGetEventResponseSummary(t *testing.T) {
|
||||
is.Equal(getTotalResponses(is, eventID), 0)
|
||||
const respondTimes = 5
|
||||
for i := 1; i <= respondTimes; i++ {
|
||||
createEmptyResponse(is, eventID)
|
||||
_, err = store.CreateEventResponse(context.Background(), back.CreateEventResponseCommand{
|
||||
EventID: eventID,
|
||||
})
|
||||
is.NoErr(err)
|
||||
is.Equal(getTotalResponses(is, eventID), i)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("TotalResponses does not count responses to other events", func(t *testing.T) {
|
||||
t.Run("does not include responses to other events", func(t *testing.T) {
|
||||
is := is.New(t)
|
||||
|
||||
eventID := createEvent(is)
|
||||
createEmptyResponse(is, eventID)
|
||||
d := date.New(1999, 12, 31)
|
||||
wrongEvent, err := store.CreateEvent(context.Background(), back.CreateEventCommand{
|
||||
Name: "Beach party",
|
||||
Description: "Come on in! The water's fine!",
|
||||
Earliest: d,
|
||||
Latest: d,
|
||||
})
|
||||
is.NoErr(err)
|
||||
|
||||
// Create a response to another event
|
||||
createEmptyResponse(is, createEvent(is))
|
||||
_, err = store.CreateEventResponse(context.Background(), back.CreateEventResponseCommand{
|
||||
EventID: wrongEvent.EventID,
|
||||
GuestName: "Matt Hooper",
|
||||
DateHours: map[date.Date]map[int]struct{}{d: {0: {}}},
|
||||
})
|
||||
is.NoErr(err)
|
||||
|
||||
is.Equal(getTotalResponses(is, eventID), 1)
|
||||
summary, err := store.GetEventResponseSummary(context.Background(), back.GetEventResponseSummaryQuery{
|
||||
EventID: createEvent(is),
|
||||
})
|
||||
is.NoErr(err)
|
||||
|
||||
is.Equal(summary, back.GetEventResponseSummaryResult{
|
||||
TotalResponses: 0,
|
||||
PerHourCounts: map[date.Date]map[int]int{},
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func pending(t *testing.T) {
|
||||
t.Fatalf("pending")
|
||||
t.Run("PerHourCounts counts votes per hour", func(t *testing.T) {
|
||||
is := is.New(t)
|
||||
|
||||
dayOne := date.New(2012, 12, 21)
|
||||
dayTwo := dayOne.Add(1)
|
||||
createResult, err := store.CreateEvent(context.Background(), back.CreateEventCommand{
|
||||
Name: "Apocalypse",
|
||||
Description: "It's over.",
|
||||
Earliest: dayOne,
|
||||
Latest: dayTwo,
|
||||
})
|
||||
is.NoErr(err)
|
||||
|
||||
_, err = store.CreateEventResponse(context.Background(), back.CreateEventResponseCommand{
|
||||
EventID: createResult.EventID,
|
||||
GuestName: "Thanos",
|
||||
DateHours: map[date.Date]map[int]struct{}{
|
||||
dayOne: {0: {}, 1: {}, 2: {}, 3: {}},
|
||||
dayTwo: {1: {}, 2: {}, 3: {}, 4: {}},
|
||||
},
|
||||
})
|
||||
is.NoErr(err)
|
||||
|
||||
_, err = store.CreateEventResponse(context.Background(), back.CreateEventResponseCommand{
|
||||
EventID: createResult.EventID,
|
||||
GuestName: "Magog",
|
||||
DateHours: map[date.Date]map[int]struct{}{
|
||||
dayOne: {1: {}, 2: {}, 3: {}, 4: {}},
|
||||
dayTwo: {2: {}, 3: {}, 4: {}, 5: {}},
|
||||
},
|
||||
})
|
||||
is.NoErr(err)
|
||||
|
||||
summary, err := store.GetEventResponseSummary(context.Background(), back.GetEventResponseSummaryQuery{
|
||||
EventID: createResult.EventID,
|
||||
})
|
||||
is.NoErr(err)
|
||||
is.Equal(summary.PerHourCounts, map[date.Date]map[int]int{
|
||||
dayOne: {0: 1, 1: 2, 2: 2, 3: 2, 4: 1},
|
||||
dayTwo: {1: 1, 2: 2, 3: 2, 4: 2, 5: 1},
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
func TestCreateEventResponse(t *testing.T) {
|
||||
|
Reference in New Issue
Block a user