ActiveWeeks computes per-user distinct active weeks (reads login_events UNION acts summary_actions) for the gate (VISION/ADR-016: usage in >=2 distinct weeks). Because the user-owned tables are FORCE RLS under a non-superuser owner, a single cross-user query is deny-all; instead it enumerates users from the un-RLS'd identity map and counts each inside withUser — no privilege escalation, no policy change. `tapir report` prints the per-user table and the pass/fail verdict (needs only TAPIR_DB_DSN). Pure formatter + store query are unit-tested, including the cross-table shared-week dedup. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
46 lines
1.3 KiB
Go
46 lines
1.3 KiB
Go
package main
|
|
|
|
import (
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"gitea.d-ma.be/mathias/tapir/internal/adapters/store"
|
|
)
|
|
|
|
func TestFormatReportColumnsAndGatePass(t *testing.T) {
|
|
rows := []store.UserActiveWeeks{
|
|
{UserID: "user-a", DisplayName: "Ada", ActiveWeeks: 3},
|
|
{UserID: "user-b", DisplayName: "", ActiveWeeks: 1},
|
|
}
|
|
|
|
var b strings.Builder
|
|
require.NoError(t, formatReport(&b, rows))
|
|
out := b.String()
|
|
|
|
require.Contains(t, out, "USER")
|
|
require.Contains(t, out, "ACTIVE_WEEKS")
|
|
require.Contains(t, out, "Ada")
|
|
require.Contains(t, out, "PASSED", "a user at >= 2 weeks passes the gate")
|
|
|
|
// The >=2 user is marked PASS; the 1-week user is not.
|
|
require.Contains(t, lineContaining(t, out, "user-a"), "PASS")
|
|
require.NotContains(t, lineContaining(t, out, "user-b"), "PASS")
|
|
require.Contains(t, lineContaining(t, out, "user-b"), "-", "no display name falls back to dash")
|
|
}
|
|
|
|
func TestFormatReportGateNotMet(t *testing.T) {
|
|
rows := []store.UserActiveWeeks{{UserID: "user-a", ActiveWeeks: 1}}
|
|
|
|
var b strings.Builder
|
|
require.NoError(t, formatReport(&b, rows))
|
|
require.Contains(t, b.String(), "NOT YET MET", "no user at >= 2 weeks fails the gate")
|
|
}
|
|
|
|
func TestFormatReportEmpty(t *testing.T) {
|
|
var b strings.Builder
|
|
require.NoError(t, formatReport(&b, nil))
|
|
require.Contains(t, b.String(), "no users yet")
|
|
}
|