@astral/mobx-query 1.3.0 → 1.3.2

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.
@@ -1,4 +1,4 @@
1
- import { CacheKey } from '../types';
1
+ import type { CacheKey } from '../types';
2
2
  /**
3
3
  * @description хранилище данных, предназначено для обеспечения единого интерфейса при работе с данными
4
4
  */
@@ -1,5 +1,5 @@
1
- import { FetchPolicy, QueryBaseActions, Sync, SyncParams } from '../types';
2
- import { DataStorage } from '../DataStorage';
1
+ import type { FetchPolicy, QueryBaseActions, Sync, SyncParams } from '../types';
2
+ import type { DataStorage } from '../DataStorage';
3
3
  export declare const DEFAULT_INFINITE_ITEMS_COUNT = 30;
4
4
  export type InfiniteParams = {
5
5
  offset: number;
@@ -1,7 +1,10 @@
1
- import { Query, QueryExecutor, QueryParams } from '../Query';
2
- import { InfiniteExecutor, InfiniteQuery, InfiniteQueryParams } from '../InfiniteQuery';
3
- import { Mutation, MutationExecutor, MutationParams } from '../Mutation';
4
- import { CacheKey, FetchPolicy } from '../types';
1
+ import type { QueryExecutor, QueryParams } from '../Query';
2
+ import { Query } from '../Query';
3
+ import type { InfiniteExecutor, InfiniteQueryParams } from '../InfiniteQuery';
4
+ import { InfiniteQuery } from '../InfiniteQuery';
5
+ import type { MutationExecutor, MutationParams } from '../Mutation';
6
+ import { Mutation } from '../Mutation';
7
+ import type { CacheKey, FetchPolicy } from '../types';
5
8
  /**
6
9
  * @description стандартный обработчик ошибки запроса,
7
10
  * будет вызван, если при вызове sync не был передан отдельный onError параметр
@@ -1,5 +1,5 @@
1
1
  import { Query } from '../Query';
2
- import { InfiniteQuery, } from '../InfiniteQuery';
2
+ import { InfiniteQuery } from '../InfiniteQuery';
3
3
  import { Mutation } from '../Mutation';
4
4
  import { DataStorageFactory } from '../DataStorage';
5
5
  /**
@@ -95,8 +95,11 @@ export class MobxQuery {
95
95
  */
96
96
  this.createInfiniteQuery = (key, executor, params) => {
97
97
  const fetchPolicy = (params === null || params === void 0 ? void 0 : params.fetchPolicy) || this.defaultFetchPolicy || '';
98
- return this.getCachedQuery(key, () => new InfiniteQuery(executor, Object.assign(Object.assign({}, params), { onError: ((params === null || params === void 0 ? void 0 : params.onError) ||
99
- this.defaultErrorHandler), enabledAutoFetch: (params === null || params === void 0 ? void 0 : params.enabledAutoFetch) || this.defaultEnabledAutoFetch, dataStorage: this.infiniteQueryDataStorageFactory.getStorage(key), fetchPolicy: fetchPolicy })), fetchPolicy);
98
+ return this.getCachedQuery(key, () => {
99
+ var _a;
100
+ return new InfiniteQuery(executor, Object.assign(Object.assign({}, params), { onError: ((params === null || params === void 0 ? void 0 : params.onError) ||
101
+ this.defaultErrorHandler), enabledAutoFetch: (_a = params === null || params === void 0 ? void 0 : params.enabledAutoFetch) !== null && _a !== void 0 ? _a : this.defaultEnabledAutoFetch, dataStorage: this.infiniteQueryDataStorageFactory.getStorage(key), fetchPolicy: fetchPolicy }));
102
+ }, fetchPolicy);
100
103
  };
101
104
  /**
102
105
  * @description метод создания мутации, не кешируется
@@ -1,4 +1,4 @@
1
- import { QueryBaseActions, Sync, SyncParams } from '../types';
1
+ import type { QueryBaseActions, Sync, SyncParams } from '../types';
2
2
  /**
3
3
  * @description исполнитель запроса
4
4
  */
package/Query/Query.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { FetchPolicy, QueryBaseActions, Sync, SyncParams } from '../types';
2
- import { DataStorage } from '../DataStorage';
1
+ import type { FetchPolicy, QueryBaseActions, Sync, SyncParams } from '../types';
2
+ import type { DataStorage } from '../DataStorage';
3
3
  /**
4
4
  * @description исполнитель запроса
5
5
  */
package/README.md CHANGED
@@ -31,6 +31,8 @@
31
31
  - [isSuccess](#issuccess)
32
32
  - [isError](#iserror)
33
33
  - [error](#error)
34
+ - [Тестирование](#тестирование)
35
+ - [Тестирование при включенном enabledAutoFetch](#тестирование-при-включенном-enabledautofetch)
34
36
 
35
37
  # Installation
36
38
 
@@ -337,3 +339,94 @@ await query
337
339
  console.log(query.isError); // 'true'
338
340
  console.log(query.error); // 'foo'
339
341
  ```
342
+
343
+ # Тестирование
344
+
345
+ ## Тестирование при включенном ```enabledAutoFetch```
346
+
347
+ ### Исходный код
348
+
349
+ ```MobxQuery``` инициализируется с параметром: ```enabledAutoFetch```:
350
+ ```ts
351
+ const createMobxQuery = () => new MobxQuery<ApiDataError>({
352
+ enabledAutoFetch: true,
353
+ });
354
+ ```
355
+
356
+ ```BookRepository``` - фасад для работы с данными, который использует MobxQuery:
357
+ ```ts
358
+ export class BookRepository {
359
+ constructor(private readonly mobxQuery: MobxQuery) {}
360
+
361
+ public getBookListQuery = (params: BookRepositoryDTO.BookListInputDTO) =>
362
+ this.mobxQuery.createQuery<BookRepositoryDTO.BookListDTO>(
363
+ ['book-list', params],
364
+ () =>
365
+ apiHttpClient.get('/books', {
366
+ params,
367
+ }),
368
+ );
369
+ }
370
+ ```
371
+
372
+ ```BooksListStore``` - использует BookRepository для получения данных:
373
+ ```ts
374
+ class BooksListStore {
375
+ public sort?: SortData;
376
+
377
+ constructor(private readonly bookRepository: BookRepository) {
378
+ makeAutoObservable(this);
379
+ }
380
+
381
+ private get listQuery() {
382
+ return this.bookRepository.getBookListQuery(this.sort);
383
+ }
384
+
385
+ public get list(): ListItem[] {
386
+ const data = this.listQuery.data?.data || [];
387
+
388
+ return data.map(({ id, name, price }) => ({
389
+ id,
390
+ name,
391
+ price: formatPriceToView(price),
392
+ }));
393
+ }
394
+ }
395
+ ```
396
+
397
+ ### Тест
398
+
399
+ ```ts
400
+ import { when } from 'mobx';
401
+
402
+ describe('BooksListStore', () => {
403
+ it('Список книг форматируется для отображения', async () => {
404
+ // Для каждого теста необходимо инициализировать свой instance MobxQuery,
405
+ // иначе будет проблема состояния гонки при выполнении нескольких тестов
406
+ const mobxQuery = createMobxQuery();
407
+
408
+ const fakeBookList = makeFakeBookList(2, { price: 1000 });
409
+ const fakeBookListItem = fakeBookList.data[0];
410
+
411
+ const bookRepositoryMock = mock<BookRepository>({
412
+ // Подменяем реализацию метода для того, чтобы получить ожидаемый результат
413
+ getBookListQuery: () =>
414
+ // Создаем моковый Query, соответствующий интерфейсу BookRepository
415
+ mobxQuery.createQuery(['id'], async () => fakeBookList),
416
+ });
417
+
418
+ const sut = new GoodsListStore(bookRepositoryMock);
419
+
420
+ // Ждем автоматической загрузки данных
421
+ // Загрузка данных начнется автоматически при обращении к sut.list за счет параметра enabledAutoFetch
422
+ await when(() => Boolean(sut.list?.length));
423
+
424
+ expect(sut.list[0]).toMatchObject({
425
+ id: fakeBookListItem.id,
426
+ name: fakeBookListItem.name,
427
+ price: '1 000 руб.',
428
+ });
429
+ });
430
+ });
431
+ ```
432
+
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@astral/mobx-query",
3
- "version": "1.3.0",
3
+ "version": "1.3.2",
4
4
  "browser": "./index.js",
5
5
  "main": "./index.js",
6
6
  "dependencies": {