Skip to content
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion app/composables/usePreferencesProvider.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { defu } from 'defu'
import { createDefu } from 'defu'

/**
* Abstraction for preferences storage
Expand All @@ -13,6 +13,13 @@ interface StorageProvider<T> {
remove: () => void
}

const defu = createDefu((object, key, value) => {
if (Array.isArray(object[key]) && Array.isArray(value)) {
object[key] = value
return true
}
})
Comment thread
ghostdevv marked this conversation as resolved.

/**
* Creates a localStorage-based storage provider
*/
Expand Down
63 changes: 63 additions & 0 deletions test/nuxt/composables/use-preferences-provider.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
import { describe, it, expect, beforeEach } from 'vitest'
import { defineComponent, onMounted } from 'vue'
import { mount } from '@vue/test-utils'
import { usePreferencesProvider } from '../../../app/composables/usePreferencesProvider'
Comment thread
rzzf marked this conversation as resolved.

const STORAGE_KEY = 'npmx-list-prefs'

function mountWithSetup(run: () => void) {
return mount(
defineComponent({
name: 'TestHarness',
setup() {
run()
return () => null
},
}),
{ attachTo: document.body },
)
}

function setLocalStorage(stored: Record<string, any>) {
localStorage.setItem(STORAGE_KEY, JSON.stringify(stored))
}

describe('usePreferencesProvider', () => {
beforeEach(() => {
localStorage.clear()
})

it('initializes with default values when storage is empty', () => {
mountWithSetup(() => {
const defaults = { theme: 'light', cols: ['name', 'version'] }
const { data } = usePreferencesProvider(defaults)
onMounted(() => {
expect(data.value).toEqual(defaults)
})
})
})

it('loads values from localStorage', () => {
mountWithSetup(() => {
const defaults = { theme: 'light' }
const stored = { theme: 'dark' }
setLocalStorage(stored)
const { data } = usePreferencesProvider(defaults)
onMounted(() => {
expect(data.value).toEqual(stored)
})
})
})

it('handles array merging by replacement (preventing duplicates)', () => {
Comment thread
rzzf marked this conversation as resolved.
Outdated
mountWithSetup(() => {
const defaults = { cols: ['name', 'version', 'date'] }
const stored = { cols: ['name', 'version'] }
setLocalStorage(stored)
const { data } = usePreferencesProvider(defaults)
onMounted(() => {
expect(data.value.cols).toEqual(['name', 'version'])
})
})
})
})
Loading