test: use Store.Mutate for the merge-mode upgrade test and skip id-only events in the inbox stream test
2 files · +20 -5
M internal/adapters/kvstore/mergerequests_test.go +5 -2
| @@ -609,8 +609,11 @@ func TestStoredOldDefaultModesGainMerge(t *testing.T) { | |||
| 609 | 609 | assert.Equal(t, []domain.MergeMode{domain.MergeModeSquash}, single.Settings.AllowedMergeModes) | |
| 610 | 610 | ||
| 611 | 611 | // An explicit {ff, squash} written now is kept. | |
| 612 | - | old.Settings.AllowedMergeModes = []domain.MergeMode{domain.MergeModeFastForward, domain.MergeModeSquash} | |
| 613 | - | require.NoError(t, s.Update(ctx, old)) | |
| 612 | + | _, err = s.Mutate(ctx, old.Name, func(r *domain.Repo) (bool, error) { | |
| 613 | + | r.Settings.AllowedMergeModes = []domain.MergeMode{domain.MergeModeFastForward, domain.MergeModeSquash} | |
| 614 | + | return true, nil | |
| 615 | + | }) | |
| 616 | + | require.NoError(t, err) | |
| 614 | 617 | again, err := s.Get(ctx, name(t, "old")) | |
| 615 | 618 | require.NoError(t, err) | |
| 616 | 619 | assert.Equal(t, []domain.MergeMode{domain.MergeModeFastForward, domain.MergeModeSquash}, again.Settings.AllowedMergeModes) | |
| @@ -609,8 +609,11 @@ func TestStoredOldDefaultModesGainMerge(t *testing.T) { | |||||
| 609 | assert.Equal(t, []domain.MergeMode{domain.MergeModeSquash}, single.Settings.AllowedMergeModes) | 609 | assert.Equal(t, []domain.MergeMode{domain.MergeModeSquash}, single.Settings.AllowedMergeModes) | ||
| 610 | 610 | ||||
| 611 | // An explicit {ff, squash} written now is kept. | 611 | // An explicit {ff, squash} written now is kept. | ||
| 612 | - | old.Settings.AllowedMergeModes = []domain.MergeMode{domain.MergeModeFastForward, domain.MergeModeSquash} | 612 | + | _, err = s.Mutate(ctx, old.Name, func(r *domain.Repo) (bool, error) { |
| 613 | - | require.NoError(t, s.Update(ctx, old)) | 613 | + | r.Settings.AllowedMergeModes = []domain.MergeMode{domain.MergeModeFastForward, domain.MergeModeSquash} |
| 614 | + | return true, nil | |||
| 615 | + | }) | |||
| 616 | + | require.NoError(t, err) | |||
| 614 | again, err := s.Get(ctx, name(t, "old")) | 617 | again, err := s.Get(ctx, name(t, "old")) | ||
| 615 | require.NoError(t, err) | 618 | require.NoError(t, err) | ||
| 616 | assert.Equal(t, []domain.MergeMode{domain.MergeModeFastForward, domain.MergeModeSquash}, again.Settings.AllowedMergeModes) | 619 | assert.Equal(t, []domain.MergeMode{domain.MergeModeFastForward, domain.MergeModeSquash}, again.Settings.AllowedMergeModes) | ||
M internal/app/web_inbox_test.go +15 -3
| @@ -48,17 +48,17 @@ func TestWebInboxEndToEnd(t *testing.T) { | |||
| 48 | 48 | root := domain.Root() | |
| 49 | 49 | _, err = r.forge.MergeRequests.Create(r.ctx, root, r.name("proj"), ports.CreateMergeRequestParams{Title: "add search", Source: "feat/search", Target: "main"}) | |
| 50 | 50 | require.NoError(t, err) | |
| 51 | - | ev := stream.next(t, watchWait) | |
| 51 | + | ev := nextFragment(t, stream) | |
| 52 | 52 | assert.Equal(t, "inbox", ev.name) | |
| 53 | 53 | assert.Contains(t, ev.data, `id="inbox-counts"`) | |
| 54 | 54 | for range 4 { // the other fragments of this event | |
| 55 | - | stream.next(t, watchWait) | |
| 55 | + | nextFragment(t, stream) | |
| 56 | 56 | } | |
| 57 | 57 | _, err = r.forge.Issues.Create(r.ctx, root, r.name("other"), ports.CreateIssueParams{Title: "search is slow"}) | |
| 58 | 58 | require.NoError(t, err) | |
| 59 | 59 | var seen strings.Builder | |
| 60 | 60 | for range 5 { // the five fragments of this event | |
| 61 | - | seen.WriteString(stream.next(t, watchWait).data) | |
| 61 | + | seen.WriteString(nextFragment(t, stream).data) | |
| 62 | 62 | } | |
| 63 | 63 | assert.Contains(t, seen.String(), "search is slow", "an event of the second repository") | |
| 64 | 64 | _, err = r.forge.MergeRequests.Create(r.ctx, root, r.name("other"), ports.CreateMergeRequestParams{Title: "other work", Source: "feat/search", Target: "main"}) | |
| @@ -109,6 +109,18 @@ func TestWebInboxEndToEnd(t *testing.T) { | |||
| 109 | 109 | assert.Equal(t, unknown.status, b.get("/-/events?topic=owner&view=inbox", map[string]string{"Authorization": "Bearer " + adminToken}).status) | |
| 110 | 110 | } | |
| 111 | 111 | ||
| 112 | + | // nextFragment returns the next event that carries a fragment. Events the | |
| 113 | + | // inbox does not show (a mergeability check) still send their id alone, so a | |
| 114 | + | // resumed stream starts after them; they are skipped. | |
| 115 | + | func nextFragment(t *testing.T, s *sseStream) sseEvent { | |
| 116 | + | t.Helper() | |
| 117 | + | for { | |
| 118 | + | if ev := s.next(t, watchWait); ev.name != "" { | |
| 119 | + | return ev | |
| 120 | + | } | |
| 121 | + | } | |
| 122 | + | } | |
| 123 | + | ||
| 112 | 124 | // ownerStream opens the owner topic with the session cookie. | |
| 113 | 125 | func ownerStream(t *testing.T, h *harness, token string) *sseStream { | |
| 114 | 126 | t.Helper() | |
| @@ -48,17 +48,17 @@ func TestWebInboxEndToEnd(t *testing.T) { | |||||
| 48 | root := domain.Root() | 48 | root := domain.Root() | ||
| 49 | _, err = r.forge.MergeRequests.Create(r.ctx, root, r.name("proj"), ports.CreateMergeRequestParams{Title: "add search", Source: "feat/search", Target: "main"}) | 49 | _, err = r.forge.MergeRequests.Create(r.ctx, root, r.name("proj"), ports.CreateMergeRequestParams{Title: "add search", Source: "feat/search", Target: "main"}) | ||
| 50 | require.NoError(t, err) | 50 | require.NoError(t, err) | ||
| 51 | - | ev := stream.next(t, watchWait) | 51 | + | ev := nextFragment(t, stream) |
| 52 | assert.Equal(t, "inbox", ev.name) | 52 | assert.Equal(t, "inbox", ev.name) | ||
| 53 | assert.Contains(t, ev.data, `id="inbox-counts"`) | 53 | assert.Contains(t, ev.data, `id="inbox-counts"`) | ||
| 54 | for range 4 { // the other fragments of this event | 54 | for range 4 { // the other fragments of this event | ||
| 55 | - | stream.next(t, watchWait) | 55 | + | nextFragment(t, stream) |
| 56 | } | 56 | } | ||
| 57 | _, err = r.forge.Issues.Create(r.ctx, root, r.name("other"), ports.CreateIssueParams{Title: "search is slow"}) | 57 | _, err = r.forge.Issues.Create(r.ctx, root, r.name("other"), ports.CreateIssueParams{Title: "search is slow"}) | ||
| 58 | require.NoError(t, err) | 58 | require.NoError(t, err) | ||
| 59 | var seen strings.Builder | 59 | var seen strings.Builder | ||
| 60 | for range 5 { // the five fragments of this event | 60 | for range 5 { // the five fragments of this event | ||
| 61 | - | seen.WriteString(stream.next(t, watchWait).data) | 61 | + | seen.WriteString(nextFragment(t, stream).data) |
| 62 | } | 62 | } | ||
| 63 | assert.Contains(t, seen.String(), "search is slow", "an event of the second repository") | 63 | assert.Contains(t, seen.String(), "search is slow", "an event of the second repository") | ||
| 64 | _, err = r.forge.MergeRequests.Create(r.ctx, root, r.name("other"), ports.CreateMergeRequestParams{Title: "other work", Source: "feat/search", Target: "main"}) | 64 | _, err = r.forge.MergeRequests.Create(r.ctx, root, r.name("other"), ports.CreateMergeRequestParams{Title: "other work", Source: "feat/search", Target: "main"}) | ||
| @@ -109,6 +109,18 @@ func TestWebInboxEndToEnd(t *testing.T) { | |||||
| 109 | assert.Equal(t, unknown.status, b.get("/-/events?topic=owner&view=inbox", map[string]string{"Authorization": "Bearer " + adminToken}).status) | 109 | assert.Equal(t, unknown.status, b.get("/-/events?topic=owner&view=inbox", map[string]string{"Authorization": "Bearer " + adminToken}).status) | ||
| 110 | } | 110 | } | ||
| 111 | 111 | ||||
| 112 | + | // nextFragment returns the next event that carries a fragment. Events the | |||
| 113 | + | // inbox does not show (a mergeability check) still send their id alone, so a | |||
| 114 | + | // resumed stream starts after them; they are skipped. | |||
| 115 | + | func nextFragment(t *testing.T, s *sseStream) sseEvent { | |||
| 116 | + | t.Helper() | |||
| 117 | + | for { | |||
| 118 | + | if ev := s.next(t, watchWait); ev.name != "" { | |||
| 119 | + | return ev | |||
| 120 | + | } | |||
| 121 | + | } | |||
| 122 | + | } | |||
| 123 | + | ||||
| 112 | // ownerStream opens the owner topic with the session cookie. | 124 | // ownerStream opens the owner topic with the session cookie. | ||
| 113 | func ownerStream(t *testing.T, h *harness, token string) *sseStream { | 125 | func ownerStream(t *testing.T, h *harness, token string) *sseStream { | ||
| 114 | t.Helper() | 126 | t.Helper() | ||