Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
42a7f0b
feat(reassure): установлен reassure для тестирования производительности
isokolovskii Nov 28, 2025
af7861a
feat(reassure): тесты производительности Accordion
isokolovskii Nov 28, 2025
356b9f5
feat(reassure): добавлены тесты производительности Avatar
isokolovskii Nov 28, 2025
3b9c676
feat(reassure): добавлены тесты производительности для Badge
isokolovskii Nov 28, 2025
b9d4c3c
feat(reassure): переиспользуемая утилитарная функция для замера произ…
isokolovskii Nov 28, 2025
b439084
feat(reassure): тесты производительности компонента Button
isokolovskii Nov 28, 2025
b527391
feat(reassure): тесты производительности компонента Checkbox
isokolovskii Nov 28, 2025
b6d270b
feat(reassure): тесты производительности компонента Chip
isokolovskii Nov 28, 2025
49872e9
feat(reassure): тесты производительности компонента Dialog
isokolovskii Nov 28, 2025
862bead
feat(reassure): тесты производительности компонента Divider
isokolovskii Nov 28, 2025
bfc2c7c
feat(reassure): тесты производительности компонента Input
isokolovskii Nov 28, 2025
bb319de
feat(reassure): тесты производительности компонента List
isokolovskii Nov 28, 2025
97400ad
feat(reassure): тесты производительности компонента MenuItemTemplate
isokolovskii Nov 28, 2025
64eef9b
feat(reassure): тесты производительности компонента Message
isokolovskii Nov 28, 2025
4946415
feat(reassure): тесты производительности компонента ProgressBar
isokolovskii Nov 28, 2025
3a99a23
refactor(tests): исправлены замечания линтера в тестах и поправлен за…
isokolovskii Nov 28, 2025
04f1c32
feat(reassure): тесты производительности компонента ProgressSpinner
isokolovskii Nov 28, 2025
6a9c1f5
feat(reassure): тесты производительности компонента RadioButton
isokolovskii Nov 28, 2025
88750af
feat(reassure): тесты производительности компонента Rating
isokolovskii Nov 28, 2025
473ecde
feat(reassure): тесты производительности компонента SelectButton
isokolovskii Nov 28, 2025
069fada
feat(reassure): тесты производительности компонента Skeleton
isokolovskii Nov 28, 2025
77a2ed6
feat(reassure): тесты производительности компонента Slider
isokolovskii Nov 28, 2025
d7aaf14
feat(reassure): тесты производительности компонента Tabs
isokolovskii Nov 28, 2025
752c47e
feat(reassure): тесты производительности компонента Tag
isokolovskii Nov 28, 2025
36ff71e
feat(reassure): тесты производительности компонента Timer
isokolovskii Nov 28, 2025
fde667b
feat(reassure): тесты производительности компонента ToggleButton
isokolovskii Nov 28, 2025
6e57219
fix(reassure): исправление тестов производительности RadioButton и Se…
isokolovskii Nov 28, 2025
105de20
feat(reassure): тесты производительности компонента InputSwitch
isokolovskii Nov 28, 2025
52c8292
feat(reassure): тесты производительности компонентов ButtonBadge и Bu…
isokolovskii Nov 28, 2025
3e3bc49
feat(reassure): тесты производительности компонентов типографики
isokolovskii Nov 28, 2025
1caf9a8
feat(reassure): добавлены дополнительные тесты для компонента Accordion
isokolovskii Nov 28, 2025
6d985d4
feat(reassure): добавлены дополнительные тесты для компонента Avatar
isokolovskii Nov 28, 2025
c393559
feat(reassure): добавлены дополнительные тесты для компонента Dialog
isokolovskii Nov 28, 2025
11362d0
feat(reassure): добавлены дополнительные тесты для компонента Input
isokolovskii Nov 28, 2025
5ee301e
feat(reassure): добавлены дополнительные тесты для компонента Slider
isokolovskii Nov 28, 2025
c486e7f
feat(reassure): workflow для линтера, тестов, проверок и тестов на пр…
isokolovskii Nov 28, 2025
f2aec41
fix(reassure): исправление тестов производительности Slider
isokolovskii Nov 28, 2025
d096d3d
ci(reassure): правки в GitHub Workflows
isokolovskii Nov 28, 2025
ead6068
chore(reassure): правки замечаний линтера
isokolovskii Nov 28, 2025
994521b
fix(tests): исправление упавших тестов
isokolovskii Nov 28, 2025
c2501c8
fix(reassure): исправление запуска reassure в CI
isokolovskii Nov 28, 2025
03f0194
chore(reassure): небольшие изменения
isokolovskii Nov 29, 2025
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
24 changes: 24 additions & 0 deletions .github/workflows/lint.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: Lint

