Skip to content

Commit b5f37f6

Browse files
authored
fix(MemoryStorage): correctly respect the desc option (#1666)
1 parent 49e270c commit b5f37f6

File tree

2 files changed

+59
-1
lines changed

2 files changed

+59
-1
lines changed

packages/memory-storage/src/resource-clients/dataset.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,10 @@ export class DatasetClient<Data extends Dictionary = Dictionary> extends BaseCli
132132
this.throwOnNonExisting(StorageTypes.Dataset);
133133
}
134134

135-
const [start, end] = existingStoreById.getStartAndEndIndexes(offset, limit);
135+
const [start, end] = existingStoreById.getStartAndEndIndexes(
136+
desc ? Math.max(existingStoreById.itemCount - offset - limit, 0) : offset,
137+
limit,
138+
);
136139

137140
const items: Data[] = [];
138141

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { rm } from 'node:fs/promises';
2+
import { resolve } from 'node:path';
3+
import { MemoryStorage } from '@crawlee/memory-storage';
4+
import type { DatasetClient } from '@crawlee/types';
5+
6+
const elements = Array.from({ length: 10 }, (_, i) => ({ number: i }));
7+
8+
describe('Dataset#listItems respects the desc option', () => {
9+
const localDataDirectory = resolve(__dirname, './tmp/desc');
10+
const storage = new MemoryStorage({
11+
localDataDirectory,
12+
persistStorage: false,
13+
});
14+
15+
let dataset: DatasetClient;
16+
17+
afterAll(async () => {
18+
await rm(localDataDirectory, { force: true, recursive: true });
19+
});
20+
21+
beforeAll(async () => {
22+
const { id: falseDatasetId } = await storage.datasets().getOrCreate('false');
23+
dataset = storage.dataset(falseDatasetId);
24+
25+
await dataset.pushItems(elements);
26+
});
27+
28+
test('with desc: false', async () => {
29+
const result = await dataset.listItems({ desc: false, limit: 5 });
30+
31+
expect(result.items).toHaveLength(5);
32+
expect(result.items).toStrictEqual(elements.slice(0, 5));
33+
});
34+
35+
test('with desc: true', async () => {
36+
const result = await dataset.listItems({ desc: true, limit: 5 });
37+
38+
expect(result.items).toHaveLength(5);
39+
expect(result.items).toStrictEqual(elements.slice().reverse().slice(0, 5));
40+
});
41+
42+
test('with desc: false and offset: 2', async () => {
43+
const result = await dataset.listItems({ desc: false, limit: 5, offset: 2 });
44+
45+
expect(result.items).toHaveLength(5);
46+
expect(result.items).toStrictEqual(elements.slice(2, 7));
47+
});
48+
49+
test('with desc: true and offset: 2', async () => {
50+
const result = await dataset.listItems({ desc: true, limit: 5, offset: 2 });
51+
52+
expect(result.items).toHaveLength(5);
53+
expect(result.items).toStrictEqual(elements.slice().reverse().slice(2, 7));
54+
});
55+
});

0 commit comments

Comments
 (0)