detached 0a9e349

test: run the activity store test outside the usecase package and its home row subtests in parallel

commit
0a9e349cf0e4bd5155b69315570ebba15a7200da
author
brice · · 2026-10-19 17:38 UTC
parent
9ca7c68
signature
GPG VerifiedCD88F9E564E0102646FB6077A1A07C7C7C3E349D · arch-gpg Verified for the committer email
checks
4/4
3 files · +20 -8
M internal/adapters/web/home_test.go +1 -0
@@ -377,6 +377,7 @@ func TestActivityEventsRefreshTheHomeRow(t *testing.T) {
377377 domain.IssueClosed{Issue: issue}, domain.IssueReopened{Issue: issue}, domain.IssueCommented{Repo: repo.Name},
378378 } {
379379 t.Run(ev.EventKind(), func(t *testing.T) {
380+ t.Parallel()
380381 got, err := (&liveStream{s: srv}).home(t.Context(), ports.WatchEvent{Event: ev})
381382 require.NoError(t, err)
382383 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 @@
11 // SPDX-License-Identifier: AGPL-3.0-or-later
22
3-package usecase
3+package usecase_test
44
55 import (
66 "testing"
@@ -10,6 +10,7 @@ import (
1010
1111 "bnema.dev/ermite/internal/adapters/kvstore"
1212 "bnema.dev/ermite/internal/domain"
13+ "bnema.dev/ermite/internal/usecase"
1314 )
1415
1516 func TestActivityTimestampsOverStore(t *testing.T) {
@@ -21,16 +22,16 @@ func TestActivityTimestampsOverStore(t *testing.T) {
2122 require.NoError(t, err)
2223 at := time.Date(2026, 10, 19, 12, 0, 0, 0, time.UTC)
2324 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))
2526 require.NoError(t, err)
2627 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))
2829 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))
3031 require.NoError(t, err)
31- _, err = touchPushedAt(ctx, s, n, at)
32+ _, err = usecase.TouchPushedAt(ctx, s, n, at)
3233 require.NoError(t, err)
33- _, err = touchActiveAt(ctx, s, n, at)
34+ _, err = usecase.TouchActiveAt(ctx, s, n, at)
3435 require.NoError(t, err)
3536 got, err = s.Get(ctx, n)
3637 require.NoError(t, err)
@@ -38,8 +39,8 @@ func TestActivityTimestampsOverStore(t *testing.T) {
3839 require.Equal(t, at.Add(3*time.Hour), got.ActiveAt)
3940 require.Equal(t, domain.VisibilityPrivate, got.Visibility)
4041 require.NoError(t, s.Delete(ctx, n))
41- _, err = touchPushedAt(ctx, s, n, at)
42+ _, err = usecase.TouchPushedAt(ctx, s, n, at)
4243 require.NoError(t, err)
43- _, err = touchActiveAt(ctx, s, n, at)
44+ _, err = usecase.TouchActiveAt(ctx, s, n, at)
4445 require.NoError(t, err)
4546 }
@@ -1,6 +1,6 @@
1 // SPDX-License-Identifier: AGPL-3.0-or-later1 // SPDX-License-Identifier: AGPL-3.0-or-later
2 2
3-package usecase3+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 (
1919 // Sweep exposes the daily sweep to the tests.
2020 func (c *CI) Sweep(ctx context.Context) { c.sweep(ctx) }
2121
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+
2232 // RunTitle gives the title of a run as startRun sets it: the evaluated
2333 // run-name, else commitTitle.
2434 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 evaluated32 // 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 {

Keyboard shortcuts

Single-key shortcuts are on. ctrl k and esc work whatever this says.

ctrl k :
go to a section, branch, tag, file or repository
?
this list
j k
move the row cursor down / up
enter
open the row under the cursor; on Files, a directory opens or closes in place
↑ ↓ ← → home end
in the file tree (focus on a row): previous / next row, close / open a directory or go to its parent / first entry, first / last row. They never open a file
l h
on Files: open a directory or a file / close a directory or go up to its parent, then to the parent page. Elsewhere: into the side panel (on a merge request, its files) / back to the content; there j k move between its controls
g g G
first / last row
/
filter the list; on Files, find a file anywhere in the repository (esc clears, enter opens the best match)
b
switch branch or tag
g s g f g c g b g m g i g r g a
tabs: summary, files, commits, branches & tags, merge requests, issues, releases, actions (when available)
g h
home
w
wide mode: use the whole width of the screen, or not (remembered)
y
copy a permalink pinned to the commit
d u x
diff: split / unified / collapse or expand all
e E
diff: the whole file in view / every file, with the lines the hunks hide
n
merge request: next note in the diff
esc
close a dialog, leave a field

Branches 2

Tags 44

↑↓ moveenter openesc close