on:
push:
branches: [main]
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

А нужно ли отдельно запускать на пуш в main? Я бы просто добавил все проверки в релизном воркфлоу

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ну... Вообще если допустить что никогда никто и никак в main не запушит - то может и не стоит

В релизном как раз кажется лишнее - релиз на то и релиз, зачем там проверять линтер

pull_request:
branches: ["**"]
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

По моему это не обязательно, и так должен на всех ветках запускаться

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Над проверить.

Я вообще вынесу экшоны из этого PR я думаю


concurrency:
group: ${{ github.workflow }}-${{ github.head_ref }}
cancel-in-progress: true

jobs:
lint:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Setup Node.js with Dependencies
uses: ./.github/actions/setup-node

- name: Lint
run: yarn lint:check
23 changes: 23 additions & 0 deletions .github/workflows/perfomance-stability.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Test Performance Stability

on: [workflow_dispatch]

permissions: read-all

concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ !contains(github.ref, 'main')}}

jobs:
test:
name: Performance Stability
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Setup Node.js with Dependencies
uses: ./.github/actions/setup-node

- name: Run stability checks
run: yarn reassure check-stability
45 changes: 45 additions & 0 deletions .github/workflows/performance-test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
name: Performance Tests

on:
push:
branches: [main]
pull_request:
branches: ["**"]

permissions:
pull-requests: write # required for Danger to post comments
statuses: write # required for Danger to post commit statuses

concurrency:
group: ${{ github.workflow }}-${{ github.head_ref }}
cancel-in-progress: true

jobs:
test_performance:
name: Performance Tests
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6
with:
fetch-depth: 0 # Required for git operations in reassure-tests.sh

- name: Setup Node.js with Dependencies
uses: ./.github/actions/setup-node

- name: Run Reassure Performance Tests
run: ./reassure-tests.sh
env:
REASSURE_OUTPUT_FILE: .reassure/output.md

- name: Run Danger
run: yarn danger ci
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Upload Reassure report
uses: actions/upload-artifact@v4
if: always()
with:
name: reassure-report
path: .reassure/output.md
24 changes: 24 additions & 0 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: Tests

on:
push:
branches: [main]
pull_request:
branches: ["**"]

concurrency:
group: ${{ github.workflow }}-${{ github.head_ref }}
cancel-in-progress: true

jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Setup Node.js with Dependencies
uses: ./.github/actions/setup-node

- name: Test
run: yarn test
24 changes: 24 additions & 0 deletions .github/workflows/typecheck.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
name: Typecheck

on:
push:
branches: [main]
pull_request:
branches: ["**"]

concurrency:
group: ${{ github.workflow }}-${{ github.head_ref }}
cancel-in-progress: true

jobs:
typecheck:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v6

- name: Setup Node.js with Dependencies
uses: ./.github/actions/setup-node

- name: Typecheck
run: yarn tsc --noEmit
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -55,3 +55,5 @@ web-build/

