diff --git a/neode-ui/src/components/InstallVersionModal.vue b/neode-ui/src/components/InstallVersionModal.vue
index 603bb108..4364f3c5 100644
--- a/neode-ui/src/components/InstallVersionModal.vue
+++ b/neode-ui/src/components/InstallVersionModal.vue
@@ -25,13 +25,22 @@
{{ t('common.loading') }}
-
-
+
{{ t('marketplace.installModalHint') }}
@@ -113,6 +122,7 @@ async function load() {
} catch (err) {
if (import.meta.env.DEV) console.warn('[InstallVersionModal] getPackageVersions failed:', err)
// Fall back to the floating "latest" so the install can still proceed.
+ versions.value = [{ version: 'latest' } as CatalogVersionInfo]
selected.value = 'latest'
} finally {
loading.value = false
diff --git a/neode-ui/src/components/__tests__/InstallVersionModal.test.ts b/neode-ui/src/components/__tests__/InstallVersionModal.test.ts
index 24fe7f8a..b4feeb4c 100644
--- a/neode-ui/src/components/__tests__/InstallVersionModal.test.ts
+++ b/neode-ui/src/components/__tests__/InstallVersionModal.test.ts
@@ -16,12 +16,14 @@ describe('Bitcoin install storage choice', () => {
versions.mockResolvedValue({ bitcoinPrune: false, default: 'latest', versions: [{ version: 'latest' }, { version: '28.4' }] })
const wrapper = modal(id)
await flushPromises()
- await wrapper.get('select').setValue('28.4')
+ await wrapper.get('input[type=radio][value="28.4"]').setValue(true)
await wrapper.get('input[type=checkbox]').setValue(true)
await wrapper.get('button').trigger('click')
expect(wrapper.emitted('confirm')).toEqual([['28.4', true]])
expect(wrapper.text()).toContain('automatic pruning')
expect(wrapper.text()).toContain('Mempool')
+ expect(wrapper.find('select').exists()).toBe(false)
+ expect(wrapper.findAll('input[type=radio]')).toHaveLength(2)
})
it('keeps automatic disk selection by default and resets on reopening', async () => {
versions.mockResolvedValue({ bitcoinPrune: false, versions: [{ version: 'latest' }] })
@@ -29,17 +31,17 @@ describe('Bitcoin install storage choice', () => {
await flushPromises()
await wrapper.get('button').trigger('click')
expect(wrapper.emitted('confirm')).toEqual([['latest', false]])
- await wrapper.get('input').setValue(true)
+ await wrapper.get('input[type=checkbox]').setValue(true)
await wrapper.setProps({ show: false })
await wrapper.setProps({ show: true })
await flushPromises()
- expect((wrapper.get('input').element as HTMLInputElement).checked).toBe(false)
+ expect((wrapper.get('input[type=checkbox]').element as HTMLInputElement).checked).toBe(false)
})
it('still allows choosing pruning when version lookup fails', async () => {
versions.mockRejectedValue(new Error('offline'))
const wrapper = modal()
await flushPromises()
- await wrapper.get('input').setValue(true)
+ await wrapper.get('input[type=checkbox]').setValue(true)
await wrapper.get('button').trigger('click')
expect(wrapper.emitted('confirm')).toEqual([['latest', true]])
})
@@ -47,7 +49,7 @@ describe('Bitcoin install storage choice', () => {
versions.mockResolvedValue({ bitcoinPrune: true, versions: [{ version: 'latest' }] })
const wrapper = modal('bitcoin-knots')
await flushPromises()
- expect((wrapper.get('input').element as HTMLInputElement).checked).toBe(true)
+ expect((wrapper.get('input[type=checkbox]').element as HTMLInputElement).checked).toBe(true)
await wrapper.get('button').trigger('click')
expect(wrapper.emitted('confirm')).toEqual([['latest', true]])
})
@@ -62,6 +64,6 @@ describe('Bitcoin install storage choice', () => {
versions.mockResolvedValue({ bitcoinPrune: false, versions: [{ version: 'latest' }] })
const wrapper = modal('other')
await flushPromises()
- expect(wrapper.find('input').exists()).toBe(false)
+ expect(wrapper.find('input[type=checkbox]').exists()).toBe(false)
})
})