8a8d4e8bb32588e79c3fcda2317c491ade9b3637
7 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
dd233bdf7d |
test: Fix license tests when tenantId is not default (no-changelog) (#6977)
License tests fail if the env has a non-default `tenantId`:
<details>
<summary>Stack trace</summary>
```
nt -- license
> n8n@1.3.0 test /Users/ivov/Development/n8n/packages/cli
> pnpm test:sqlite "--" "license"
> n8n@1.3.0 test:sqlite /Users/ivov/Development/n8n/packages/cli
> N8N_LOG_LEVEL=silent DB_TYPE=sqlite jest "--" "license"
FAIL test/unit/License.test.ts
License
✕ initializes license manager (8 ms)
✓ attempts to activate license with provided key
✓ renews license (1 ms)
✓ check if feature is enabled (2 ms)
✓ check if sharing feature is enabled (1 ms)
✓ check fetching entitlements
✓ check fetching feature values (1 ms)
✓ check management jwt
✓ getMainPlan() returns the right entitlement (3 ms)
✓ getMainPlan() returns undefined if there is no main plan
● License › initializes license manager
expect(jest.fn()).toHaveBeenCalledWith(...expected)
- Expected
+ Received
Object {
"autoRenewEnabled": true,
"autoRenewOffset": 259200,
- "deviceFingerprint": Any<Function>,
- "loadCertStr": Any<Function>,
- "logger": Anything,
+ "deviceFingerprint": [Function deviceFingerprint],
+ "loadCertStr": [Function loadCertStr],
+ "logger": Logger {
+ "logger": DerivedLogger {
+ "_events": Object {
+ "data": [Function ondata],
+ "end": [Function bound onceWrapper],
+ "prefinish": [Function prefinish],
+ },
+ "_eventsCount": 3,
+ "_maxListeners": undefined,
+ "_readableState": ReadableState {
+ "autoDestroy": false,
+ "awaitDrain": 0,
+ "buffer": BufferList {
+ "head": null,
+ "length": 0,
+ "tail": null,
+ },
+ "decoder": null,
+ "defaultEncoding": "utf8",
+ "destroyed": false,
+ "emitClose": true,
+ "emittedReadable": false,
+ "encoding": null,
+ "endEmitted": false,
+ "ended": false,
+ "flowing": true,
+ "highWaterMark": 16,
+ "length": 0,
+ "needReadable": true,
+ "objectMode": true,
+ "paused": false,
+ "pipes": Console {
+ "__winstonerror": [Function bound transportEvent],
+ "__winstonwarn": [Function bound transportEvent],
+ "_events": Object {
+ "close": [Function bound onceWrapper],
+ "drain": [Function pipeOnDrainFunctionResult],
+ "error": Array [
+ [Function onerror],
+ [Function bound transportEvent],
+ ],
+ "finish": [Function bound onceWrapper],
+ "unpipe": Array [
+ [Function bound onceWrapper],
+ [Function onunpipe],
+ ],
+ "warn": [Function bound transportEvent],
+ },
+ "_eventsCount": 6,
+ "_maxListeners": 30,
+ "_writableState": WritableState {
+ "autoDestroy": false,
+ "bufferProcessing": false,
+ "bufferedRequest": null,
+ "bufferedRequestCount": 0,
+ "corked": 0,
+ "corkedRequestsFree": CorkedRequest {
+ "entry": null,
+ "finish": [Function anonymous],
+ "next": null,
+ },
+ "decodeStrings": true,
+ "defaultEncoding": "utf8",
+ "destroyed": false,
+ "emitClose": true,
+ "ended": false,
+ "ending": false,
+ "errorEmitted": false,
+ "finalCalled": false,
+ "finished": false,
+ "highWaterMark": 16,
+ "lastBufferedRequest": null,
+ "length": 0,
+ "needDrain": false,
+ "objectMode": true,
+ "onwrite": [Function anonymous],
+ "pendingcb": 0,
+ "prefinished": false,
+ "sync": true,
+ "writecb": null,
+ "writelen": 0,
+ "writing": false,
+ },
+ "consoleWarnLevels": Object {},
+ "eol": "
+ ",
+ "format": Printf {
+ "template": [Function anonymous],
+ },
+ "handleExceptions": undefined,
+ "handleRejections": undefined,
+ "level": undefined,
+ "levels": Object {
+ "debug": 5,
+ "error": 0,
+ "http": 3,
+ "info": 2,
+ "silly": 6,
+ "verbose": 4,
+ "warn": 1,
+ },
+ "name": "console",
+ "parent": [Circular],
+ "silent": undefined,
+ "stderrLevels": Object {},
+ "writable": true,
+ Symbol(kCapture): false,
+ },
+ "pipesCount": 1,
+ "readableListening": false,
+ "reading": false,
+ "readingMore": false,
+ "resumeScheduled": true,
+ "sync": false,
+ },
+ "_transformState": Object {
+ "afterTransform": [Function bound afterTransform],
+ "needTransform": false,
+ "transforming": false,
+ "writecb": null,
+ "writechunk": null,
+ "writeencoding": null,
+ },
+ "_writableState": WritableState {
+ "autoDestroy": false,
+ "bufferProcessing": false,
+ "bufferedRequest": null,
+ "bufferedRequestCount": 0,
+ "corked": 0,
+ "corkedRequestsFree": CorkedRequest {
+ "entry": null,
+ "finish": [Function anonymous],
+ "next": null,
+ },
+ "decodeStrings": true,
+ "defaultEncoding": "utf8",
+ "destroyed": false,
+ "emitClose": true,
+ "ended": false,
+ "ending": false,
+ "errorEmitted": false,
+ "finalCalled": false,
+ "finished": false,
+ "highWaterMark": 16,
+ "lastBufferedRequest": null,
+ "length": 0,
+ "needDrain": false,
+ "objectMode": true,
+ "onwrite": [Function anonymous],
+ "pendingcb": 0,
+ "prefinished": false,
+ "sync": true,
+ "writecb": null,
+ "writelen": 0,
+ "writing": false,
+ },
+ "allowHalfOpen": true,
+ "defaultMeta": null,
+ "exceptions": ExceptionHandler {
+ "handlers": Map {},
+ "logger": [Circular],
+ },
+ "exitOnError": true,
+ "format": Format {
+ "options": Object {},
+ },
+ "level": "silent",
+ "levels": Object {
+ "debug": 5,
+ "error": 0,
+ "http": 3,
+ "info": 2,
+ "silly": 6,
+ "verbose": 4,
+ "warn": 1,
+ },
+ "profilers": Object {},
+ "readable": true,
+ "rejections": RejectionHandler {
+ "handlers": Map {},
+ "logger": [Circular],
+ },
+ "silent": true,
+ "writable": true,
+ Symbol(kCapture): false,
+ },
+ },
"productIdentifier": "n8n-1.3.0",
- "saveCertStr": Any<Function>,
+ "saveCertStr": [Function saveCertStr],
"server": "https://server.com/v1",
- "tenantId": 1,
+ "tenantId": 1001,
},
Number of calls: 1
29 |
30 | test('initializes license manager', async () => {
> 31 | expect(LicenseManager).toHaveBeenCalledWith({
| ^
32 | autoRenewEnabled: true,
33 | autoRenewOffset: MOCK_RENEW_OFFSET,
34 | deviceFingerprint: expect.any(Function),
at Object.<anonymous> (test/unit/License.test.ts:31:26)
RUNS test/integration/license.api.test.ts
Test Suites: 1 failed, 1 of 2 total
Tests: 1 failed, 9 passed, 10 total
Snapshots: 0 total
Time: 2 s, estimated 4 s
████████████████████████████████████████^C ELIFECYCLE Command failed.
ELIFECYCLE Test failed. See above for more details.
```
</details>
|
||
|
|
e5620ab1e4 |
feat(API): Implement users account quota guards (#6434)
* feat(cli): Implement users account quota guards Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * Remove comment Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * Address PR comments - Getting `usersQuota` from `Settings` repo - Revert `isUserManagementEnabled` helper - Fix FE listing of users Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * Refactor isWithinUserQuota getter and fix tests Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * Revert testDb.ts changes Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * Cleanup & improve types Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * Fix duplicated method * Fix failing test * Remove `isUserManagementEnabled` completely Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * Check for globalRole.name to determine if user is owner Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * Fix unit tests Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * Set isInstanceOwnerSetUp in specs * Fix SettingsUserView UM Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * refactor: License typings suggestions for users quota guards (#6636) refactor: License typings suggestions * Update packages/cli/src/Ldap/helpers.ts Co-authored-by: Iván Ovejero <ivov.src@gmail.com> * Update packages/cli/test/integration/shared/utils.ts Co-authored-by: Iván Ovejero <ivov.src@gmail.com> * Address PR comments Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> * Use 403 for all user quota related errors Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> --------- Signed-off-by: Oleg Ivaniv <me@olegivaniv.com> Co-authored-by: Iván Ovejero <ivov.src@gmail.com> |
||
|
|
a3d26eff79 |
fix: Prevent invocations of 'GET /rest/license' from returning an error when ephemeral licenses are used (#6154)
* fix: Prevent error when invoking with an ephemeral license * add tests |
||
|
|
8b19fdd5f0 |
refactor: Delete a lot of unused and duplicate code in Server and WebhookServer (#5080)
* store n8n version string in a const and use that everywhere * reduce code duplication between Server and WebhookServer * unify redis checks * fix linting |
||
|
|
0a416eebea |
fix: Remove circular dependencies from cli tests (no-changelog) (#5000)
* fix typescript errors in cli * remove circular dependencies from cli tests |
||
|
|
0da338f9b5 |
feat(editor): Add usage and plan pages (#4819)
* feat(editor): Usage and plan page (#4793) feat(editor): usage and plan page * feat(editor): Update Usage and plan page (#4842) * feat(editor): usage and plan store * feat(editor): usage and plan page updates * feat(editor): usage and plan add buttons and alert * tes(editor): usage and plan store * tes(editor): usage remove refresh button and add link to view plans * tes(editor): usage use info tip * tes(editor): usage info style * feat(editor): Get quotas data (#4866) feat(editor): get quotas data * feat(editor): In-app experience (#4875) * feat: Add license quotas endpoint * feat: Add trigger count to workflow activation process * refactor: Get quotas from db * feat: Add license information * ✨ - finalised GET /license endpoint * 🔨 - getActiveTriggerCount return 0 instead of null * 🐛 - ignore manualTrigger when counting active triggers * ✨ - add activation endpoint * ✨ - added renew endpoint * 🔨 - added return type interfaces * 🔨 - handle license errors where methods are called * 🔨 - rename function to match name from lib * feat(editor): usage add plans buttons logic * 🚨 - testing new License methods * feat(editor): usage add more business logic * chore(editor): code formatting * 🚨 - added license api tests * fix(editor): usage store * fix(editor): usage update translations * feat(editor): usage add license activation modal * feat(editor): usage change subscription app url * feat(editor): usage add contact us link * feat(editor): usage fix modal width * ✨ - Add renewal tracking metric * ✨ - add license data to pulse event * 🔨 - set default triggercount on entity model * ✨ - add db migrations for mysql and postgres * fix(editor): Usage api call data processing and error handling * fix(editor): Usage fix activation query key * 🚨 - add initDb to telemetry tests * 🔨 - move getlicensedata to licenseservice * 🔨 - return 403 instead of 404 to non owners * 🔨 - move owner checking to middleware * 🐛 - fixed incorrectly returned error from middleware * 🐛 - using mock instead of test db for pulse tests * fix(editor): Usage fix activation and add success messages * fix(editor): Usage should not renew activation right after activation * 🚨 - skipping failing pulse tests for now * fix(editor): Usage add telemetry calls and apply design review outcomes * feat(editor): Hide usage page according to BE flag * feat(editor): Usage modify key activation flow * feat(editor): Usage change subscription app url * feat(editor): Usage add telemetry for manage plan * feat(editor): Usage extend link url query params * feat(editor): Usage add line chart if there is a workflow limit * feat(editor): Usage remove query after key activation redirection * fix(editor): Usage handle limit exceeded workflow chart, add focus to input when modal opened * fix(editor): Usage activation can return router promise when removing query * fix(editor): Usage and plan design review * 🐛 - fix renew endpoint hanging issue * 🐛 - fix license activation bug * fix(editor): Usage proper translation for plans and/or editions * fix(editor): Usage apply David's review results * fix(editor): Usage page set as default and first under Settings * fix(editor): Usage open subscription app in new tab * fix(editor): Usage page having key query param a plan links * test: Fix broken test * fix(editor): Usage page address review * 🧪 Flush promises on telemetry tests * ⚡ Extract helper with `setImmediate` * 🔥 Remove leftovers * ⚡ Use Adi's helper * refactor: Comment broken tests * refactor: add Tenant id to settings * feat: add environment to license endpoints * refactor: Move license environment to general settings * fix: fix routing bug * fix(editor): Usage page some code review changes and formatting * fix(editor): Usage page remove direct usage of reusable translation keys * fix(editor): Usage page async await instead of then * fix(editor): Usage page show some content only if network requests in component mounted were successful * chore(editor): code formatting * fix(editor): Usage checking license environment * feat(editor): Improve license activation error messages (no-changelog) (#4958) * fix(editor): Usage changing activation error title * remove unnecessary import * fix(editor): Usage refactor notification showing * fix(editor): Usage using notification directly in store actions Co-authored-by: Omar Ajoue <krynble@gmail.com> Co-authored-by: freyamade <freya@n8n.io> Co-authored-by: Iván Ovejero <ivov.src@gmail.com> Co-authored-by: Mutasem <mutdmour@gmail.com> Co-authored-by: Cornelius Suermann <cornelius@n8n.io> * fix(editor): Usage change mounted lifecycle logic * fix(editor): Usage return after successful activation in mounted * fix: remove console log * test: fix tests related to settings (#4979) Co-authored-by: Omar Ajoue <krynble@gmail.com> Co-authored-by: freyamade <freya@n8n.io> Co-authored-by: Iván Ovejero <ivov.src@gmail.com> Co-authored-by: Mutasem <mutdmour@gmail.com> Co-authored-by: Cornelius Suermann <cornelius@n8n.io> Co-authored-by: Mutasem Aldmour <4711238+mutdmour@users.noreply.github.com> |
||
|
|
30e5d3d04c |
feat(core): Add license support to n8n (#4566)
* add sdk * add license manager * type fix * add basic func * store to db * update default * activate license * add sharing flag * fix setup * clear license * update conosle log to info * refactor * use npm dependency * update error logs * add simple test * add license tests * update tests * update pnpm package * fix error handling types * Update packages/cli/src/config/schema.ts Co-authored-by: Cornelius Suermann <cornelius@n8n.io> * make feature enum * add warning * update sdk * Update packages/cli/src/config/schema.ts Co-authored-by: Cornelius Suermann <cornelius@n8n.io> Co-authored-by: Cornelius Suermann <cornelius@n8n.io> |