# direnv
.envrc
# Reassure output directory
.reassure
5 changes: 4 additions & 1 deletion .npmignore
Original file line number Diff line number Diff line change
Expand Up @@ -49,4 +49,7 @@ expo
.prettierignore
.vscode
xcode-installation.png
configs
configs
dangerfile.js
.reassure
reassure-tests.sh
3 changes: 2 additions & 1 deletion configs/eslint/rules/reactNative.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ export const reactNativeConfig = defineConfig([
},
},
{
files: ['**/*.{test,spec}.{js,jsx,cjs,mjs,ts,tsx,mts,cts}'],
files: ['**/*.{test,spec,perf-test}.{js,jsx,cjs,mjs,ts,tsx,mts,cts}'],
rules: {
'react-native/no-inline-styles': 'off',
'react-native/no-raw-text': 'off',
Expand All @@ -50,6 +50,7 @@ export const reactNativeConfig = defineConfig([
rules: {
'react-native/no-inline-styles': 'off',
'react-native/no-raw-text': 'off',
'react-native/no-color-literals': 'off',
},
},
])
6 changes: 6 additions & 0 deletions dangerfile.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// eslint-disable-next-line import-x/no-nodejs-modules
import path from 'path'

import { dangerReassure } from 'reassure'

dangerReassure({ inputFilePath: path.join(__dirname, './.reassure/output.md') })
2 changes: 2 additions & 0 deletions jest.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@ const config: Config.InitialOptions = {
'!**/*.stories.{ts,tsx}',
'!**/index.ts',
'!**/types.ts',
'!**/__tests__/*',
],
testMatch: ['**/__tests__/**/*.{spec,test}.{ts,tsx}'],
coverageReporters: ['text', 'text-summary'],
moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'],
testRunner: 'jest-circus',
Expand Down
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,7 @@
"react-native-reanimated": "3.19.1",
"react-native-safe-area-context": "5.6.1",
"react-native-svg": "15.12.1",
"reassure": "1.4.0",
"release-it": "19.0.6",
"standard-version": "9.5.0",
"storybook": "8.3.5",
Expand Down
19 changes: 19 additions & 0 deletions reassure-tests.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#!/usr/bin/env bash
set -e

BASELINE_BRANCH=${GITHUB_BASE_REF:="main"}

# Required for `git switch` on CI
git fetch origin

# Gather baseline perf measurements
git switch "$BASELINE_BRANCH"

yarn install --immutable
yarn reassure --baseline

# Gather current perf measurements & compare results
git switch --detach -

yarn install --immutable
yarn reassure --branch
77 changes: 77 additions & 0 deletions src/components/Accordion/__tests__/Accordion.perf-test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
import { IconUser, IconDiamond } from '@tabler/icons-react-native'
import { fireEvent, screen } from '@testing-library/react-native'
import { View } from 'react-native'

import { measureComponentPerformance } from '../../../utils/__tests__/perf-utils'
import { Accordion, AccordionTestIds } from '../Accordion'

describe('Accordion performance', () => {
test('initial render (collapsed)', async () => {
await measureComponentPerformance(
<Accordion title='Accordion'>
<View style={{ height: 100 }} />
</Accordion>
)
})

test('initial render (expanded)', async () => {
await measureComponentPerformance(
<Accordion isInitiallyExpanded title='Accordion'>
<View style={{ height: 100 }} />
</Accordion>
)
})

test('initial render with Icon', async () => {
await measureComponentPerformance(
<Accordion Icon={IconUser} title='Accordion'>
<View style={{ height: 100 }} />
</Accordion>
)
})

test('initial render with titleExtra', async () => {
await measureComponentPerformance(
<Accordion title='Accordion' titleExtra={<IconDiamond />}>
<View style={{ height: 100 }} />
</Accordion>
)
})

test('initial render with withSeparator', async () => {
await measureComponentPerformance(
<Accordion withSeparator title='Accordion'>
<View style={{ height: 100 }} />
</Accordion>
)
})

test('initial render when disabled', async () => {
await measureComponentPerformance(
<Accordion disabled title='Accordion'>
<View style={{ height: 100 }} />
</Accordion>
)
})

test('toggle performance', async () => {
const scenario = async () => {
fireEvent(
screen.getByTestId(AccordionTestIds.contentWrapper, {
includeHiddenElements: true,
}),
'layout',
{ nativeEvent: { layout: { height: 100, width: 200, x: 0, y: 0 } } }
)

fireEvent.press(screen.getByText('Accordion'))
}

await measureComponentPerformance(
<Accordion title='Accordion'>
<View style={{ height: 100 }} />
</Accordion>,
{ scenario }
)
})
})
86 changes: 86 additions & 0 deletions src/components/Avatar/__tests__/Avatar.perf-test.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,86 @@
import { IconUser } from '@tabler/icons-react-native'

import { measureComponentPerformance } from '../../../utils/__tests__/perf-utils'
import { Badge } from '../../Badge'

import { Avatar } from '../Avatar'

describe('Avatar performance', () => {
test('label', async () => {
await measureComponentPerformance(
<Avatar shape='circle' size='large' type='label'>
A
</Avatar>
)
})

test('icon', async () => {
await measureComponentPerformance(
<Avatar Icon={IconUser} shape='circle' size='large' type='icon' />
)
})

test('image', async () => {
await measureComponentPerformance(
<Avatar
shape='circle'
size='large'
source={require('../testImage.png')}
type='image'
/>
)
})

test('size normal', async () => {
await measureComponentPerformance(
<Avatar shape='circle' size='normal' type='label'>
A
</Avatar>
)
})

test('size large', async () => {
await measureComponentPerformance(
<Avatar shape='circle' size='large' type='label'>
A
</Avatar>
)
})

test('size xlarge', async () => {
await measureComponentPerformance(
<Avatar shape='circle' size='xlarge' type='label'>
A
</Avatar>
)
})

test('size custom', async () => {
await measureComponentPerformance(
<Avatar shape='circle' size={100} type='label'>
A
</Avatar>
)
})

test('shape square', async () => {
await measureComponentPerformance(
<Avatar shape='square' size='large' type='label'>
A
</Avatar>
)
})

test('with badge', async () => {
await measureComponentPerformance(
<Avatar
badge={<Badge severity='danger'>9</Badge>}
shape='circle'
size='large'
type='label'
>
A
</Avatar>
)
})
})
Loading
Loading