mirror of
https://github.com/n8n-io/n8n.git
synced 2025-03-05 20:50:17 -08:00
chore: test file upload for baserow node
This commit is contained in:
parent
84133eeace
commit
350eb81078
|
@ -17,8 +17,6 @@ import {
|
||||||
toOptions,
|
toOptions,
|
||||||
} from './GenericFunctions';
|
} from './GenericFunctions';
|
||||||
|
|
||||||
import { operationFields } from './OperationDescription';
|
|
||||||
|
|
||||||
import type {
|
import type {
|
||||||
BaserowCredentials,
|
BaserowCredentials,
|
||||||
FieldsUiValues,
|
FieldsUiValues,
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
import type {
|
import type {
|
||||||
IDataObject,
|
IDataObject,
|
||||||
IExecuteFunctions,
|
IExecuteFunctions,
|
||||||
|
IHookFunctions,
|
||||||
IHttpRequestMethods,
|
IHttpRequestMethods,
|
||||||
|
IHttpRequestOptions,
|
||||||
ILoadOptionsFunctions,
|
ILoadOptionsFunctions,
|
||||||
IRequestOptions,
|
|
||||||
JsonObject,
|
JsonObject,
|
||||||
} from 'n8n-workflow';
|
} from 'n8n-workflow';
|
||||||
import { NodeApiError } from 'n8n-workflow';
|
import { NodeApiError } from 'n8n-workflow';
|
||||||
|
@ -11,21 +12,21 @@ import { NodeApiError } from 'n8n-workflow';
|
||||||
import type { Accumulator, BaserowCredentials, LoadedResource } from './types';
|
import type { Accumulator, BaserowCredentials, LoadedResource } from './types';
|
||||||
|
|
||||||
export async function baserowFileUploadRequest(
|
export async function baserowFileUploadRequest(
|
||||||
this: IExecuteFunctions,
|
this: IHookFunctions | IExecuteFunctions | ILoadOptionsFunctions,
|
||||||
jwtToken: string,
|
jwtToken: string,
|
||||||
file: Buffer,
|
file: Buffer,
|
||||||
fileName: string,
|
fileName: string,
|
||||||
mimeType: string,
|
mimeType: string,
|
||||||
) {
|
) {
|
||||||
const credentials = (await this.getCredentials('baserowApi')) as BaserowCredentials;
|
const credentials = await this.getCredentials<BaserowCredentials>('baserowApi');
|
||||||
|
|
||||||
const options: OptionsWithUri = {
|
const options: IHttpRequestOptions = {
|
||||||
headers: {
|
headers: {
|
||||||
Authorization: `JWT ${jwtToken}`,
|
Authorization: `JWT ${jwtToken}`,
|
||||||
'Content-Type': 'multipart/form-data',
|
'Content-Type': 'multipart/form-data',
|
||||||
},
|
},
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
uri: `${credentials.host}/api/user-files/upload-file/`,
|
url: `${credentials.host}/api/user-files/upload-file/`,
|
||||||
json: false,
|
json: false,
|
||||||
body: {
|
body: {
|
||||||
file: {
|
file: {
|
||||||
|
@ -39,7 +40,7 @@ export async function baserowFileUploadRequest(
|
||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return await this.helpers.request(options);
|
return await this.helpers.httpRequest(options);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw new NodeApiError(this.getNode(), error as JsonObject);
|
throw new NodeApiError(this.getNode(), error as JsonObject);
|
||||||
}
|
}
|
||||||
|
@ -49,7 +50,7 @@ export async function baserowFileUploadRequest(
|
||||||
* Make a request to Baserow API.
|
* Make a request to Baserow API.
|
||||||
*/
|
*/
|
||||||
export async function baserowApiRequest(
|
export async function baserowApiRequest(
|
||||||
this: IExecuteFunctions | ILoadOptionsFunctions,
|
this: IHookFunctions | IExecuteFunctions | ILoadOptionsFunctions,
|
||||||
method: IHttpRequestMethods,
|
method: IHttpRequestMethods,
|
||||||
endpoint: string,
|
endpoint: string,
|
||||||
jwtToken: string,
|
jwtToken: string,
|
||||||
|
@ -58,25 +59,24 @@ export async function baserowApiRequest(
|
||||||
) {
|
) {
|
||||||
const credentials = await this.getCredentials<BaserowCredentials>('baserowApi');
|
const credentials = await this.getCredentials<BaserowCredentials>('baserowApi');
|
||||||
|
|
||||||
const options: IRequestOptions = {
|
const options: IHttpRequestOptions = {
|
||||||
headers: {
|
headers: {
|
||||||
Authorization: `JWT ${jwtToken}`,
|
Authorization: `JWT ${jwtToken}`,
|
||||||
},
|
},
|
||||||
method,
|
method,
|
||||||
body,
|
body,
|
||||||
qs,
|
qs,
|
||||||
uri: `${credentials.host}${endpoint}`,
|
url: `${credentials.host}${endpoint}`,
|
||||||
json: true,
|
json: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
if (body.formData) {
|
if (body.formData) {
|
||||||
options.json = false;
|
options.json = false;
|
||||||
// set content type to multipart/form-data
|
|
||||||
options.headers = {
|
options.headers = {
|
||||||
...options.headers,
|
...options.headers,
|
||||||
'Content-Type': 'multipart/form-data',
|
'Content-Type': 'multipart/form-data',
|
||||||
};
|
};
|
||||||
options.body.resolveWithFullResponse = true;
|
options.returnFullResponse = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Object.keys(qs).length === 0) {
|
if (Object.keys(qs).length === 0) {
|
||||||
|
@ -88,7 +88,7 @@ export async function baserowApiRequest(
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
return await this.helpers.request(options);
|
return await this.helpers.httpRequest(options);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
throw new NodeApiError(this.getNode(), error as JsonObject);
|
throw new NodeApiError(this.getNode(), error as JsonObject);
|
||||||
}
|
}
|
||||||
|
@ -135,13 +135,13 @@ export async function getJwtToken(
|
||||||
this: IExecuteFunctions | ILoadOptionsFunctions,
|
this: IExecuteFunctions | ILoadOptionsFunctions,
|
||||||
{ username, password, host }: BaserowCredentials,
|
{ username, password, host }: BaserowCredentials,
|
||||||
) {
|
) {
|
||||||
const options: IRequestOptions = {
|
const options: IHttpRequestOptions = {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
body: {
|
body: {
|
||||||
username,
|
username,
|
||||||
password,
|
password,
|
||||||
},
|
},
|
||||||
uri: `${host}/api/user/token-auth/`,
|
url: `${host}/api/user/token-auth/`,
|
||||||
json: true,
|
json: true,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
import type {
|
||||||
|
IExecuteFunctions,
|
||||||
|
IHookFunctions,
|
||||||
|
ILoadOptionsFunctions,
|
||||||
|
IN8nHttpFullResponse,
|
||||||
|
IN8nHttpResponse,
|
||||||
|
INode,
|
||||||
|
} from 'n8n-workflow';
|
||||||
|
|
||||||
|
import { baserowFileUploadRequest } from '../GenericFunctions';
|
||||||
|
import { mock } from 'node:test';
|
||||||
|
|
||||||
|
export const node: INode = {
|
||||||
|
id: 'c4a5ca75-18c7-4cc8-bf7d-5d57bb7d84da',
|
||||||
|
name: 'Baserow Upload',
|
||||||
|
type: 'n8n-nodes-base.Baserow',
|
||||||
|
typeVersion: 1,
|
||||||
|
position: [0, 0],
|
||||||
|
parameters: {
|
||||||
|
operation: 'upload',
|
||||||
|
domain: 'file',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
describe('Baserow', () => {
|
||||||
|
describe('baserowFileUploadRequest', () => {
|
||||||
|
const mockThis = {
|
||||||
|
helpers: {
|
||||||
|
requestWithAuthentication: jest.fn().mockResolvedValue({ statusCode: 200 }),
|
||||||
|
httpRequest: jest.fn(),
|
||||||
|
},
|
||||||
|
getNode() {
|
||||||
|
return node;
|
||||||
|
},
|
||||||
|
getCredentials: jest.fn(),
|
||||||
|
getNodeParameter: jest.fn(),
|
||||||
|
} as unknown as IHookFunctions | IExecuteFunctions | ILoadOptionsFunctions;
|
||||||
|
|
||||||
|
it('should make an authenticated API file-upload request to Baserow', async () => {
|
||||||
|
mockThis.getCredentials.mockResolvedValue({
|
||||||
|
host: 'https://my-host.com',
|
||||||
|
});
|
||||||
|
|
||||||
|
// see https://api.baserow.io/api/redoc/#tag/User-files/operation/upload_file
|
||||||
|
mockThis.helpers.httpRequest.mockResolvedValue({
|
||||||
|
statusCode: 200,
|
||||||
|
body: {
|
||||||
|
size: 2147483647,
|
||||||
|
mime_type: 'string',
|
||||||
|
is_image: true,
|
||||||
|
image_width: 32767,
|
||||||
|
image_height: 32767,
|
||||||
|
uploaded_at: '2019-08-24T14:15:22Z',
|
||||||
|
url: 'http://example.com',
|
||||||
|
thumbnails: {
|
||||||
|
property1: null,
|
||||||
|
property2: null,
|
||||||
|
},
|
||||||
|
name: 'string',
|
||||||
|
original_name: 'string',
|
||||||
|
},
|
||||||
|
} as IN8nHttpFullResponse | IN8nHttpResponse);
|
||||||
|
|
||||||
|
const jwtToken = 'jwt';
|
||||||
|
const file = Buffer.from('file');
|
||||||
|
const filename = 'filename.txt';
|
||||||
|
const mimeType = 'text/plain';
|
||||||
|
|
||||||
|
await baserowFileUploadRequest.call(mockThis, jwtToken, file, filename, mimeType);
|
||||||
|
|
||||||
|
expect(mockThis.getCredentials).toHaveBeenCalledWith('baserowApi');
|
||||||
|
|
||||||
|
expect(mockThis.helpers.httpRequest).toHaveBeenCalledWith({
|
||||||
|
body: {
|
||||||
|
file: {
|
||||||
|
options: { contentType: 'text/plain', filename: 'filename.txt' },
|
||||||
|
value: file,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
headers: { Authorization: 'JWT jwt', 'Content-Type': 'multipart/form-data' },
|
||||||
|
json: false,
|
||||||
|
method: 'POST',
|
||||||
|
url: 'https://my-host.com/api/user-files/upload-file/',
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in a new issue