@@ -28,15 +28,23 @@ import { hasVoiceSigilMarker, stripVoiceSigils } from "../_helpers/voiceSigils.j
2828
2929const AUDIT_FILE = path . join ( process . cwd ( ) , "data" , "audit_log.jsonl" ) ;
3030const DATA_DIR = path . resolve ( process . cwd ( ) , "data" ) ;
31+ const ORIGINAL_ENGAGEMENT_AI_APPROVED = process . env . ENGAGEMENT_AI_APPROVED ;
32+ const ORIGINAL_ENGAGEMENT_OPT_IN_HANDLES = process . env . ENGAGEMENT_OPT_IN_HANDLES ;
33+ const ORIGINAL_ENGAGEMENT_OPT_OUT_HANDLES = process . env . ENGAGEMENT_OPT_OUT_HANDLES ;
3134
3235vi . mock ( "../../src/ops/launchGate.js" , ( ) => ( {
3336 shouldPost : ( ) => ( { action : "post" as const } ) ,
3437} ) ) ;
3538
39+ vi . mock ( "../../src/engagement/targetLookup.js" , ( ) => ( {
40+ targetTweetExists : vi . fn ( async ( ) => true ) ,
41+ } ) ) ;
42+
3643function makeMention ( overrides : Partial < Mention > = { } ) : Mention {
3744 return {
3845 id : `post_${ Date . now ( ) } _${ Math . random ( ) . toString ( 36 ) . slice ( 2 , 8 ) } ` ,
39- text : "$SOL mooning 100x gem guaranteed easy money LFG" ,
46+ text :
47+ "@Gnomes_onchain can you break down the current SOL setup, explain what evidence supports the move, and tell me whether this is a real breakout or just empty hype? Need the actual signal, not vibes." ,
4048 author_id : "user_1" ,
4149 authorUsername : "testuser" ,
4250 conversation_id : null ,
@@ -65,6 +73,9 @@ describe("pipeline postability integration", () => {
6573
6674 beforeEach ( async ( ) => {
6775 process . env . USE_REDIS = "false" ;
76+ process . env . ENGAGEMENT_AI_APPROVED = "true" ;
77+ process . env . ENGAGEMENT_OPT_IN_HANDLES = "testuser" ;
78+ process . env . ENGAGEMENT_OPT_OUT_HANDLES = "" ;
6879 resetStoreCache ( ) ;
6980 await cacheClear ( ) ;
7081 if ( fs . existsSync ( AUDIT_FILE ) ) fs . unlinkSync ( AUDIT_FILE ) ;
@@ -75,21 +86,37 @@ describe("pipeline postability integration", () => {
7586 afterEach ( ( ) => {
7687 persistSpy . mockRestore ( ) ;
7788 if ( fs . existsSync ( AUDIT_FILE ) ) fs . unlinkSync ( AUDIT_FILE ) ;
89+ if ( ORIGINAL_ENGAGEMENT_AI_APPROVED === undefined ) {
90+ delete process . env . ENGAGEMENT_AI_APPROVED ;
91+ } else {
92+ process . env . ENGAGEMENT_AI_APPROVED = ORIGINAL_ENGAGEMENT_AI_APPROVED ;
93+ }
94+ if ( ORIGINAL_ENGAGEMENT_OPT_IN_HANDLES === undefined ) {
95+ delete process . env . ENGAGEMENT_OPT_IN_HANDLES ;
96+ } else {
97+ process . env . ENGAGEMENT_OPT_IN_HANDLES = ORIGINAL_ENGAGEMENT_OPT_IN_HANDLES ;
98+ }
99+ if ( ORIGINAL_ENGAGEMENT_OPT_OUT_HANDLES === undefined ) {
100+ delete process . env . ENGAGEMENT_OPT_OUT_HANDLES ;
101+ } else {
102+ process . env . ENGAGEMENT_OPT_OUT_HANDLES = ORIGINAL_ENGAGEMENT_OPT_OUT_HANDLES ;
103+ }
78104 } ) ;
79105
80106 describe ( "Case A — happy path publish" , ( ) => {
81107 it ( "proves publishable output is same string in result, audit, and xClient.reply" , async ( ) => {
82108 const safeReply = "Zero proof, pure noise." ;
83109 const deps = makeDeps ( safeReply ) ;
84110 const mention = makeMention ( ) ;
111+ const configTestMode = { ...DEFAULT_CANONICAL_CONFIG , test_mode : true } ;
85112
86113 const replySpy = vi . fn ( ) . mockImplementation ( async ( text : string , _mentionId : string ) => {
87114 assertPublicTextSafe ( text , { route : "XClient.reply" } ) ;
88115 return { id : "tid" , text } ;
89116 } ) ;
90117 const xClient = { reply : replySpy } as ReturnType < typeof import ( "../../src/clients/xClient.js" ) . createXClient > ;
91118
92- const result = await processCanonicalMention ( deps , xClient , mention , false ) ;
119+ const result = await processCanonicalMention ( deps , xClient , mention , false , "mentions" , configTestMode ) ;
93120
94121 expect ( result ) . toBeDefined ( ) ;
95122 expect ( result ! . action ) . toBe ( "publish" ) ;
@@ -124,12 +151,12 @@ describe("pipeline postability integration", () => {
124151 const longReply = "A" . repeat ( 300 ) ;
125152 const deps = makeDeps ( longReply ) ;
126153 const mention = makeMention ( ) ;
127- const configNoRepair = { ...DEFAULT_CANONICAL_CONFIG , repair_enabled : false } ;
154+ const configNoRepair = { ...DEFAULT_CANONICAL_CONFIG , repair_enabled : false , test_mode : true } ;
128155
129156 const replySpy = vi . fn ( ) . mockResolvedValue ( { id : "tid" , text : "" } ) ;
130157 const xClient = { reply : replySpy } as ReturnType < typeof import ( "../../src/clients/xClient.js" ) . createXClient > ;
131158
132- const result = await processCanonicalMention ( deps , xClient , mention , false , configNoRepair ) ;
159+ const result = await processCanonicalMention ( deps , xClient , mention , false , "mentions" , configNoRepair ) ;
133160
134161 expect ( result ) . toBeDefined ( ) ;
135162 expect ( result ! . action ) . toBe ( "skip" ) ;
@@ -150,11 +177,12 @@ describe("pipeline postability integration", () => {
150177 const guardUnsafeReply = "Your score is 100" ;
151178 const deps = makeDeps ( guardUnsafeReply ) ;
152179 const mention = makeMention ( ) ;
180+ const configTestMode = { ...DEFAULT_CANONICAL_CONFIG , test_mode : true } ;
153181
154182 const replySpy = vi . fn ( ) . mockResolvedValue ( { id : "tid" , text : "" } ) ;
155183 const xClient = { reply : replySpy } as ReturnType < typeof import ( "../../src/clients/xClient.js" ) . createXClient > ;
156184
157- const result = await processCanonicalMention ( deps , xClient , mention , false ) ;
185+ const result = await processCanonicalMention ( deps , xClient , mention , false , "mentions" , configTestMode ) ;
158186
159187 expect ( result ) . toBeDefined ( ) ;
160188 expect ( result ! . action ) . toBe ( "skip" ) ;
@@ -174,14 +202,15 @@ describe("pipeline postability integration", () => {
174202 const safeReply = "Nice hype, zero proof." ;
175203 const deps = makeDeps ( safeReply ) ;
176204 const mention = makeMention ( ) ;
205+ const configTestMode = { ...DEFAULT_CANONICAL_CONFIG , test_mode : true } ;
177206
178207 const replySpy = vi . fn ( ) . mockImplementation ( async ( text : string ) => {
179208 assertPublicTextSafe ( text , { route : "XClient.reply" } ) ;
180209 return { id : "tid" , text } ;
181210 } ) ;
182211 const xClient = { reply : replySpy } as ReturnType < typeof import ( "../../src/clients/xClient.js" ) . createXClient > ;
183212
184- const result = await processCanonicalMention ( deps , xClient , mention , false ) ;
213+ const result = await processCanonicalMention ( deps , xClient , mention , false , "mentions" , configTestMode ) ;
185214
186215 expect ( result ) . toBeDefined ( ) ;
187216 expect ( result ! . action ) . toBe ( "publish" ) ;
0 commit comments