diff --git a/packages/tests/fixtures/peertube-plugin-test/main.js b/packages/tests/fixtures/peertube-plugin-test/main.js index d8eaa3d71..c2570e6fc 100644 --- a/packages/tests/fixtures/peertube-plugin-test/main.js +++ b/packages/tests/fixtures/peertube-plugin-test/main.js @@ -1,5 +1,24 @@ async function register ({ registerHook, registerSetting, settingsManager, storageManager, peertubeHelpers }) { { + registerSetting({ + name: 'unique-setting', + label: 'Unique setting', + type: 'select', + options: [] + }) + + registerSetting({ + name: 'unique-setting', + label: 'Unique setting', + type: 'select', + options: [ + { + value: 1, + label: 'One' + } + ] + }) + const actionHooks = [ 'action:application.listening', 'action:notifier.notification.created', diff --git a/packages/tests/src/plugins/index.ts b/packages/tests/src/plugins/index.ts index 210af7236..fdcae82d5 100644 --- a/packages/tests/src/plugins/index.ts +++ b/packages/tests/src/plugins/index.ts @@ -5,6 +5,7 @@ import './html-injection' import './id-and-pass-auth' import './plugin-helpers' import './plugin-router' +import './plugin-settings' import './plugin-storage' import './plugin-transcoding' import './plugin-unloading' diff --git a/packages/tests/src/plugins/plugin-settings.ts b/packages/tests/src/plugins/plugin-settings.ts new file mode 100644 index 000000000..cd41c425d --- /dev/null +++ b/packages/tests/src/plugins/plugin-settings.ts @@ -0,0 +1,48 @@ +/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ + +import { expect } from 'chai' +import { + cleanupTests, + createSingleServer, + PeerTubeServer, + PluginsCommand, + setAccessTokensToServers +} from '@peertube/peertube-server-commands' + +describe('Test plugin settings', function () { + let server: PeerTubeServer + let command: PluginsCommand + + before(async function () { + this.timeout(30000) + + server = await createSingleServer(1) + await setAccessTokensToServers([ server ]) + + command = server.plugins + + await command.install({ + path: PluginsCommand.getPluginTestPath() + }) + }) + + it('Should not have duplicate settings', async function () { + const { registeredSettings } = await command.getRegisteredSettings({ + npmName: 'peertube-plugin-test' + }) + + expect(registeredSettings.length).to.equal(1) + }) + + it('Should return the latest registered settings', async function () { + const { registeredSettings } = await command.getRegisteredSettings({ + npmName: 'peertube-plugin-test' + }) + + expect(registeredSettings[0].options.length).length.to.equal(1) + }) + + after(async function () { + await cleanupTests([ server ]) + }) +}) diff --git a/server/core/lib/plugins/register-helpers.ts b/server/core/lib/plugins/register-helpers.ts index 7c44bff88..dc46612a5 100644 --- a/server/core/lib/plugins/register-helpers.ts +++ b/server/core/lib/plugins/register-helpers.ts @@ -44,7 +44,7 @@ export class RegisterHelpers { }[] } = {} - private readonly settings: RegisterServerSettingOptions[] = [] + private settings: RegisterServerSettingOptions[] = [] private idAndPassAuths: RegisterServerAuthPassOptions[] = [] private externalAuths: RegisterServerAuthExternalOptions[] = [] @@ -203,7 +203,10 @@ export class RegisterHelpers { private buildRegisterSetting () { return (options: RegisterServerSettingOptions) => { - this.settings.push(options) + this.settings = [ + ...this.settings.filter((s) => s.name !== options.name), + options + ] } }