first commit
Security: Sync from Public / sync-from-public (push) Has been cancelled
Test: Benchmark Nightly / build (push) Has been cancelled
Test: Benchmark Nightly / Notify Cats on failure (push) Has been cancelled
CI: Python / Checks (push) Has been cancelled
Test: Evals Python / Workflow Comparison Python (push) Has been cancelled
Util: Check Docs URLs / check-docs-urls (push) Has been cancelled
Test: Visual Storybook / Cloudflare Pages (push) Has been cancelled
Test: E2E Performance / build-and-test-performance (push) Has been cancelled
Test: Workflows Nightly / Run Workflow Tests (push) Has been cancelled
Util: Cleanup CI Docker Images / Delete stale CI images (push) Has been cancelled
Test: Benchmark Destroy Env / build (push) Has been cancelled
Util: Update Node Popularity / update-popularity (push) Has been cancelled
Test: E2E Coverage Weekly / Coverage Tests (push) Has been cancelled

This commit is contained in:
2026-03-17 16:22:57 +03:30
commit 3d5eaf9445
15349 changed files with 2847338 additions and 0 deletions
@@ -0,0 +1,65 @@
{
"nodes": [
{
"parameters": {},
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [0, 0],
"id": "1307e408-a8a5-464e-b858-494953e2f43b",
"name": "When clicking Execute workflow"
},
{
"parameters": {
"authentication": "oAuth2",
"resource": "container",
"operation": "get",
"container": { "__rl": true, "value": "mycontainer", "mode": "id" },
"options": { "simplify": false },
"requestOptions": {}
},
"type": "n8n-nodes-base.azureStorage",
"typeVersion": 1,
"position": [220, 0],
"id": "3429f7f2-dfca-4b72-8913-43a582e96e66",
"name": "Azure Storage",
"credentials": {
"azureStorageOAuth2Api": {
"id": "VPmcFM58eDDexWQL",
"name": "Azure Storage OAuth2 account"
}
}
}
],
"connections": {
"When clicking Execute workflow": {
"main": [[{ "node": "Azure Storage", "type": "main", "index": 0 }]]
}
},
"pinData": {
"Azure Storage": [
{
"json": {
"name": "mycontainer",
"properties": {
"lastModified": "Tue, 28 Jan 2025 16:40:21 GMT",
"etag": "\"0x8DD3FBA74CF3620\"",
"leaseStatus": "unlocked",
"leaseState": "available",
"hasImmutabilityPolicy": false,
"hasLegalHold": false,
"leaseDuration": "infinite",
"blobPublicAccess": "blob",
"contentLength": 0,
"date": "Wed, 29 Jan 2025 08:43:08 GMT",
"requestId": "49edb268-b01e-0053-6e29-72d574000000",
"server": "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0",
"version": "2020-10-02"
},
"metadata": {
"key1": "field1"
}
}
}
]
}
}
@@ -0,0 +1,62 @@
{
"nodes": [
{
"parameters": {},
"type": "n8n-nodes-base.manualTrigger",
"typeVersion": 1,
"position": [0, 0],
"id": "1307e408-a8a5-464e-b858-494953e2f43b",
"name": "When clicking Execute workflow"
},
{
"parameters": {
"resource": "container",
"operation": "get",
"container": { "__rl": true, "value": "mycontainer", "mode": "id" },
"options": { "simplify": false },
"requestOptions": {}
},
"type": "n8n-nodes-base.azureStorage",
"typeVersion": 1,
"position": [220, 0],
"id": "3429f7f2-dfca-4b72-8913-43a582e96e66",
"name": "Azure Storage",
"credentials": {
"azureStorageSharedKeyApi": {
"id": "VPmcFM58eDDexWQL",
"name": "Azure Storage Shared Key account"
}
}
}
],
"connections": {
"When clicking Execute workflow": {
"main": [[{ "node": "Azure Storage", "type": "main", "index": 0 }]]
}
},
"pinData": {
"Azure Storage": [
{
"json": {
"name": "mycontainer",
"properties": {
"lastModified": "Tue, 28 Jan 2025 16:40:21 GMT",
"etag": "\"0x8DD3FBA74CF3620\"",
"leaseStatus": "unlocked",
"leaseState": "available",
"hasImmutabilityPolicy": false,
"hasLegalHold": false,
"leaseDuration": "infinite",
"blobPublicAccess": "blob",
"contentLength": 0,
"date": "Wed, 29 Jan 2025 08:43:08 GMT",
"requestId": "49edb268-b01e-0053-6e29-72d574000000",
"server": "Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0",
"version": "2020-10-02"
},
"metadata": { "key1": "field1" }
}
}
]
}
}
@@ -0,0 +1,38 @@
import { NodeTestHarness } from '@nodes-testing/node-test-harness';
import { credentials } from '../credentials';
describe('Azure Storage Node', () => {
const { baseUrl } = credentials.azureStorageOAuth2Api;
new NodeTestHarness().setupTests({
credentials,
workflowFiles: ['credentials_oauth2.workflow.json'],
nock: {
baseUrl,
mocks: [
{
method: 'get',
path: '/mycontainer?restype=container',
statusCode: 200,
responseBody: '',
responseHeaders: {
'content-length': '0',
'last-modified': 'Tue, 28 Jan 2025 16:40:21 GMT',
etag: '"0x8DD3FBA74CF3620"',
server: 'Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0',
'x-ms-request-id': '49edb268-b01e-0053-6e29-72d574000000',
'x-ms-version': '2020-10-02',
'x-ms-lease-status': 'unlocked',
'x-ms-lease-state': 'available',
'x-ms-has-immutability-policy': 'false',
'x-ms-has-legal-hold': 'false',
date: 'Wed, 29 Jan 2025 08:43:08 GMT',
'x-ms-meta-key1': 'field1',
'x-ms-blob-public-access': 'blob',
'x-ms-lease-duration': 'infinite',
},
},
],
},
});
});
@@ -0,0 +1,110 @@
import { NodeTestHarness } from '@nodes-testing/node-test-harness';
import type { ICredentialDataDecryptedObject, IHttpRequestOptions } from 'n8n-workflow';
import { AzureStorageSharedKeyApi } from '@credentials/AzureStorageSharedKeyApi.credentials';
import { credentials } from '../credentials';
describe('Azure Storage Node', () => {
const { account, baseUrl, key } = credentials.azureStorageSharedKeyApi;
new NodeTestHarness().setupTests({
credentials,
workflowFiles: ['credentials_sharedKey.workflow.json'],
nock: {
baseUrl,
mocks: [
{
method: 'get',
path: '/mycontainer?restype=container',
statusCode: 200,
responseBody: '',
responseHeaders: {
'content-length': '0',
'last-modified': 'Tue, 28 Jan 2025 16:40:21 GMT',
etag: '"0x8DD3FBA74CF3620"',
server: 'Windows-Azure-Blob/1.0 Microsoft-HTTPAPI/2.0',
'x-ms-request-id': '49edb268-b01e-0053-6e29-72d574000000',
'x-ms-version': '2020-10-02',
'x-ms-lease-status': 'unlocked',
'x-ms-lease-state': 'available',
'x-ms-has-immutability-policy': 'false',
'x-ms-has-legal-hold': 'false',
date: 'Wed, 29 Jan 2025 08:43:08 GMT',
'x-ms-meta-key1': 'field1',
'x-ms-blob-public-access': 'blob',
'x-ms-lease-duration': 'infinite',
},
},
],
},
});
describe('authenticate', () => {
const azureStorageSharedKeyApi = new AzureStorageSharedKeyApi();
it('should remove undefined query parameters and headers', async () => {
const authCredentials: ICredentialDataDecryptedObject = {
account,
key,
};
const requestOptions: IHttpRequestOptions = {
url: `${baseUrl}/mycontainer`,
qs: { restype: 'container', query1: undefined },
headers: {
'Content-Length': undefined,
},
method: 'GET',
};
const result = await azureStorageSharedKeyApi.authenticate(authCredentials, requestOptions);
expect(result.qs).toEqual({ restype: 'container' });
expect(result.headers).not.toHaveProperty('Content-Length');
});
it('should default method to GET if not provided', async () => {
const authCredentials: ICredentialDataDecryptedObject = {
account,
key,
};
const requestOptions: IHttpRequestOptions = {
url: `${baseUrl}/mycontainer`,
qs: { restype: 'container' },
headers: {
'Content-Length': undefined,
},
};
const result = await azureStorageSharedKeyApi.authenticate(authCredentials, requestOptions);
expect(result.method).toBe('GET');
});
it('should generate a valid authorization header', async () => {
const authCredentials: ICredentialDataDecryptedObject = {
account,
key,
};
const requestOptions: IHttpRequestOptions = {
url: `${baseUrl}/mycontainer/myblob`,
qs: { param1: 'value1' },
headers: {
'x-ms-date': 'Thu, 27 Feb 2025 11:05:49 GMT',
'x-ms-version': '2021-12-02',
'x-ms-blob-content-language': 'en-EN',
'x-ms-blob-content-type': 'image/jpeg',
'x-ms-expiry-option': 'Absolute',
'x-ms-blob-type': 'BlockBlob',
'x-ms-blob-content-disposition': 'attachment; filename="image.jpg"',
'x-ms-meta-key1': 'value1',
'x-ms-tags': 'tag1=value1',
},
method: 'PUT',
};
const result = await azureStorageSharedKeyApi.authenticate(authCredentials, requestOptions);
expect(result.headers?.authorization).toBe(
'SharedKey devstoreaccount1:6sSQ3N4yNFQynBs/iLptIRPS5DQeaFBocW+dyYbAdOI=',
);
});
});
});