test: consolidate assignment-chain integration cases (#3790)

* test: consolidate assignment-chain cases

* test: allow Windows recovery probes to finish

Each Windows recovery case invokes analysis five times. Two CI attempts
hit the 120-second limit in different cases before native work finished.
Allow 240 seconds on Windows while preserving every assertion.

---------

Co-authored-by: Gergo Magyar <gergomagyar0@gmail.com>
This commit is contained in:
Gergő Magyar 2026-10-31 11:21:28 +00:00 • committed by GitHub
parent 1f08ca38f8
commit 3e6484af6c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 4 additions and 129 deletions

View file

@ -937,18 +937,6 @@ describe('C# assignment chain propagation', () => {
expect(saveMethods.length).toBe(2);
});
it('resolves alias.Save() to User#Save via assignment chain', () => {
const calls = getRelationships(result, 'CALLS');
// Positive: alias.Save() must resolve to User#Save
const userSave = calls.find(
(c) =>
c.target === 'Save' &&
c.source === 'ProcessEntities' &&
c.targetFilePath.includes('User.cs'),
);
expect(userSave).toBeDefined();
});
it('alias.Save() does NOT resolve to Repo#Save', () => {
const calls = getRelationships(result, 'CALLS');
// Negative: alias comes from User, so only one edge to User.cs
@ -961,18 +949,6 @@ describe('C# assignment chain propagation', () => {
expect(wrongCall.length).toBe(1);
});
it('resolves rAlias.Save() to Repo#Save via assignment chain', () => {
const calls = getRelationships(result, 'CALLS');
// Positive: rAlias.Save() must resolve to Repo#Save
const repoSave = calls.find(
(c) =>
c.target === 'Save' &&
c.source === 'ProcessEntities' &&
c.targetFilePath.includes('Repo.cs'),
);
expect(repoSave).toBeDefined();
});
it('each alias resolves to its own class, not the other', () => {
const calls = getRelationships(result, 'CALLS');
const userSave = calls.find(

View file

@ -980,18 +980,6 @@ describe('Go assignment chain propagation', () => {
expect(saveMethods.length).toBe(2);
});
it('resolves alias.Save() to User#Save via assignment chain', () => {
const calls = getRelationships(result, 'CALLS');
// Positive: alias.Save() must resolve to User#Save
const userSave = calls.find(
(c) =>
c.target === 'Save' &&
c.source === 'processEntities' &&
c.targetFilePath.includes('user.go'),
);
expect(userSave).toBeDefined();
});
it('alias.Save() does NOT resolve to Repo#Save', () => {
const calls = getRelationships(result, 'CALLS');
// Negative: alias comes from User, so only one edge to user.go
@ -1004,18 +992,6 @@ describe('Go assignment chain propagation', () => {
expect(wrongCall.length).toBe(1);
});
it('resolves rAlias.Save() to Repo#Save via assignment chain', () => {
const calls = getRelationships(result, 'CALLS');
// Positive: rAlias.Save() must resolve to Repo#Save
const repoSave = calls.find(
(c) =>
c.target === 'Save' &&
c.source === 'processEntities' &&
c.targetFilePath.includes('repo.go'),
);
expect(repoSave).toBeDefined();
});
it('each alias resolves to its own struct, not the other', () => {
const calls = getRelationships(result, 'CALLS');
const userSave = calls.find(

View file

@ -1058,18 +1058,6 @@ describe('Java assignment chain propagation', () => {
expect(saveMethods.length).toBe(2);
});
it('resolves alias.save() to User#save via assignment chain', () => {
const calls = getRelationships(result, 'CALLS');
// Positive: alias.save() must resolve to User#save
const userSave = calls.find(
(c) =>
c.target === 'save' &&
c.source === 'processEntities' &&
c.targetFilePath.includes('User.java'),
);
expect(userSave).toBeDefined();
});
it('alias.save() does NOT resolve to Repo#save', () => {
const calls = getRelationships(result, 'CALLS');
// Negative: alias comes from User, so only one edge to User.java
@ -1082,18 +1070,6 @@ describe('Java assignment chain propagation', () => {
expect(wrongCall.length).toBe(1);
});
it('resolves rAlias.save() to Repo#save via assignment chain', () => {
const calls = getRelationships(result, 'CALLS');
// Positive: rAlias.save() must resolve to Repo#save
const repoSave = calls.find(
(c) =>
c.target === 'save' &&
c.source === 'processEntities' &&
c.targetFilePath.includes('Repo.java'),
);
expect(repoSave).toBeDefined();
});
it('each alias resolves to its own class, not the other', () => {
const calls = getRelationships(result, 'CALLS');
const userSave = calls.find(

View file

@ -831,28 +831,6 @@ describe('Kotlin assignment chain propagation', () => {
expect(saveMethods.length).toBe(2);
});
it('resolves alias.save() to User#save via assignment chain', () => {
const calls = getRelationships(result, 'CALLS');
const userSave = calls.find(
(c) =>
c.target === 'save' &&
c.source === 'processEntities' &&
c.targetFilePath.includes('User.kt'),
);
expect(userSave).toBeDefined();
});
it('resolves rAlias.save() to Repo#save via assignment chain', () => {
const calls = getRelationships(result, 'CALLS');
const repoSave = calls.find(
(c) =>
c.target === 'save' &&
c.source === 'processEntities' &&
c.targetFilePath.includes('Repo.kt'),
);
expect(repoSave).toBeDefined();
});
it('alias.save() does NOT resolve to Repo#save', () => {
const calls = getRelationships(result, 'CALLS');
// There should be exactly one save() call targeting User.kt from processEntities

View file

@ -1116,22 +1116,6 @@ describe('PHP assignment chain propagation', () => {
expect(saveMethods.length).toBe(2);
});
it('resolves alias->save() to User#save via assignment chain', () => {
const calls = getRelationships(result, 'CALLS');
const userSave = calls.find(
(c) => c.target === 'save' && c.source === 'process' && c.targetFilePath.includes('User.php'),
);
expect(userSave).toBeDefined();
});
it('resolves rAlias->save() to Repo#save via assignment chain', () => {
const calls = getRelationships(result, 'CALLS');
const repoSave = calls.find(
(c) => c.target === 'save' && c.source === 'process' && c.targetFilePath.includes('Repo.php'),
);
expect(repoSave).toBeDefined();
});
it('alias->save() does NOT resolve to Repo#save', () => {
const calls = getRelationships(result, 'CALLS');
// There should be exactly one save() call targeting User.php from process

View file

@ -2882,15 +2882,6 @@ describe('Python assignment chain propagation', () => {
expect(saveFns.length).toBe(2);
});
it('resolves alias.save() to User#save via assignment chain', () => {
const calls = getRelationships(result, 'CALLS');
// Positive: alias.save() must resolve to User#save
const userSave = calls.find(
(c) => c.target === 'save' && c.source === 'process' && c.targetFilePath.includes('user.py'),
);
expect(userSave).toBeDefined();
});
it('alias.save() does NOT resolve to Repo#save', () => {
const calls = getRelationships(result, 'CALLS');
// Negative: only one save call from process to User#save
@ -2900,15 +2891,6 @@ describe('Python assignment chain propagation', () => {
expect(wrongCall.length).toBe(1);
});
it('resolves r_alias.save() to Repo#save via assignment chain', () => {
const calls = getRelationships(result, 'CALLS');
// Positive: r_alias.save() must resolve to Repo#save
const repoSave = calls.find(
(c) => c.target === 'save' && c.source === 'process' && c.targetFilePath.includes('repo.py'),
);
expect(repoSave).toBeDefined();
});
it('each alias resolves to its own class, not the other', () => {
const calls = getRelationships(result, 'CALLS');
const userSave = calls.find(

View file

@ -278,6 +278,9 @@ describe('incremental graph identity before publication', () => {
await repo.cleanup();
}
},
120_000,
// Windows takes the in-place recovery path for every row: five analysis
// calls including repair refusal, full recovery, and the final no-op.
// Allow slow native checkpoints to finish before the test runner times out.
process.platform === 'win32' ? 240_000 : 120_000,
);
});