testing — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited testing (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
jest.config.js:
module.exports = {
preset: 'jest-expo',
setupFilesAfterFramework: ['@testing-library/react-native/extend-expect'],
setupFiles: ['react-native-reanimated/mock', './src/test/setup.ts'],
modulePathIgnorePatterns: ['<rootDir>/node_modules/'],
transformIgnorePatterns: [
'node_modules/(?!((jest-)?react-native|@react-native(-community)?|expo(nent)?|@expo(nent)?/.*|nativewind|react-native-reanimated|react-native-gesture-handler|react-native-mmkv))',
],
moduleNameMapper: {
'^@/(.*)$': '<rootDir>/src/$1',
},
}src/test/setup.ts:
import { queryClient } from '@/libs/query-client'
beforeEach(() => queryClient.clear())package.json:
"devDependencies": {
"jest-expo": "^52.0.0",
"@testing-library/react-native": "^12.0.0",
"react-test-renderer": "18.3.1"
}// src/test/test-utils.tsx
import { QueryClientProvider } from '@tanstack/react-query'
import { render } from '@testing-library/react-native'
import { queryClient } from '@/libs/query-client'
function TestWrapper({ children }: { children: React.ReactNode }) {
return (
<QueryClientProvider client={queryClient}>
{children}
</QueryClientProvider>
)
}
function renderWithProviders(ui: React.ReactElement) {
return render(ui, { wrapper: TestWrapper })
}
export { renderWithProviders }import { renderWithProviders } from '@/test/test-utils'
import { screen, userEvent } from '@testing-library/react-native'
import { server } from '@/test/msw-server'
import { http, HttpResponse } from 'msw'
import { PostCard } from '@/components/app/PostCard'
describe('PostCard', () => {
it('renders title and body', () => {
renderWithProviders(<PostCard id="1" title="Hello" body="World" />)
expect(screen.getByText('Hello')).toBeOnTheScreen()
expect(screen.getByText('World')).toBeOnTheScreen()
})
it('calls onPress when tapped', async () => {
const user = userEvent.setup()
const onPress = jest.fn()
renderWithProviders(<PostCard id="1" title="Hello" body="World" onPress={onPress} />)
await user.press(screen.getByText('Hello'))
expect(onPress).toHaveBeenCalledTimes(1)
})
})import { renderHook, waitFor } from '@testing-library/react-native'
import { QueryClientProvider } from '@tanstack/react-query'
import { queryClient } from '@/libs/query-client'
import { usePosts } from '@/api/posts/hooks'
const wrapper = ({ children }: { children: React.ReactNode }) => (
<QueryClientProvider client={queryClient}>{children}</QueryClientProvider>
)
describe('usePosts', () => {
it('returns posts on success', async () => {
const { result } = renderHook(() => usePosts(), { wrapper })
await waitFor(() => expect(result.current.isSuccess).toBe(true))
expect(result.current.data).toHaveLength(2)
})
})bun add -D mswsrc/test/msw-server.ts:
import { setupServer } from 'msw/node'
import { postHandlers } from './handlers/posts'
export const server = setupServer(...postHandlers)
beforeAll(() => server.listen())
afterEach(() => server.resetHandlers())
afterAll(() => server.close())src/test/handlers/posts.ts:
import { http, HttpResponse } from 'msw'
export const postHandlers = [
http.get(`${process.env.EXPO_PUBLIC_API_URL}/posts`, () =>
HttpResponse.json([{ id: '1', title: 'Hello', body: 'World' }])
),
]Already set in setupFiles: ['react-native-reanimated/mock'].
For gesture handler:
jest.mock('react-native-gesture-handler', () => ({
GestureDetector: ({ children }: { children: React.ReactNode }) => children,
Gesture: { Tap: () => ({ onBegin: jest.fn().mockReturnThis(), onFinalize: jest.fn().mockReturnThis() }) },
}))getByRole -- best, accessiblegetByLabelTextgetByTextgetByTestId -- last resortAlways userEvent not fireEvent.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.