Skip to content

Commit bb67607

Browse files
committed
Change Test Suite
1 parent 1181ed6 commit bb67607

File tree

6 files changed

+6450
-6901
lines changed

6 files changed

+6450
-6901
lines changed

index.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import {
99
} from 'react'
1010
import { ImageStyle, StyleSheet, TextStyle, ViewStyle } from 'react-native'
1111
import { Appearance, AppearanceProvider } from 'react-native-appearance'
12-
1312
type Themes<T, C> = {
1413
light: T
1514
dark: T
@@ -50,7 +49,7 @@ const createTheme: CreateTheme = (ts, initialMode = 'auto') => {
5049
: systemColorScheme !== 'no-preference'
5150
? systemColorScheme
5251
: 'light'
53-
return { ...themes[currentMode], ...common } as Theme & Common
52+
return { ...common, ...themes[currentMode] } as Theme & Common
5453
}
5554
const ThemeContext = createContext<ThemeContext<Theme, Common>>({
5655
theme: generateTheme(initialMode, ts),

package.json

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "react-native-themed-stylesheet",
3-
"version": "0.0.8",
3+
"version": "0.1.0",
44
"description": "React Native StyleSheets with Theming Support",
55
"author": "Andre Pedroza",
66
"license": "MIT",
@@ -24,8 +24,7 @@
2424
},
2525
"devDependencies": {
2626
"@babel/core": "^7.12.16",
27-
"@testing-library/jest-native": "^3.4.3",
28-
"@testing-library/react-native": "^7.1.0",
27+
"@testing-library/react-hooks": "^5.0.3",
2928
"@types/jest": "^26.0.20",
3029
"@types/react": "^17.0.1",
3130
"@types/react-native": "^0.63.48",
@@ -61,9 +60,8 @@
6160
"^.+\\.js$": "<rootDir>/node_modules/react-native/jest/preprocessor.js",
6261
"^.+\\.tsx?$": "ts-jest"
6362
},
64-
"testMatch": ["<rootDir>/tests/tests.tsx"],
63+
"testMatch": ["<rootDir>/tests/tests.ts"],
6564
"collectCoverageFrom": ["<rootDir>/index.ts"],
66-
"moduleFileExtensions": ["js", "ts", "tsx"],
67-
"setupFilesAfterEnv": ["@testing-library/jest-native/extend-expect"]
65+
"moduleFileExtensions": ["js", "ts", "tsx"]
6866
}
6967
}
Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,8 @@ export const themes1 = {
66
textColor: '#fff'
77
},
88
common: {
9-
fontSize: 12
9+
fontSize: 12,
10+
textColor: '#000'
1011
}
1112
}
1213

@@ -20,7 +21,7 @@ export const themes2 = {
2021
}
2122

