package db import ( "context" "errors" "testing" "sourcecraft.dev/bigbes/sr-ht-dolt/core" ) func TestEffectiveAccessAndACL(t *testing.T) { s, db, cleanup := newTestStore(t) defer cleanup() ctx := context.Background() owner := insertUser(t, db, 1, "alice", core.UserTypeUser) grantee := insertUser(t, db, 2, "bob", core.UserTypeUser) repo := mkRepo(t, s, ctx, owner, "alice", "widgets", core.VisibilityPrivate) // No grant yet: nil, nil. mode, err := s.EffectiveAccess(ctx, grantee, repo.ID) if err != nil { t.Fatalf("effective access: %v", err) } if mode != nil { t.Fatalf("expected nil access, got %v", *mode) } // Grant RO, then verify. if err := s.UpsertACL(ctx, repo.ID, grantee, core.AccessRO); err != nil { t.Fatalf("upsert RO: %v", err) } mode, err = s.EffectiveAccess(ctx, grantee, repo.ID) if err != nil { t.Fatalf("effective access after grant: %v", err) } if mode == nil || *mode != core.AccessRO { t.Fatalf("expected RO, got %v", mode) } // Upsert to RW updates in place. if err := s.UpsertACL(ctx, repo.ID, grantee, core.AccessRW); err != nil { t.Fatalf("upsert RW: %v", err) } mode, err = s.EffectiveAccess(ctx, grantee, repo.ID) if err != nil { t.Fatalf("effective access after update: %v", err) } if mode == nil || *mode != core.AccessRW { t.Fatalf("expected RW, got %v", mode) } // ListACL resolves the username. entries, err := s.ListACL(ctx, repo.ID) if err != nil { t.Fatalf("list acl: %v", err) } if len(entries) != 1 || entries[0].Username != "bob" || entries[0].Mode != core.AccessRW { t.Fatalf("unexpected acl entries: %+v", entries) } // DeleteACL revokes; effective access returns to nil. if err := s.DeleteACL(ctx, repo.ID, grantee); err != nil { t.Fatalf("delete acl: %v", err) } mode, err = s.EffectiveAccess(ctx, grantee, repo.ID) if err != nil { t.Fatalf("effective access after delete: %v", err) } if mode != nil { t.Fatalf("expected nil after delete, got %v", *mode) } // Deleting again is ErrNotFound. if err := s.DeleteACL(ctx, repo.ID, grantee); !errors.Is(err, ErrNotFound) { t.Fatalf("expected ErrNotFound, got %v", err) } }