diff --git a/tests/test_downloads_tab_workflow_route.mjs b/tests/test_downloads_tab_workflow_route.mjs index 3fa57f3..3bbcc43 100644 --- a/tests/test_downloads_tab_workflow_route.mjs +++ b/tests/test_downloads_tab_workflow_route.mjs @@ -5,6 +5,7 @@ import assert from 'node:assert/strict'; import { Window } from 'happy-dom'; import { html, + getFilenameFromPath, normalizePathIdentity, pollBackgroundTask, safeStorage, @@ -63,6 +64,7 @@ void normalizeSha256; void pollBackgroundTask; void buildLoadedModelTokenStrings; void groupLoadedModelsByCategory; +void getFilenameFromPath; const projectRoot = path.resolve(import.meta.dirname, '..'); const getSvgIcon = () => ''; @@ -3617,6 +3619,23 @@ test('model info hash readers preserve field precedence and casing', () => { assert.equal(getSourceModelDisplayHash({}), ''); }); +test('source model comparable filenames preserve basename and trailing separator behavior', () => { + const getSourceModelComparableFilename = eval( + `(${extractMethod(modelInfoMethodsSource, 'getSourceModelComparableFilename')})` + ); + + assert.equal( + getSourceModelComparableFilename('Models\\Checkpoints\\Model.SAFE TENSORS'), + 'model.safe tensors', + ); + assert.equal( + getSourceModelComparableFilename('models/checkpoints/model.safetensors/'), + '', + ); + assert.equal(getSourceModelComparableFilename(' model.safetensors '), 'model.safetensors'); + assert.equal(getSourceModelComparableFilename(''), ''); +}); + test('model info metadata source labels match the shared source label contract', () => { const getInfoMetadataSourceLabel = eval(`(${extractMethod(modelInfoMethodsSource, 'getInfoMetadataSourceLabel')})`); const dialog = { diff --git a/web/resolver/views/model_info_methods.js b/web/resolver/views/model_info_methods.js index f92a0ec..d9a4f3f 100644 --- a/web/resolver/views/model_info_methods.js +++ b/web/resolver/views/model_info_methods.js @@ -2961,9 +2961,9 @@ export const modelInfoMethods = { }, getSourceModelComparableFilename(value = '') { - return String(value || '') - .split(/[\\/]+/) - .pop() + const normalizedValue = String(value || ''); + if (/[\\/]+$/.test(normalizedValue)) return ''; + return getFilenameFromPath(normalizedValue) .trim() .toLowerCase(); },