Skip to content

Commit d6dcc53

Browse files
authored
fix: get dataset items as array (#47)
* fix: get dataset as array * fix: scrape URL return object * test: update test for dataset and scrape URL * fix: simplify return values in each operation * docs: add comment in main execute method
1 parent 8e1c4bb commit d6dcc53

File tree

18 files changed

+1144
-1220
lines changed

18 files changed

+1144
-1220
lines changed

nodes/Apify/Apify.node.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,13 @@ export class Apify implements INodeType {
5656
const returnData: INodeExecutionData[] = [];
5757

5858
for (let i = 0; i < items.length; i++) {
59-
returnData.push(await resourceRouter.call(this, i));
59+
const data = await resourceRouter.call(this, i);
60+
// `data` may be an array of items or a single item, so we either push the spreaded array or the single item
61+
if (Array.isArray(data)) {
62+
returnData.push(...data);
63+
} else {
64+
returnData.push(data);
65+
}
6066
}
6167

6268
return [returnData];

nodes/Apify/__tests__/Apify.node.spec.ts

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { Apify } from '../Apify.node';
22
import { executeWorkflow } from './utils/executeWorkflow';
33
import { CredentialsHelper } from './utils/credentialHelper';
4-
import { getRunTaskDataByNodeName, getTaskData } from './utils/getNodeResultData';
4+
import { getRunTaskDataByNodeName, getTaskArrayData, getTaskData } from './utils/getNodeResultData';
55
import getRunWorkflow from './workflows/actor-runs/get-run.workflow.json';
66
import nock from 'nock';
77
import getUserRunsListWorkflow from './workflows/actor-runs/get-user-runs-list.workflow.json';
@@ -59,7 +59,7 @@ describe('Apify Node', () => {
5959
expect(nodeResult.executionStatus).toBe('success');
6060

6161
const data = getTaskData(nodeResult);
62-
expect(data).toEqual(mockRun);
62+
expect(data).toEqual(mockRun.data);
6363

6464
expect(scope.isDone()).toBe(true);
6565
});
@@ -72,7 +72,7 @@ describe('Apify Node', () => {
7272
const scope = nock('https://api.apify.com')
7373
.get('/v2/actor-runs')
7474
.query(true)
75-
.reply(200, { data: { items: mockRunsList } });
75+
.reply(200, mockRunsList);
7676

7777
const { waitPromise } = await executeWorkflow({
7878
credentialsHelper,
@@ -85,8 +85,9 @@ describe('Apify Node', () => {
8585
const [nodeResult] = nodeResults;
8686
expect(nodeResult.executionStatus).toBe('success');
8787

88-
const data = getTaskData(nodeResult);
89-
expect(data).toEqual({ runs: mockRunsList });
88+
const data = getTaskArrayData(nodeResult);
89+
expect(Array.isArray(data)).toBe(true);
90+
expect(data?.map((item) => item.json)).toEqual(mockRunsList.data.items);
9091

9192
expect(scope.isDone()).toBe(true);
9293
});
@@ -116,7 +117,7 @@ describe('Apify Node', () => {
116117
expect(nodeResult.executionStatus).toBe('success');
117118

118119
const data = getTaskData(nodeResult);
119-
expect(data).toEqual(mockRunTask);
120+
expect(data).toEqual(mockRunTask.data);
120121

121122
expect(scope.isDone()).toBe(true);
122123
});
@@ -126,7 +127,7 @@ describe('Apify Node', () => {
126127
describe('actors', () => {
127128
describe('get-last-run', () => {
128129
it('should run the get-last-run workflow', async () => {
129-
const mockLastRun = fixtures.getLastRunResult()[0].data;
130+
const mockLastRun = fixtures.getLastRunResult();
130131

131132
const scope = nock('https://api.apify.com')
132133
.get('/v2/acts/nFJndFXA5zjCTuudP/runs/last')
@@ -145,14 +146,14 @@ describe('Apify Node', () => {
145146
expect(nodeResult.executionStatus).toBe('success');
146147

147148
const data = getTaskData(nodeResult);
148-
expect(data).toEqual(mockLastRun);
149+
expect(data).toEqual(mockLastRun.data);
149150

150151
expect(scope.isDone()).toBe(true);
151152
});
152153
});
153154
describe('run-actor', () => {
154155
it('should run the run-actor workflow', async () => {
155-
const mockRunActor = fixtures.runActorResult()[0].data;
156+
const mockRunActor = fixtures.runActorResult();
156157

157158
const scope = nock('https://api.apify.com')
158159
.get('/v2/acts/nFJndFXA5zjCTuudP')
@@ -161,7 +162,7 @@ describe('Apify Node', () => {
161162
.reply(200, { data: fixtures.getBuildResult() })
162163
.post('/v2/acts/nFJndFXA5zjCTuudP/runs')
163164
.query({ waitForFinish: 60 })
164-
.reply(200, fixtures.runActorResult()[0].data);
165+
.reply(200, mockRunActor);
165166

166167
const runActorWorkflow = require('./workflows/actors/run-actor.workflow.json');
167168
const { waitPromise } = await executeWorkflow({
@@ -176,7 +177,7 @@ describe('Apify Node', () => {
176177
expect(nodeResult.executionStatus).toBe('success');
177178

178179
const data = getTaskData(nodeResult);
179-
expect(data).toEqual(mockRunActor);
180+
expect(data).toEqual(mockRunActor.data);
180181

181182
expect(scope.isDone()).toBe(true);
182183
});
@@ -194,7 +195,7 @@ describe('Apify Node', () => {
194195
.reply(200, mockRunResponse)
195196
.get(`/v2/datasets/${datasetId}/items`)
196197
.query({ format: 'json' })
197-
.reply(200, { items: mockItems });
198+
.reply(200, mockItems);
198199

199200
const scrapeSingleUrlWorkflow = require('./workflows/actors/scrape-single-url.workflow.json');
200201
const { waitPromise } = await executeWorkflow({
@@ -209,7 +210,8 @@ describe('Apify Node', () => {
209210
expect(nodeResult.executionStatus).toBe('success');
210211

211212
const data = getTaskData(nodeResult);
212-
expect(data).toEqual({ items: mockItems });
213+
expect(typeof data).toBe('object');
214+
expect(data).toEqual(mockItems[0]);
213215

214216
expect(scope.isDone()).toBe(true);
215217
});
@@ -225,7 +227,7 @@ describe('Apify Node', () => {
225227
const scope = nock('https://api.apify.com')
226228
.get(`/v2/datasets/${datasetId}/items`)
227229
.query(true)
228-
.reply(200, { items: mockItems });
230+
.reply(200, mockItems);
229231

230232
const getItemsWorkflow = require('./workflows/datasets/get-items.workflow.json');
231233
const { waitPromise } = await executeWorkflow({
@@ -239,8 +241,9 @@ describe('Apify Node', () => {
239241
const [nodeResult] = nodeResults;
240242
expect(nodeResult.executionStatus).toBe('success');
241243

242-
const data = getTaskData(nodeResult);
243-
expect(data).toEqual({ items: mockItems });
244+
const data = getTaskArrayData(nodeResult);
245+
expect(Array.isArray(data)).toBe(true);
246+
expect(data?.map((item) => item.json)).toEqual(mockItems);
244247

245248
expect(scope.isDone()).toBe(true);
246249
});

0 commit comments

Comments
 (0)