@@ -2,6 +2,7 @@ import * as NodeServices from "@effect/platform-node/NodeServices";
22import * as ChildProcessSpawner from "effect/process/ChildProcessSpawner" ;
33import * as KeyValueStore from "effect/persistence/KeyValueStore" ;
44import { assert , it } from "@effect/vitest" ;
5+ import { GitHubRepositoryOwner } from "../sourceControl/GitHubApi.ts" ;
56import * as Cause from "effect/Cause" ;
67import * as Clock from "effect/Clock" ;
78import * as Deferred from "effect/Deferred" ;
@@ -1279,6 +1280,67 @@ it.effect("tries another workspace on the same host for the viewer", () =>
12791280 } ) ,
12801281) ;
12811282
1283+ it . effect ( "reads an owner with its own account under that account, apart from the rest" , ( ) =>
1284+ Effect . gen ( function * ( ) {
1285+ const searches : Array < {
1286+ readonly viewer : string ;
1287+ readonly owner : string | null ;
1288+ readonly repositories : ReadonlyArray < string > ;
1289+ } > = [ ] ;
1290+ const statReads : Array < { readonly owner : string | null ; readonly count : number } > = [ ] ;
1291+ const service = yield * makeService ( {
1292+ projects : [
1293+ project ( { id : "p1" , title : "personal" , workspaceRoot : "/p1" , repository : "me/one" } ) ,
1294+ project ( { id : "p2" , title : "other" , workspaceRoot : "/p2" , repository : "me/two" } ) ,
1295+ project ( { id : "w1" , title : "work" , workspaceRoot : "/w1" , repository : "Acme/web" } ) ,
1296+ ] ,
1297+ providers : [
1298+ fakeProvider ( "github" , {
1299+ repositoryAccount : ( { repository } ) =>
1300+ Effect . succeed ( repository . toLowerCase ( ) . startsWith ( "acme/" ) ? "work" : null ) ,
1301+ getViewer : ( ) =>
1302+ Effect . map ( GitHubRepositoryOwner , ( owner ) => ( owner === null ? "personal" : "work" ) ) ,
1303+ listChangeRequestsAcross : ( input ) =>
1304+ Effect . map ( GitHubRepositoryOwner , ( owner ) => {
1305+ searches . push ( { viewer : input . viewer , owner, repositories : input . repositories } ) ;
1306+ return {
1307+ items : input . repositories . map ( ( repository , index ) =>
1308+ batchedChangeRequest ( index + 1 , repository , "2026-07-02T00:00:00Z" ) ,
1309+ ) ,
1310+ truncated : false ,
1311+ } ;
1312+ } ) ,
1313+ listChangeRequestStats : ( input ) =>
1314+ Effect . map ( GitHubRepositoryOwner , ( owner ) => {
1315+ statReads . push ( { owner, count : input . changeRequests . length } ) ;
1316+ return input . changeRequests . map ( ( ref ) => ( { ...ref , additions : 1 , deletions : 1 } ) ) ;
1317+ } ) ,
1318+ } ) ,
1319+ ] ,
1320+ } ) ;
1321+ const result = yield * service . list ( { state : "open" , involvement : "all" } ) ;
1322+ assert . strictEqual ( result . entries . length , 3 ) ;
1323+ assert . sameDeepMembers ( searches , [
1324+ { viewer : "personal" , owner : null , repositories : [ "me/one" , "me/two" ] } ,
1325+ { viewer : "work" , owner : "Acme" , repositories : [ "Acme/web" ] } ,
1326+ ] ) ;
1327+ assert . strictEqual ( result . viewers [ "github.com" ] , "personal" ) ;
1328+ assert . strictEqual ( result . viewers [ "github.com/acme" ] , "work" ) ;
1329+
1330+ yield * service . listStats ( {
1331+ refs : result . entries . map ( ( { projectId, repository, number } ) => ( {
1332+ projectId,
1333+ repository,
1334+ number,
1335+ } ) ) ,
1336+ } ) ;
1337+ assert . sameDeepMembers ( statReads , [
1338+ { owner : null , count : 2 } ,
1339+ { owner : "Acme" , count : 1 } ,
1340+ ] ) ;
1341+ } ) ,
1342+ ) ;
1343+
12821344it . effect ( "routing verifies the current account on the requested host without caching it" , ( ) =>
12831345 Effect . gen ( function * ( ) {
12841346 let viewer = "first-account" ;
@@ -1295,7 +1357,11 @@ it.effect("routing verifies the current account on the requested host without ca
12951357 providers : [
12961358 fakeProvider ( "github" , {
12971359 getRoutingIdentity : ( input ) => {
1298- assert . deepStrictEqual ( input , { cwd : "/a" , host : "github.example.test" } ) ;
1360+ assert . deepStrictEqual ( input , {
1361+ cwd : "/a" ,
1362+ host : "github.example.test" ,
1363+ repository : "acme/web" ,
1364+ } ) ;
12991365 return Effect . succeed ( {
13001366 viewer,
13011367 accountId : viewer === "first-account" ? "123" : "456" ,
0 commit comments