2223
export const style1 = (
23-
theme: typeof themes1.light & typeof themes1.common
24+
theme: typeof themes1.common & typeof themes1.light
2425
) => ({
2526
text: {
2627
color: theme.textColor,

tests/tests.ts

Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
import { renderHook, act } from '@testing-library/react-hooks/native'
2+
import { Appearance } from '../__mocks__/react-native-appearance'
3+
import { createTheme } from '..'
4+
import { style1, style2, themes1, themes2 } from './fixture'
5+
import { TextStyle } from 'react-native'
6+
7+
beforeEach(() => {
8+
Appearance.preference = 'no-preference'
9+
})
10+
11+
describe('With Common Prop and Auto Mode', () => {
12+
const { ThemeProvider, useStyle, useTheme } = createTheme(themes1)
13+
test('Create style with useStyle()', () => {
14+
const { result } = renderHook(() => useStyle(style1), {
15+
wrapper: ThemeProvider
16+
})
17+
expect((result.current.text as TextStyle).color).toEqual('#ff0000')
18+
expect((result.current.text as TextStyle).fontSize).toEqual(12)
19+
})
20+
test('Create style with useTheme()', () => {
21+
const { result } = renderHook(() => useTheme(), { wrapper: ThemeProvider })
22+
expect(result.current.theme.textColor).toEqual('#ff0000')
23+
expect(result.current.theme.fontSize).toEqual(12)
24+
})
25+
})
26+
27+
describe('With Common Prop and Dark Mode', () => {
28+
const { ThemeProvider, useStyle, useTheme } = createTheme(themes1, 'dark')
29+
test('Create style with useStyle()', () => {
30+
const { result } = renderHook(() => useStyle(style1), {
31+
wrapper: ThemeProvider
32+
})
33+
expect((result.current.text as TextStyle).color).toEqual('#fff')
34+
expect((result.current.text as TextStyle).fontSize).toEqual(12)
35+
})
36+
test('Create style with useTheme()', () => {
37+
const { result } = renderHook(() => useTheme(), { wrapper: ThemeProvider })
38+
expect(result.current.theme.textColor).toEqual('#fff')
39+
expect(result.current.theme.fontSize).toEqual(12)
40+
})
41+
})
42+
43+
describe('Without Common Prop and Auto Mode', () => {
44+
const { ThemeProvider, useStyle, useTheme } = createTheme(themes2)
45+
test('Create style with useStyle()', () => {
46+
const { result } = renderHook(() => useStyle(style2), {
47+
wrapper: ThemeProvider
48+
})
49+
expect((result.current.text as TextStyle).color).toEqual('#ffff00')
50+
})
51+
test('Create style with useTheme()', () => {
52+
const { result } = renderHook(() => useTheme(), { wrapper: ThemeProvider })
53+
expect(result.current.theme.textColor).toEqual('#ffff00')
54+
})
55+
})
56+
describe('Without Common Prop and Dark Mode', () => {
57+
const { ThemeProvider, useStyle, useTheme } = createTheme(themes2, 'dark')
58+
test('Create style with useStyle()', () => {
59+
const { result } = renderHook(() => useStyle(style2), {
60+
wrapper: ThemeProvider
61+
})
62+
expect((result.current.text as TextStyle).color).toEqual('#fff')
63+
})
64+
test('Create style with useTheme()', () => {
65+
const { result } = renderHook(() => useTheme(), { wrapper: ThemeProvider })
66+
expect(result.current.theme.textColor).toEqual('#fff')
67+
})
68+
})
69+
70+
describe('Change System Preference', () => {
71+
const { ThemeProvider, useTheme } = createTheme(themes2)
72+
test('To "no-preference" to Get Light Mode', () => {
73+
const { result } = renderHook(() => useTheme(), { wrapper: ThemeProvider })
74+
act(() => {
75+
Appearance.preference = 'no-preference'
76+
})
77+
expect(result.current.theme.textColor).toEqual('#ffff00')
78+
})
79+
test('To Dark Mode', () => {
80+
const { result } = renderHook(() => useTheme(), { wrapper: ThemeProvider })
81+
act(() => {
82+
Appearance.preference = 'dark'
83+
})
84+
expect(result.current.theme.textColor).toEqual('#fff')
85+
})
86+
test('To Light Mode and then Change Manually to Dark Mode', () => {
87+
const { result } = renderHook(() => useTheme(), { wrapper: ThemeProvider })
88+
act(() => {
89+
Appearance.preference = 'light'
90+
result.current.setMode('dark')
91+
})
92+
expect(result.current.theme.textColor).toEqual('#fff')
93+
})
94+
})
95+
96+
describe('Change ThemeContext', () => {
97+
const { ThemeProvider, useTheme } = createTheme(themes2)
98+
test('Change Themes', () => {
99+
const { result } = renderHook(() => useTheme(), { wrapper: ThemeProvider })
100+
act(() => {
101+
result.current.setThemes(themes1)
102+
})
103+
expect(result.current.theme.textColor).toEqual('#ff0000')
104+
expect(
105+
(result.current.theme as { textColor: string; fontSize: number }).fontSize
106+
).toEqual(12)
107+
})
108+
test('Change Mode to Dark', () => {
109+
const { result } = renderHook(() => useTheme(), { wrapper: ThemeProvider })
110+
act(() => {
111+
result.current.setMode('dark')
112+
})
113+
expect(result.current.theme.textColor).toEqual('#fff')
114+
})
115+
})
116+
117+
describe('No Changes Triggered', () => {
118+
const { ThemeProvider, useTheme } = createTheme(themes2)
119+
test('Change Mode to Current Mode', () => {
120+
const { result } = renderHook(() => useTheme(), { wrapper: ThemeProvider })
121+
expect(result.current.theme.textColor).toEqual('#ffff00')
122+
act(() => {
123+
result.current.setMode('auto')
124+
})
125+
expect(result.current.theme.textColor).toEqual('#ffff00')
126+
})
127+
})

0 commit comments

Comments
 (0)