test: run the activity store test outside the usecase package and its home row subtests in parallel
3 files · +20 -8
M internal/adapters/web/home_test.go +1 -0
| @@ -377,6 +377,7 @@ func TestActivityEventsRefreshTheHomeRow(t *testing.T) { | |||
| 377 | 377 | domain.IssueClosed{Issue: issue}, domain.IssueReopened{Issue: issue}, domain.IssueCommented{Repo: repo.Name}, | |
| 378 | 378 | } { | |
| 379 | 379 | t.Run(ev.EventKind(), func(t *testing.T) { | |
| 380 | + | t.Parallel() | |
| 380 | 381 | got, err := (&liveStream{s: srv}).home(t.Context(), ports.WatchEvent{Event: ev}) | |
| 381 | 382 | require.NoError(t, err) | |
| 382 | 383 | require.Len(t, got, 1) | |
| @@ -377,6 +377,7 @@ func TestActivityEventsRefreshTheHomeRow(t *testing.T) { | |||||
| 377 | domain.IssueClosed{Issue: issue}, domain.IssueReopened{Issue: issue}, domain.IssueCommented{Repo: repo.Name}, | 377 | domain.IssueClosed{Issue: issue}, domain.IssueReopened{Issue: issue}, domain.IssueCommented{Repo: repo.Name}, | ||
| 378 | } { | 378 | } { | ||
| 379 | t.Run(ev.EventKind(), func(t *testing.T) { | 379 | t.Run(ev.EventKind(), func(t *testing.T) { | ||
| 380 | + | t.Parallel() | |||
| 380 | got, err := (&liveStream{s: srv}).home(t.Context(), ports.WatchEvent{Event: ev}) | 381 | got, err := (&liveStream{s: srv}).home(t.Context(), ports.WatchEvent{Event: ev}) | ||
| 381 | require.NoError(t, err) | 382 | require.NoError(t, err) | ||
| 382 | require.Len(t, got, 1) | 383 | require.Len(t, got, 1) | ||
M internal/usecase/activity_store_test.go +9 -8
| @@ -1,6 +1,6 @@ | |||
| 1 | 1 | // SPDX-License-Identifier: AGPL-3.0-or-later | |
| 2 | 2 | ||
| 3 | - | package usecase | |
| 3 | + | package usecase_test | |
| 4 | 4 | ||
| 5 | 5 | import ( | |
| 6 | 6 | "testing" | |
| @@ -10,6 +10,7 @@ import ( | |||
| 10 | 10 | ||
| 11 | 11 | "bnema.dev/ermite/internal/adapters/kvstore" | |
| 12 | 12 | "bnema.dev/ermite/internal/domain" | |
| 13 | + | "bnema.dev/ermite/internal/usecase" | |
| 13 | 14 | ) | |
| 14 | 15 | ||
| 15 | 16 | func TestActivityTimestampsOverStore(t *testing.T) { | |
| @@ -21,16 +22,16 @@ func TestActivityTimestampsOverStore(t *testing.T) { | |||
| 21 | 22 | require.NoError(t, err) | |
| 22 | 23 | at := time.Date(2026, 10, 19, 12, 0, 0, 0, time.UTC) | |
| 23 | 24 | require.NoError(t, s.Create(ctx, domain.Repo{Name: n, Visibility: domain.VisibilityPrivate, CreatedAt: at})) | |
| 24 | - | got, err := touchPushedAt(ctx, s, n, at.Add(time.Hour)) | |
| 25 | + | got, err := usecase.TouchPushedAt(ctx, s, n, at.Add(time.Hour)) | |
| 25 | 26 | require.NoError(t, err) | |
| 26 | 27 | require.Equal(t, got.PushedAt, got.ActiveAt) | |
| 27 | - | _, err = touchActiveAt(ctx, s, n, at.Add(3*time.Hour)) | |
| 28 | + | _, err = usecase.TouchActiveAt(ctx, s, n, at.Add(3*time.Hour)) | |
| 28 | 29 | require.NoError(t, err) | |
| 29 | - | _, err = touchPushedAt(ctx, s, n, at.Add(2*time.Hour)) | |
| 30 | + | _, err = usecase.TouchPushedAt(ctx, s, n, at.Add(2*time.Hour)) | |
| 30 | 31 | require.NoError(t, err) | |
| 31 | - | _, err = touchPushedAt(ctx, s, n, at) | |
| 32 | + | _, err = usecase.TouchPushedAt(ctx, s, n, at) | |
| 32 | 33 | require.NoError(t, err) | |
| 33 | - | _, err = touchActiveAt(ctx, s, n, at) | |
| 34 | + | _, err = usecase.TouchActiveAt(ctx, s, n, at) | |
| 34 | 35 | require.NoError(t, err) | |
| 35 | 36 | got, err = s.Get(ctx, n) | |
| 36 | 37 | require.NoError(t, err) | |
| @@ -38,8 +39,8 @@ func TestActivityTimestampsOverStore(t *testing.T) { | |||
| 38 | 39 | require.Equal(t, at.Add(3*time.Hour), got.ActiveAt) | |
| 39 | 40 | require.Equal(t, domain.VisibilityPrivate, got.Visibility) | |
| 40 | 41 | require.NoError(t, s.Delete(ctx, n)) | |
| 41 | - | _, err = touchPushedAt(ctx, s, n, at) | |
| 42 | + | _, err = usecase.TouchPushedAt(ctx, s, n, at) | |
| 42 | 43 | require.NoError(t, err) | |
| 43 | - | _, err = touchActiveAt(ctx, s, n, at) | |
| 44 | + | _, err = usecase.TouchActiveAt(ctx, s, n, at) | |
| 44 | 45 | require.NoError(t, err) | |
| 45 | 46 | } | |
| @@ -1,6 +1,6 @@ | |||||
| 1 | // SPDX-License-Identifier: AGPL-3.0-or-later | 1 | // SPDX-License-Identifier: AGPL-3.0-or-later | ||
| 2 | 2 | ||||
| 3 | - | package usecase | 3 | + | package usecase_test |
| 4 | 4 | ||||
| 5 | import ( | 5 | import ( | ||
| 6 | "testing" | 6 | "testing" | ||
| @@ -10,6 +10,7 @@ import ( | |||||
| 10 | 10 | ||||
| 11 | "bnema.dev/ermite/internal/adapters/kvstore" | 11 | "bnema.dev/ermite/internal/adapters/kvstore" | ||
| 12 | "bnema.dev/ermite/internal/domain" | 12 | "bnema.dev/ermite/internal/domain" | ||
| 13 | + | "bnema.dev/ermite/internal/usecase" | |||
| 13 | ) | 14 | ) | ||
| 14 | 15 | ||||
| 15 | func TestActivityTimestampsOverStore(t *testing.T) { | 16 | func TestActivityTimestampsOverStore(t *testing.T) { | ||
| @@ -21,16 +22,16 @@ func TestActivityTimestampsOverStore(t *testing.T) { | |||||
| 21 | require.NoError(t, err) | 22 | require.NoError(t, err) | ||
| 22 | at := time.Date(2026, 10, 19, 12, 0, 0, 0, time.UTC) | 23 | at := time.Date(2026, 10, 19, 12, 0, 0, 0, time.UTC) | ||
| 23 | require.NoError(t, s.Create(ctx, domain.Repo{Name: n, Visibility: domain.VisibilityPrivate, CreatedAt: at})) | 24 | require.NoError(t, s.Create(ctx, domain.Repo{Name: n, Visibility: domain.VisibilityPrivate, CreatedAt: at})) | ||
| 24 | - | got, err := touchPushedAt(ctx, s, n, at.Add(time.Hour)) | 25 | + | got, err := usecase.TouchPushedAt(ctx, s, n, at.Add(time.Hour)) |
| 25 | require.NoError(t, err) | 26 | require.NoError(t, err) | ||
| 26 | require.Equal(t, got.PushedAt, got.ActiveAt) | 27 | require.Equal(t, got.PushedAt, got.ActiveAt) | ||
| 27 | - | _, err = touchActiveAt(ctx, s, n, at.Add(3*time.Hour)) | 28 | + | _, err = usecase.TouchActiveAt(ctx, s, n, at.Add(3*time.Hour)) |
| 28 | require.NoError(t, err) | 29 | require.NoError(t, err) | ||
| 29 | - | _, err = touchPushedAt(ctx, s, n, at.Add(2*time.Hour)) | 30 | + | _, err = usecase.TouchPushedAt(ctx, s, n, at.Add(2*time.Hour)) |
| 30 | require.NoError(t, err) | 31 | require.NoError(t, err) | ||
| 31 | - | _, err = touchPushedAt(ctx, s, n, at) | 32 | + | _, err = usecase.TouchPushedAt(ctx, s, n, at) |
| 32 | require.NoError(t, err) | 33 | require.NoError(t, err) | ||
| 33 | - | _, err = touchActiveAt(ctx, s, n, at) | 34 | + | _, err = usecase.TouchActiveAt(ctx, s, n, at) |
| 34 | require.NoError(t, err) | 35 | require.NoError(t, err) | ||
| 35 | got, err = s.Get(ctx, n) | 36 | got, err = s.Get(ctx, n) | ||
| 36 | require.NoError(t, err) | 37 | require.NoError(t, err) | ||
| @@ -38,8 +39,8 @@ func TestActivityTimestampsOverStore(t *testing.T) { | |||||
| 38 | require.Equal(t, at.Add(3*time.Hour), got.ActiveAt) | 39 | require.Equal(t, at.Add(3*time.Hour), got.ActiveAt) | ||
| 39 | require.Equal(t, domain.VisibilityPrivate, got.Visibility) | 40 | require.Equal(t, domain.VisibilityPrivate, got.Visibility) | ||
| 40 | require.NoError(t, s.Delete(ctx, n)) | 41 | require.NoError(t, s.Delete(ctx, n)) | ||
| 41 | - | _, err = touchPushedAt(ctx, s, n, at) | 42 | + | _, err = usecase.TouchPushedAt(ctx, s, n, at) |
| 42 | require.NoError(t, err) | 43 | require.NoError(t, err) | ||
| 43 | - | _, err = touchActiveAt(ctx, s, n, at) | 44 | + | _, err = usecase.TouchActiveAt(ctx, s, n, at) |
| 44 | require.NoError(t, err) | 45 | require.NoError(t, err) | ||
| 45 | } | 46 | } | ||
M internal/usecase/export_test.go +10 -0
| @@ -19,6 +19,16 @@ import ( | |||
| 19 | 19 | // Sweep exposes the daily sweep to the tests. | |
| 20 | 20 | func (c *CI) Sweep(ctx context.Context) { c.sweep(ctx) } | |
| 21 | 21 | ||
| 22 | + | // TouchPushedAt exposes touchPushedAt to the tests. | |
| 23 | + | func TouchPushedAt(ctx context.Context, meta ports.RepoMetaStore, name domain.RepoName, now time.Time) (domain.Repo, error) { | |
| 24 | + | return touchPushedAt(ctx, meta, name, now) | |
| 25 | + | } | |
| 26 | + | ||
| 27 | + | // TouchActiveAt exposes touchActiveAt to the tests. | |
| 28 | + | func TouchActiveAt(ctx context.Context, meta ports.RepoMetaStore, name domain.RepoName, now time.Time) (domain.Repo, error) { | |
| 29 | + | return touchActiveAt(ctx, meta, name, now) | |
| 30 | + | } | |
| 31 | + | ||
| 22 | 32 | // RunTitle gives the title of a run as startRun sets it: the evaluated | |
| 23 | 33 | // run-name, else commitTitle. | |
| 24 | 34 | func (c *CI) RunTitle(ctx context.Context, wf *workflow.Workflow, githubJSON, commitTitle string) string { | |
| @@ -19,6 +19,16 @@ import ( | |||||
| 19 | // Sweep exposes the daily sweep to the tests. | 19 | // Sweep exposes the daily sweep to the tests. | ||
| 20 | func (c *CI) Sweep(ctx context.Context) { c.sweep(ctx) } | 20 | func (c *CI) Sweep(ctx context.Context) { c.sweep(ctx) } | ||
| 21 | 21 | ||||
| 22 | + | // TouchPushedAt exposes touchPushedAt to the tests. | |||
| 23 | + | func TouchPushedAt(ctx context.Context, meta ports.RepoMetaStore, name domain.RepoName, now time.Time) (domain.Repo, error) { | |||
| 24 | + | return touchPushedAt(ctx, meta, name, now) | |||
| 25 | + | } | |||
| 26 | + | ||||
| 27 | + | // TouchActiveAt exposes touchActiveAt to the tests. | |||
| 28 | + | func TouchActiveAt(ctx context.Context, meta ports.RepoMetaStore, name domain.RepoName, now time.Time) (domain.Repo, error) { | |||
| 29 | + | return touchActiveAt(ctx, meta, name, now) | |||
| 30 | + | } | |||
| 31 | + | ||||
| 22 | // RunTitle gives the title of a run as startRun sets it: the evaluated | 32 | // RunTitle gives the title of a run as startRun sets it: the evaluated | ||
| 23 | // run-name, else commitTitle. | 33 | // run-name, else commitTitle. | ||
| 24 | func (c *CI) RunTitle(ctx context.Context, wf *workflow.Workflow, githubJSON, commitTitle string) string { | 34 | func (c *CI) RunTitle(ctx context.Context, wf *workflow.Workflow, githubJSON, commitTitle string) string { | ||