@astral/mobx-query 1.19.0 → 1.19.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +50 -67
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -46,7 +46,7 @@
46
46
  - [Кастомная установка ключей кэширования](#кастомная-установка-ключей-кэширования)
47
47
  - [Фоновая загрузка данных QuerySet и InfiniteQuerySet](#фоновая-загрузка-данных-queryset-и-infinitequeryset)
48
48
  - [Изменение кэша QuerySet и InfiniteQuerySet](#изменение-кэша-queryset-и-infinitequeryset)
49
- - [Тестирование QuerySet и InfiniteQuerySet](#тестирование-queryset-и-infinitequeryset)
49
+ - [Тестирование](#тестирование)
50
50
  - [Core](#core)
51
51
 
52
52
  ## Installation
@@ -935,7 +935,9 @@ docsFetcher.queries.document.createWithConfig({
935
935
  }
936
936
  ```
937
937
 
938
- ## Тестирование Fetcher на сонове QuerySet и InfiniteQuerySet.
938
+ ## Тестирование
939
+
940
+ ### Реализация `mockFetcher` (один раз в проекте)
939
941
 
940
942
  Для мокинга QuerySet и InfiniteQuerySet необходимо использовать mock следующего вида:
941
943
  ```ts
@@ -948,92 +950,73 @@ type Fetcher = {
948
950
  const mockFetcher = <TFetcher extends Fetcher>(config: DeepPartial<TFetcher>) => config as TFetcher;
949
951
  ```
950
952
 
951
- **Не используйте 'vitest-mock-extended' для мокинга Fetcher.**
952
- Причина: `vitest-mock-extended` оборачивает объект в Proxy, что нарушает работу Mobx.
953
+ **Не используйте `vitest-mock-extended` для мокинга Fetcher.**
954
+ Причина: `vitest-mock-extended` нарушает работу Mobx.
953
955
 
954
- ### Тестирование с включенным ```enabledAutoFetch```
956
+ ### 1 тест - 1 mobx-query instance
955
957
 
956
- ```MobxQuery``` инициализируется с параметром: ```enabledAutoFetch```:
957
958
  ```ts
958
- const createMobxQuery = () => new MobxQuery({
959
- enabledAutoFetch: true,
960
- });
959
+ const setup = () => {
960
+ const mobxQuery = createMobxQuery();
961
+
962
+ const booksFetcherMock = mockFetcher<BooksFetcher>({
963
+ queries: {
964
+ list: mobxQuery.createQuerySet(...),
965
+ },
966
+ });
967
+ }
961
968
  ```
962
969
 
963
- ```booksFetcher.ts```
970
+ ### Mock Query, Mutation
971
+
972
+ Для определения queries, mutations использовать соответствующие методы mobxQuery:
964
973
  ```ts
965
- export const booksFetcher = {
974
+ const booksFetcherMock = mockFetcher<BooksFetcher>({
966
975
  queries: {
967
- bookList: mobxQuery.createQuerySet((params: BooksDTO.BookListInput) => ({
968
- execute: () => booksEndpoint.getBookList(params),
976
+ bookList: mobxQuery.createQuerySet((filters) => ({
977
+ execute: async () => fakeBookList,
969
978
  })),
970
979
  },
971
- };
972
-
973
- export type BooksFetcher = typeof booksFetcher;
974
- ```
975
-
976
- ```BooksListStore``` - использует `BooksFetcher` для получения данных:
977
- ```ts
978
- class BooksListStore {
979
- public sort?: SortData;
980
-
981
- constructor(private readonly _booksFetcher: BooksFetcher) {
982
- makeAutoObservable(this);
983
- }
984
-
985
- private get listQuery() {
986
- return this._booksFetcher.queries.bookList.create(this.sort);
980
+ mutations: {
981
+ createBook: mobxQuery.createMutation(async (book) => undefined),
987
982
  }
983
+ });
984
+ ```
988
985
 
989
- public get list(): ListItem[] {
990
- const data = this.listQuery.data || [];
986
+ ### Mock InfiniteQuery
991
987
 
992
- return data.map(({ id, name, price }) => ({
993
- id,
994
- name,
995
- price: formatPriceToView(price),
996
- }));
988
+ Для определения `InfiniteQueries` использовать `createInfiniteQuerySet`:
989
+ ```ts
990
+ const booksFetcherMock = mockFetcher<BooksFetcher>({
991
+ infiniteQueries: {
992
+ bookList: mobxQuery.createInfiniteQuerySet(
993
+ (filters) => ({
994
+ execute: ({ offset, count }) => fakeBookList,
995
+ }),
996
+ ),
997
997
  }
998
- }
998
+ });
999
999
  ```
1000
1000
 
1001
- Тест ```BooksListStore```:
1001
+ ### Ожидание|триггер запроса данных при `enabledAutoFetch` (дефолтное поведение)
1002
1002
 
1003
1003
  ```ts
1004
1004
  import { when } from 'mobx';
1005
- import { mockCacheGroups } from '@astral/mobx-query-vitest-mock';
1006
-
1007
- describe('BooksListStore', () => {
1008
- it('Список книг форматируется для отображения', async () => {
1009
- // Для каждого теста необходимо инициализировать свой instance MobxQuery,
1010
- // в противном случае каждый тест будет модифицировать кэш
1011
- const mobxQuery = createMobxQuery();
1012
-
1013
- const fakeBookList = makeFakeBookList(2, { price: 1000 });
1014
- const fakeBookListItem = fakeBookList.data[0];
1015
-
1016
- const booksFetcherMock = mockFetcher<BooksFetcher>({
1017
- queries: {
1018
- bookList: () => mobxQuery.createQuerySet(() => ({
1019
- execute: async () => fakeBookList,
1020
- })),
1021
- },
1022
- });
1023
1005
 
1024
- const sut = new BooksListStore(booksFetcherMock);
1006
+ const booksFetcherMock = mockFetcher<BooksFetcher>({
1007
+ queries: {
1008
+ bookList: mobxQuery.createQuerySet((filters) => ({
1009
+ execute: async () => fakeBookList,
1010
+ })),
1011
+ },
1012
+ });
1025
1013
 
1026
- // Ждем автоматической загрузки данных
1027
- // Загрузка данных начнется автоматически при обращении к sut.list за счет параметра enabledAutoFetch
1028
- await when(() => Boolean(sut.list?.length));
1014
+ const sut = new Store(booksFetcherMock);
1029
1015
 
1030
- expect(sut.list[0]).toEqual({
1031
- id: fakeBookListItem.id,
1032
- name: fakeBookListItem.name,
1033
- price: '1 000 руб.',
1034
- });
1035
- });
1036
- });
1016
+ // Обращаемся к data из query -> триггер запроса данных -> ожидаем когда загрузятся данные
1017
+ await when(() => Boolean(sut.data));
1018
+
1019
+ expect(sut.status.isSuccess).toBe(true);
1037
1020
  ```
1038
1021
 
1039
1022
  ## Core
package/package.json CHANGED
@@ -10,7 +10,7 @@
10
10
  "peerDependencies": {
11
11
  "mobx": "^6.0.0"
12
12
  },
13
- "version": "1.19.0",
13
+ "version": "1.19.1",
14
14
  "author": "Astral.Soft",
15
15
  "license": "MIT",
16
16
  "repository": {