expo-popcore-app/stores/templateSocialStore.test.ts

353 lines
10 KiB
TypeScript

import { renderHook, act } from '@testing-library/react-native'
import { useTemplateSocialStore } from './templateSocialStore'
describe('useTemplateSocialStore', () => {
beforeEach(() => {
// 每个测试前清空 store 状态
const { result } = renderHook(() => useTemplateSocialStore())
act(() => {
result.current.clear()
})
})
describe('initial state', () => {
it('should have empty likedMap initially', () => {
const { result } = renderHook(() => useTemplateSocialStore())
expect(result.current.likedMap).toEqual({})
})
it('should have empty favoritedMap initially', () => {
const { result } = renderHook(() => useTemplateSocialStore())
expect(result.current.favoritedMap).toEqual({})
})
})
describe('setLiked', () => {
it('should set liked status for a template', () => {
const { result } = renderHook(() => useTemplateSocialStore())
act(() => {
result.current.setLiked('template-1', true)
})
expect(result.current.likedMap['template-1']).toBe(true)
})
it('should override existing liked status', () => {
const { result } = renderHook(() => useTemplateSocialStore())
act(() => {
result.current.setLiked('template-1', true)
})
act(() => {
result.current.setLiked('template-1', false)
})
expect(result.current.likedMap['template-1']).toBe(false)
})
it('should not affect other templates when setting one', () => {
const { result } = renderHook(() => useTemplateSocialStore())
act(() => {
result.current.setLiked('template-1', true)
result.current.setLiked('template-2', false)
})
expect(result.current.likedMap['template-1']).toBe(true)
expect(result.current.likedMap['template-2']).toBe(false)
})
})
describe('setFavorited', () => {
it('should set favorited status for a template', () => {
const { result } = renderHook(() => useTemplateSocialStore())
act(() => {
result.current.setFavorited('template-1', true)
})
expect(result.current.favoritedMap['template-1']).toBe(true)
})
it('should override existing favorited status', () => {
const { result } = renderHook(() => useTemplateSocialStore())
act(() => {
result.current.setFavorited('template-1', true)
})
act(() => {
result.current.setFavorited('template-1', false)
})
expect(result.current.favoritedMap['template-1']).toBe(false)
})
it('should not affect other templates when setting one', () => {
const { result } = renderHook(() => useTemplateSocialStore())
act(() => {
result.current.setFavorited('template-1', true)
result.current.setFavorited('template-2', false)
})
expect(result.current.favoritedMap['template-1']).toBe(true)
expect(result.current.favoritedMap['template-2']).toBe(false)
})
})
describe('setLikedStates', () => {
it('should batch set liked states', () => {
const { result } = renderHook(() => useTemplateSocialStore())
act(() => {
result.current.setLikedStates({
'template-1': true,
'template-2': false,
'template-3': true,
})
})
expect(result.current.likedMap['template-1']).toBe(true)
expect(result.current.likedMap['template-2']).toBe(false)
expect(result.current.likedMap['template-3']).toBe(true)
})
it('should merge with existing liked states', () => {
const { result } = renderHook(() => useTemplateSocialStore())
act(() => {
result.current.setLiked('template-1', true)
})
act(() => {
result.current.setLikedStates({
'template-2': true,
'template-3': false,
})
})
expect(result.current.likedMap['template-1']).toBe(true)
expect(result.current.likedMap['template-2']).toBe(true)
expect(result.current.likedMap['template-3']).toBe(false)
})
it('should override existing states with batch update', () => {
const { result } = renderHook(() => useTemplateSocialStore())
act(() => {
result.current.setLiked('template-1', true)
})
act(() => {
result.current.setLikedStates({
'template-1': false,
'template-2': true,
})
})
expect(result.current.likedMap['template-1']).toBe(false)
expect(result.current.likedMap['template-2']).toBe(true)
})
})
describe('setFavoritedStates', () => {
it('should batch set favorited states', () => {
const { result } = renderHook(() => useTemplateSocialStore())
act(() => {
result.current.setFavoritedStates({
'template-1': true,
'template-2': false,
'template-3': true,
})
})
expect(result.current.favoritedMap['template-1']).toBe(true)
expect(result.current.favoritedMap['template-2']).toBe(false)
expect(result.current.favoritedMap['template-3']).toBe(true)
})
it('should merge with existing favorited states', () => {
const { result } = renderHook(() => useTemplateSocialStore())
act(() => {
result.current.setFavorited('template-1', true)
})
act(() => {
result.current.setFavoritedStates({
'template-2': true,
'template-3': false,
})
})
expect(result.current.favoritedMap['template-1']).toBe(true)
expect(result.current.favoritedMap['template-2']).toBe(true)
expect(result.current.favoritedMap['template-3']).toBe(false)
})
it('should override existing states with batch update', () => {
const { result } = renderHook(() => useTemplateSocialStore())
act(() => {
result.current.setFavorited('template-1', true)
})
act(() => {
result.current.setFavoritedStates({
'template-1': false,
'template-2': true,
})
})
expect(result.current.favoritedMap['template-1']).toBe(false)
expect(result.current.favoritedMap['template-2']).toBe(true)
})
})
describe('isLiked', () => {
it('should return true for liked template', () => {
const { result } = renderHook(() => useTemplateSocialStore())
act(() => {
result.current.setLiked('template-1', true)
})
expect(result.current.isLiked('template-1')).toBe(true)
})
it('should return false for unliked template', () => {
const { result } = renderHook(() => useTemplateSocialStore())
act(() => {
result.current.setLiked('template-1', false)
})
expect(result.current.isLiked('template-1')).toBe(false)
})
it('should return false for non-existent template', () => {
const { result } = renderHook(() => useTemplateSocialStore())
expect(result.current.isLiked('template-1')).toBe(false)
})
})
describe('isFavorited', () => {
it('should return true for favorited template', () => {
const { result } = renderHook(() => useTemplateSocialStore())
act(() => {
result.current.setFavorited('template-1', true)
})
expect(result.current.isFavorited('template-1')).toBe(true)
})
it('should return false for unfavorited template', () => {
const { result } = renderHook(() => useTemplateSocialStore())
act(() => {
result.current.setFavorited('template-1', false)
})
expect(result.current.isFavorited('template-1')).toBe(false)
})
it('should return false for non-existent template', () => {
const { result } = renderHook(() => useTemplateSocialStore())
expect(result.current.isFavorited('template-1')).toBe(false)
})
})
describe('clear', () => {
it('should clear all likedMap and favoritedMap', () => {
const { result } = renderHook(() => useTemplateSocialStore())
act(() => {
result.current.setLikedStates({
'template-1': true,
'template-2': false,
})
result.current.setFavoritedStates({
'template-1': true,
'template-3': false,
})
})
expect(result.current.likedMap['template-1']).toBe(true)
expect(result.current.favoritedMap['template-1']).toBe(true)
act(() => {
result.current.clear()
})
expect(result.current.likedMap).toEqual({})
expect(result.current.favoritedMap).toEqual({})
})
it('should allow setting states after clear', () => {
const { result } = renderHook(() => useTemplateSocialStore())
act(() => {
result.current.setLiked('template-1', true)
})
act(() => {
result.current.clear()
})
act(() => {
result.current.setLiked('template-2', true)
})
expect(result.current.likedMap['template-2']).toBe(true)
expect(result.current.likedMap['template-1']).toBeUndefined()
})
})
describe('integration tests', () => {
it('should handle mixed liked and favorited states', () => {
const { result } = renderHook(() => useTemplateSocialStore())
act(() => {
result.current.setLiked('template-1', true)
result.current.setFavorited('template-1', false)
result.current.setLiked('template-2', false)
result.current.setFavorited('template-2', true)
})
expect(result.current.isLiked('template-1')).toBe(true)
expect(result.current.isFavorited('template-1')).toBe(false)
expect(result.current.isLiked('template-2')).toBe(false)
expect(result.current.isFavorited('template-2')).toBe(true)
})
it('should maintain independence between likedMap and favoritedMap', () => {
const { result } = renderHook(() => useTemplateSocialStore())
act(() => {
result.current.setLiked('template-1', true)
})
act(() => {
result.current.setFavorited('template-1', true)
})
act(() => {
result.current.clear()
})
// clear 应该清空两个 map
expect(result.current.isLiked('template-1')).toBe(false)
expect(result.current.isFavorited('template-1')).toBe(false)
})
})
})