]> git.ipfire.org Git - thirdparty/vuejs/pinia.git/commitdiff
feat(testing): restoreGetters function
authorEduardo San Martin Morote <posva13@gmail.com>
Mon, 8 May 2023 16:40:01 +0000 (18:40 +0200)
committerEduardo San Martin Morote <posva13@gmail.com>
Mon, 8 May 2023 16:40:01 +0000 (18:40 +0200)
packages/testing/src/restoreGetters.spec.ts [new file with mode: 0644]
packages/testing/src/restoreGetters.ts [new file with mode: 0644]

diff --git a/packages/testing/src/restoreGetters.spec.ts b/packages/testing/src/restoreGetters.spec.ts
new file mode 100644 (file)
index 0000000..f3de1ce
--- /dev/null
@@ -0,0 +1,48 @@
+import { defineStore } from 'pinia'
+import { computed, ref } from 'vue'
+import { describe, expect, it } from 'vitest'
+import { createTestingPinia } from './testing'
+import { restoreGetter } from './restoreGetters'
+
+describe('restoreGetters', () => {
+  it('allows overriding getters', () => {
+    const useStore = defineStore('lol', {
+      state: () => ({ n: 0 }),
+      getters: {
+        double: (state) => state.n * 2,
+      },
+    })
+    const pinia = createTestingPinia()
+    const store = useStore(pinia)
+
+    store.double = 3
+    expect(store.double).toBe(3)
+    restoreGetter(store, 'double')
+    expect(store.double).toBe(0)
+  })
+
+  tds(() => {
+    const s1 = defineStore('s1', () => {
+      const n = ref(0)
+      const double = computed(() => n.value * 2)
+      return { n, double }
+    })()
+
+    const s2 = defineStore('s2', {
+      state: () => ({ n: 0 }),
+      getters: {
+        double: (state) => state.n * 2,
+      },
+    })()
+
+    restoreGetter(s1, 'double')
+    restoreGetter(s2, 'double')
+
+    // @ts-expect-error: not a getter
+    restoreGetter(s1, 'n')
+    // @ts-expect-error: not a getter
+    restoreGetter(s2, 'n')
+  })
+})
+
+function tds(_fn: Function) {}
diff --git a/packages/testing/src/restoreGetters.ts b/packages/testing/src/restoreGetters.ts
new file mode 100644 (file)
index 0000000..ed6ed53
--- /dev/null
@@ -0,0 +1,38 @@
+import {
+  Store,
+  StateTree,
+  _ExtractGettersFromSetupStore_Keys,
+  defineStore,
+} from 'pinia'
+import { ref, computed } from 'vue-demi'
+
+export function restoreGetter<G>(
+  store: Store<string, StateTree, G, any>,
+  getter: keyof G
+): void
+export function restoreGetter<SS>(
+  store: SS,
+  getter: _ExtractGettersFromSetupStore_Keys<SS>
+): void
+export function restoreGetter<G>(store: Store, getter: any): void {
+  // @ts-expect-error: private api
+  store[getter] = undefined
+}
+
+function tds() {
+  const s1 = defineStore('s1', () => {
+    const n = ref(0)
+    const double = computed(() => n.value * 2)
+    return { n, double }
+  })()
+
+  const s2 = defineStore('s2', {
+    state: () => ({ n: 0 }),
+    getters: {
+      double: (state) => state.n * 2,
+    },
+  })()
+
+  restoreGetter(s1, 'double')
+  restoreGetter(s2, 'double')
+}