feat: automate extension updates across Windows hosts

This commit is contained in:
inman committed 2026-09-03 15:54:22 +08:00
1 parent 500034bb63
commit f08aac0c9e
36 files changed
+2996 -71

No files matched your search

+25 -6
View File
@@ -1318,7 +1318,7 @@ test('passenger explicit server success is terminal without a post-save row requ
assert.doesNotMatch(passengerBranch, /passengerRequery|verifyLifecycleOperation/);
assert.doesNotMatch(background, /attemptAutomaticPassengerReconciliation/);
assert.match(background, /名单已取得 ERP 明确成功响应,按业务规则确认录入成功/);
assert.match(platformApp, /REQUIRED_EXTENSION_VERSION = '0\.5\.166'/);
assert.match(platformApp, /REQUIRED_EXTENSION_VERSION = '0\.5\.167'/);
});
test('uncertain lifecycle writes can only converge through a read-only plugin requery', async () => {
@@ -1525,6 +1525,25 @@ test('lifecycle execution keeps the MV3 worker alive until the durable task sett
assert.match(background, /arrangement_resource_candidate_data_missing/);
});
test('extension update reload requires a fully idle durable execution state', async () => {
const [background, bridge, platform] = await Promise.all([
readFile(new URL('../chrome-extension/ltjt-order-assistant/background.js', import.meta.url), 'utf8'),
readFile(new URL('../chrome-extension/ltjt-order-assistant/business-bridge.js', import.meta.url), 'utf8'),
readFile(new URL('../LianSyn-platform/app.js', import.meta.url), 'utf8')
]);
assert.match(background, /async function extensionUpdateSafetyStatus\(\)/);
assert.match(background, /\['running', 'write_started', 'submitted', 'uncertain'\]/);
assert.match(background, /saved_unverified\|execution_uncertain\|reconciliation_pending/);
assert.match(background, /message\?\.type === 'LTJT_EXTENSION_UPDATE_STATUS'/);
assert.match(background, /message\?\.type === 'LTJT_APPLY_EXTENSION_UPDATE'/);
assert.match(background, /if \(comparison >= 0\)/);
assert.match(background, /chrome\.runtime\.reload\(\)/);
assert.match(bridge, /message\.type === 'APPLY_EXTENSION_UPDATE'/);
assert.match(bridge, /type: 'LTJT_APPLY_EXTENSION_UPDATE'/);
assert.match(platform, /extension_update_safe: result\.extension_update\?\.safe === true/);
assert.match(platform, /extensionUpdateBlocksExecution/);
});
test('ERP browser injection is host-permission gated and fail-closed with diagnostics', async () => {
const [manifestText, background, platform] = await Promise.all([
readFile(new URL('../chrome-extension/ltjt-order-assistant/manifest.json', import.meta.url), 'utf8'),
@@ -1948,7 +1967,7 @@ test('delete guard distinguishes independent, shared child, and shared parent ro
for (const operation of operations) assert.equal(plans.validateOperation(operation).ok, true, plans.validateOperation(operation).blockers.join('; '));
const mapping = JSON.parse(await readFile(new URL('../mappings/lifecycle.mapping.json', import.meta.url), 'utf8'));
assert.equal(mapping.current_extension_version, '0.5.166');
assert.equal(mapping.current_extension_version, '0.5.167');
assert.equal(
mapping.updates.order_update_independent.field_mapped_pending_live_validation['pax.child_no_bed'],
'ertrenshu'
@@ -2331,10 +2350,10 @@ test('schema and browser adapters contain the v2 safety fields and no confirm ov
assert.match(inpage, /`ys_danweiid\$\{index\}`, resolvedCustomerId/);
assert.doesNotMatch(inpage, /product_customer_source_region|sourceRegionCheck|source_reference/);
assert.doesNotMatch(teamBatchInpage, /product_customer_source_region|sourceRegionCheck/);
assert.equal(extensionManifest.version, '0.5.166');
assert.match(inpage, /version: '0\.5\.166'/);
assert.match(teamBatchInpage, /version: '0\.5\.166'/);
assert.match(platformApp, /REQUIRED_EXTENSION_VERSION = '0\.5\.166'/);
assert.equal(extensionManifest.version, '0.5.167');
assert.match(inpage, /version: '0\.5\.167'/);
assert.match(teamBatchInpage, /version: '0\.5\.167'/);
assert.match(platformApp, /REQUIRED_EXTENSION_VERSION = '0\.5\.167'/);
assert.match(inpage, /function strictIsoDate\(value\)/);
assert.match(inpage, /const startDate = strictIsoDate\(controlCanonicalValue\(form, 'riqi0'\)\)/);
assert.match(inpage, /const endDate = strictIsoDate\(controlCanonicalValue\(form, 'riqis0'\)\)/);