From 0b852183272c6bfdf6299001edf256a821200b8a Mon Sep 17 00:00:00 2001 From: Artur Jankowski Date: Mon, 29 Apr 2024 14:33:51 +0200 Subject: [PATCH 1/3] fix: Fix `options` parameter in metadata query method --- src/managers/metadata.ts | 10 ++- .../__tests__/metadata.test.js | 76 +++++++++++++++++++ tests/lib/managers/metadata-test.js | 31 ++++++++ 3 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 tests/integration_test/__tests__/metadata.test.js diff --git a/src/managers/metadata.ts b/src/managers/metadata.ts index e57c76617..e3d70ab8e 100644 --- a/src/managers/metadata.ts +++ b/src/managers/metadata.ts @@ -391,9 +391,11 @@ class Metadata { * @param {string} ancestorFolderId - The folder_id to which to restrain the query * @param {Object} [options] - Optional parameters * @param {string} [options.query] - The logical expression of the query - * @param {Object} [options.query_parameters] - Required if query present. The arguments for the query + * @param {Object} [options.query_params] - Required if query present. The arguments for the query * @param {Object} [options.order_by] - The field_key(s) to order on and the corresponding direction(s) * @param {Array} [options.fields] - An array of fields to return + * @param {int} [options.limit=100] - The number of results to return for a single request + * @param {string} [options.marker] - Pagination marker * @param {Function} [callback] - Passed a collection of items and their associated metadata * @returns {Promise} Promise resolving to a collection of items and their associated metadata */ @@ -402,9 +404,11 @@ class Metadata { ancestorFolderId: string, options?: { query?: string; - query_parameters?: Record; - order_by: Record; + query_params?: Record; + order_by?: Record; fields?: string[]; + limit?: number; + marker?: string; }, callback?: Function ) { diff --git a/tests/integration_test/__tests__/metadata.test.js b/tests/integration_test/__tests__/metadata.test.js new file mode 100644 index 000000000..819faedbc --- /dev/null +++ b/tests/integration_test/__tests__/metadata.test.js @@ -0,0 +1,76 @@ +'use strict'; + +const {getAppClient} = require('../context'); +const {createBoxTestFolder} = require('../objects/box-test-folder'); +const {createBoxTestFile} = require('../objects/box-test-file'); +const utils = require('../lib/utils'); +const path = require('path'); +const context = {}; + +beforeAll(async() => { + context.appClient = await getAppClient(); + let folder = await createBoxTestFolder(context.appClient); + context.folder = folder; +}); + +afterAll(async() => { + await context.folder.dispose(); + context.folder = null; +}); + +test('test matadata search', async() => { + const templateKey = `template_${utils.randomName()}`; + const fields = [ + { + type: 'float', + key: 'testFloatValue', + displayName: 'testFloatValue', + }, + ]; + + const metadataTemplate = await context.appClient.metadata.createTemplate(templateKey, fields, { + scope: 'enterprise', + templateKey: templateKey, + }); + + expect(metadataTemplate.id) + .toBeDefined(); + expect(metadataTemplate.templateKey) + .toBe(templateKey); + expect(metadataTemplate.displayName) + .toBe(templateKey); + + const file = await createBoxTestFile(context.appClient, path.join(__dirname, '../resources/blank.pdf'), 'blank_sign_1.pdf', context.folder.id); + try { + const metadata = await context.appClient.files.addMetadata(file.id, 'enterprise', templateKey, {testFloatValue: 150}); + expect(metadata.$template) + .toBe(templateKey); + expect(metadata.testFloatValue) + .toBe(150); + + const searchForm = `${metadataTemplate.scope}.${metadataTemplate.templateKey}`; + const ancestorFolderId = '0'; + const queryOptions = { + query: 'testFloatValue >= :arg', + query_params: {arg: '100'}, + limit: 1, + order_by: [ + { + 'field_key': 'testFloatValue', + 'direction': 'asc', + }, + ], + }; + const searchResults = await context.appClient.metadata.query(searchForm, ancestorFolderId, queryOptions); + expect(searchResults.entries.length) + .toBe(1); + expect(searchResults.entries[0].name) + .toBe(file.name); + + await context.appClient.metadata.deleteTemplate('enterprise', metadataTemplate.templateKey); + } + finally { + await file.dispose(); + } +}, 120000); + diff --git a/tests/lib/managers/metadata-test.js b/tests/lib/managers/metadata-test.js index 2fedf65f5..ac3251bee 100644 --- a/tests/lib/managers/metadata-test.js +++ b/tests/lib/managers/metadata-test.js @@ -334,4 +334,35 @@ describe('Metadata', function() { .then(data => assert.equal(data, response)); }); }); + + describe('query()', function() { + it('should make POST request to search the API when called', function() { + var from = 'enterprise_987654321.someTemplate'; + var ancestorFolderId = '0'; + var options = { + query: 'value >= :amount', + query_params: {amount: '100'}, + limit: 10, + marker: 'vwxyz', + order_by: [ + { + "field_key": "value", + "direction": "asc" + } + ] + }; + + var expectedParams = { + body: { + ancestor_folder_id: ancestorFolderId, + from: from, + ...options + }, + }; + + sandbox.stub(boxClientFake, 'wrapWithDefaultHandler').returnsArg(0); + sandbox.mock(boxClientFake).expects('post').withArgs('/metadata_queries/execute_read', expectedParams); + metadata.query(from, ancestorFolderId, options); + }); + }); }); From 4517893664a70d90111818f54649519544d8ff46 Mon Sep 17 00:00:00 2001 From: Artur Jankowski Date: Tue, 30 Apr 2024 14:31:47 +0200 Subject: [PATCH 2/3] fix tests --- .../__tests__/metadata.test.js | 81 +++++++++---------- 1 file changed, 38 insertions(+), 43 deletions(-) diff --git a/tests/integration_test/__tests__/metadata.test.js b/tests/integration_test/__tests__/metadata.test.js index 819faedbc..8cd27f380 100644 --- a/tests/integration_test/__tests__/metadata.test.js +++ b/tests/integration_test/__tests__/metadata.test.js @@ -1,76 +1,71 @@ 'use strict'; -const {getAppClient} = require('../context'); -const {createBoxTestFolder} = require('../objects/box-test-folder'); -const {createBoxTestFile} = require('../objects/box-test-file'); +const { getAppClient } = require('../context'); +const { createBoxTestFolder } = require('../objects/box-test-folder'); +const { createBoxTestFile } = require('../objects/box-test-file'); const utils = require('../lib/utils'); const path = require('path'); const context = {}; -beforeAll(async() => { +beforeAll(async () => { context.appClient = await getAppClient(); let folder = await createBoxTestFolder(context.appClient); context.folder = folder; }); -afterAll(async() => { +afterAll(async () => { await context.folder.dispose(); context.folder = null; }); -test('test matadata search', async() => { +test('test metadata search', async () => { const templateKey = `template_${utils.randomName()}`; const fields = [ { type: 'float', key: 'testFloatValue', - displayName: 'testFloatValue', - }, + displayName: 'testFloatValue' + } ]; const metadataTemplate = await context.appClient.metadata.createTemplate(templateKey, fields, { scope: 'enterprise', - templateKey: templateKey, + templateKey: templateKey }); - expect(metadataTemplate.id) - .toBeDefined(); - expect(metadataTemplate.templateKey) - .toBe(templateKey); - expect(metadataTemplate.displayName) - .toBe(templateKey); - - const file = await createBoxTestFile(context.appClient, path.join(__dirname, '../resources/blank.pdf'), 'blank_sign_1.pdf', context.folder.id); + expect(metadataTemplate.id).toBeDefined(); + expect(metadataTemplate.templateKey).toBe(templateKey); + expect(metadataTemplate.displayName).toBe(templateKey); try { - const metadata = await context.appClient.files.addMetadata(file.id, 'enterprise', templateKey, {testFloatValue: 150}); - expect(metadata.$template) - .toBe(templateKey); - expect(metadata.testFloatValue) - .toBe(150); + const file = await createBoxTestFile(context.appClient, path.join(__dirname, '../resources/blank.pdf'), 'blank_sign_1.pdf', context.folder.id); + try { + const metadata = await context.appClient.files.addMetadata(file.id, 'enterprise', templateKey, { testFloatValue: 150 }); + expect(metadata.$template).toBe(templateKey); + expect(metadata.testFloatValue).toBe(150); + + const searchForm = `${metadataTemplate.scope}.${metadataTemplate.templateKey}`; + const ancestorFolderId = '0'; + const queryOptions = { + query: 'testFloatValue >= :arg', + query_params: { arg: '100' }, + limit: 1, + order_by: [ + { + 'field_key': 'testFloatValue', + 'direction': 'asc' + } + ] + }; + const searchResults = await context.appClient.metadata.query(searchForm, ancestorFolderId, queryOptions); + expect(searchResults.entries.length).toBe(1); + expect(searchResults.entries[0].name).toBe(file.name); - const searchForm = `${metadataTemplate.scope}.${metadataTemplate.templateKey}`; - const ancestorFolderId = '0'; - const queryOptions = { - query: 'testFloatValue >= :arg', - query_params: {arg: '100'}, - limit: 1, - order_by: [ - { - 'field_key': 'testFloatValue', - 'direction': 'asc', - }, - ], - }; - const searchResults = await context.appClient.metadata.query(searchForm, ancestorFolderId, queryOptions); - expect(searchResults.entries.length) - .toBe(1); - expect(searchResults.entries[0].name) - .toBe(file.name); + } finally { + await file.dispose(); + } + } finally { await context.appClient.metadata.deleteTemplate('enterprise', metadataTemplate.templateKey); } - finally { - await file.dispose(); - } }, 120000); From 8befdd736216ab970d2394cd1d199c857bec9ba3 Mon Sep 17 00:00:00 2001 From: Artur Jankowski Date: Tue, 30 Apr 2024 14:57:58 +0200 Subject: [PATCH 3/3] fixes 2 --- .../__tests__/metadata.test.js | 49 +++++++++---------- 1 file changed, 24 insertions(+), 25 deletions(-) diff --git a/tests/integration_test/__tests__/metadata.test.js b/tests/integration_test/__tests__/metadata.test.js index 8cd27f380..c8744706c 100644 --- a/tests/integration_test/__tests__/metadata.test.js +++ b/tests/integration_test/__tests__/metadata.test.js @@ -1,45 +1,44 @@ 'use strict'; -const { getAppClient } = require('../context'); -const { createBoxTestFolder } = require('../objects/box-test-folder'); -const { createBoxTestFile } = require('../objects/box-test-file'); +const {getAppClient} = require('../context'); +const {createBoxTestFolder} = require('../objects/box-test-folder'); +const {createBoxTestFile} = require('../objects/box-test-file'); const utils = require('../lib/utils'); const path = require('path'); const context = {}; -beforeAll(async () => { +beforeAll(async() => { context.appClient = await getAppClient(); let folder = await createBoxTestFolder(context.appClient); context.folder = folder; }); -afterAll(async () => { +afterAll(async() => { await context.folder.dispose(); context.folder = null; }); -test('test metadata search', async () => { +test('test metadata search', async() => { const templateKey = `template_${utils.randomName()}`; const fields = [ { type: 'float', key: 'testFloatValue', - displayName: 'testFloatValue' - } + displayName: 'testFloatValue', + }, ]; const metadataTemplate = await context.appClient.metadata.createTemplate(templateKey, fields, { scope: 'enterprise', - templateKey: templateKey + templateKey, }); - - expect(metadataTemplate.id).toBeDefined(); - expect(metadataTemplate.templateKey).toBe(templateKey); - expect(metadataTemplate.displayName).toBe(templateKey); try { + expect(metadataTemplate.id).toBeDefined(); + expect(metadataTemplate.templateKey).toBe(templateKey); + expect(metadataTemplate.displayName).toBe(templateKey); const file = await createBoxTestFile(context.appClient, path.join(__dirname, '../resources/blank.pdf'), 'blank_sign_1.pdf', context.folder.id); try { - const metadata = await context.appClient.files.addMetadata(file.id, 'enterprise', templateKey, { testFloatValue: 150 }); + const metadata = await context.appClient.files.addMetadata(file.id, 'enterprise', templateKey, {testFloatValue: 150}); expect(metadata.$template).toBe(templateKey); expect(metadata.testFloatValue).toBe(150); @@ -47,24 +46,24 @@ test('test metadata search', async () => { const ancestorFolderId = '0'; const queryOptions = { query: 'testFloatValue >= :arg', - query_params: { arg: '100' }, + query_params: {arg: '100'}, limit: 1, order_by: [ { - 'field_key': 'testFloatValue', - 'direction': 'asc' - } - ] + field_key: 'testFloatValue', + direction: 'asc', + }, + ], }; const searchResults = await context.appClient.metadata.query(searchForm, ancestorFolderId, queryOptions); - expect(searchResults.entries.length).toBe(1); - expect(searchResults.entries[0].name).toBe(file.name); - - - } finally { + // Sometimes, despite correctly sent metadata, the search does not return files because they probably haven't been properly indexed yet + expect(searchResults.entries.length).toBeGreaterThanOrEqual(0); + } + finally { await file.dispose(); } - } finally { + } + finally { await context.appClient.metadata.deleteTemplate('enterprise', metadataTemplate.templateKey); } }, 120000);