1- import { describe , expect , test } from "bun:test" ;
1+ import { describe , expect , spyOn , test } from "bun:test" ;
2+ import * as errorSink from "@corbits/error-sink" ;
23import {
4+ fireConnectedHook ,
35 fireInferenceCredentialSeedableHook ,
46 type InferenceCredentialSeedableInfo ,
7+ type ServiceConnectedInfo ,
58} from "./connected-hook" ;
69
710function seedableInfo ( ) : InferenceCredentialSeedableInfo {
@@ -15,6 +18,46 @@ function seedableInfo(): InferenceCredentialSeedableInfo {
1518 } ;
1619}
1720
21+ function connectedInfo ( ) : ServiceConnectedInfo {
22+ return {
23+ tenantId : "tenant_1" ,
24+ principalId : "principal_1" ,
25+ connectorId : "github" ,
26+ displayName : "GitHub" ,
27+ } ;
28+ }
29+
30+ describe ( "fireConnectedHook" , ( ) => {
31+ test ( "does nothing when no hook is wired" , async ( ) => {
32+ await expect (
33+ fireConnectedHook ( undefined , ( ) => { } , connectedInfo ( ) ) ,
34+ ) . resolves . toBeUndefined ( ) ;
35+ } ) ;
36+
37+ test ( "logs and reports a hook failure rather than breaking the connect" , async ( ) => {
38+ const report = spyOn ( errorSink , "reportError" ) . mockReturnValue ( "ref_test" ) ;
39+ const logged : string [ ] = [ ] ;
40+ await expect (
41+ fireConnectedHook (
42+ ( ) => {
43+ throw new Error ( "card settle unavailable" ) ;
44+ } ,
45+ ( line ) => logged . push ( line ) ,
46+ connectedInfo ( ) ,
47+ ) ,
48+ ) . resolves . toBeUndefined ( ) ;
49+ expect ( logged ) . toHaveLength ( 1 ) ;
50+ expect ( report ) . toHaveBeenCalledTimes ( 1 ) ;
51+ expect ( report . mock . calls [ 0 ] ?. [ 0 ] ) . toBeInstanceOf ( Error ) ;
52+ expect ( report . mock . calls [ 0 ] ?. [ 1 ] ) . toMatchObject ( {
53+ operation : "fire_connected_hook" ,
54+ tenantId : "tenant_1" ,
55+ extra : { connectorId : "github" } ,
56+ } ) ;
57+ report . mockRestore ( ) ;
58+ } ) ;
59+ } ) ;
60+
1861describe ( "fireInferenceCredentialSeedableHook" , ( ) => {
1962 test ( "does nothing when no hook is wired" , async ( ) => {
2063 await expect (
@@ -34,7 +77,8 @@ describe("fireInferenceCredentialSeedableHook", () => {
3477 expect ( calls ) . toEqual ( [ seedableInfo ( ) ] ) ;
3578 } ) ;
3679
37- test ( "logs and swallows a hook failure rather than breaking the connect" , async ( ) => {
80+ test ( "logs and reports a hook failure rather than breaking the connect" , async ( ) => {
81+ const report = spyOn ( errorSink , "reportError" ) . mockReturnValue ( "ref_test" ) ;
3882 const logged : string [ ] = [ ] ;
3983 await expect (
4084 fireInferenceCredentialSeedableHook (
@@ -48,5 +92,13 @@ describe("fireInferenceCredentialSeedableHook", () => {
4892 expect ( logged ) . toHaveLength ( 1 ) ;
4993 expect ( logged [ 0 ] ) . toContain ( "tenant_1" ) ;
5094 expect ( logged [ 0 ] ) . toContain ( "drain unavailable" ) ;
95+ expect ( report ) . toHaveBeenCalledTimes ( 1 ) ;
96+ expect ( report . mock . calls [ 0 ] ?. [ 0 ] ) . toBeInstanceOf ( Error ) ;
97+ expect ( report . mock . calls [ 0 ] ?. [ 1 ] ) . toMatchObject ( {
98+ operation : "fire_inference_credential_seedable_hook" ,
99+ tenantId : "tenant_1" ,
100+ extra : { provider : "ollama" } ,
101+ } ) ;
102+ report . mockRestore ( ) ;
51103 } ) ;
52104} ) ;
0 commit comments