<commit_before>/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */

import 'mocha'
import * as chai from 'chai'
import {
  cleanupTests,
  createSingleServer,
  killallServers,
  makeGetRequest,
  parallelTests,
  PeerTubeServer,
  setAccessTokensToServers
} from '@shared/extra-utils'
import { CustomConfig, HttpStatusCode } from '@shared/models'

const expect = chai.expect

function checkInitialConfig (server: PeerTubeServer, data: CustomConfig) {
  expect(data.instance.name).to.equal('PeerTube')
  expect(data.instance.shortDescription).to.equal(
    'PeerTube, an ActivityPub-federated video streaming platform using P2P directly in your web browser.'
  )
  expect(data.instance.description).to.equal('Welcome to this PeerTube instance!')

  expect(data.instance.terms).to.equal('No terms for now.')
  expect(data.instance.creationReason).to.be.empty
  expect(data.instance.codeOfConduct).to.be.empty
  expect(data.instance.moderationInformation).to.be.empty
  expect(data.instance.administrator).to.be.empty
  expect(data.instance.maintenanceLifetime).to.be.empty
  expect(data.instance.businessModel).to.be.empty
  expect(data.instance.hardwareInformation).to.be.empty

  expect(data.instance.languages).to.have.lengthOf(0)
  expect(data.instance.categories).to.have.lengthOf(0)

  expect(data.instance.defaultClientRoute).to.equal('/videos/trending')
  expect(data.instance.isNSFW).to.be.false
  expect(data.instance.defaultNSFWPolicy).to.equal('display')
  expect(data.instance.customizations.css).to.be.empty
  expect(data.instance.customizations.javascript).to.be.empty

  expect(data.services.twitter.username).to.equal('@Chocobozzz')
  expect(data.services.twitter.whitelisted).to.be.false

  expect(data.cache.previews.size).to.equal(1)
  expect(data.cache.captions.size).to.equal(1)
  expect(data.cache.torrents.size).to.equal(1)

  expect(data.signup.enabled).to.be.true
  expect(data.signup.limit).to.equal(4)
  expect(data.signup.minimumAge).to.equal(16)
  expect(data.signup.requiresEmailVerification).to.be.false

  expect(data.admin.email).to.equal('admin' + server.internalServerNumber + '@example.com')
  expect(data.contactForm.enabled).to.be.true

  expect(data.user.videoQuota).to.equal(5242880)
  expect(data.user.videoQuotaDaily).to.equal(-1)

  expect(data.transcoding.enabled).to.be.false
  expect(data.transcoding.allowAdditionalExtensions).to.be.false
  expect(data.transcoding.allowAudioFiles).to.be.false
  expect(data.transcoding.threads).to.equal(2)
  expect(data.transcoding.concurrency).to.equal(2)
  expect(data.transcoding.profile).to.equal('default')
  expect(data.transcoding.resolutions['240p']).to.be.true
  expect(data.transcoding.resolutions['360p']).to.be.true
  expect(data.transcoding.resolutions['480p']).to.be.true
  expect(data.transcoding.resolutions['720p']).to.be.true
  expect(data.transcoding.resolutions['1080p']).to.be.true
  expect(data.transcoding.resolutions['1440p']).to.be.true
  expect(data.transcoding.resolutions['2160p']).to.be.true
  expect(data.transcoding.webtorrent.enabled).to.be.true
  expect(data.transcoding.hls.enabled).to.be.true

  expect(data.live.enabled).to.be.false
  expect(data.live.allowReplay).to.be.false
  expect(data.live.maxDuration).to.equal(-1)
  expect(data.live.maxInstanceLives).to.equal(20)
  expect(data.live.maxUserLives).to.equal(3)
  expect(data.live.transcoding.enabled).to.be.false
  expect(data.live.transcoding.threads).to.equal(2)
  expect(data.live.transcoding.profile).to.equal('default')
  expect(data.live.transcoding.resolutions['240p']).to.be.false
  expect(data.live.transcoding.resolutions['360p']).to.be.false
  expect(data.live.transcoding.resolutions['480p']).to.be.false
  expect(data.live.transcoding.resolutions['720p']).to.be.false
  expect(data.live.transcoding.resolutions['1080p']).to.be.false
  expect(data.live.transcoding.resolutions['1440p']).to.be.false
  expect(data.live.transcoding.resolutions['2160p']).to.be.false

  expect(data.import.videos.concurrency).to.equal(2)
  expect(data.import.videos.http.enabled).to.be.true
  expect(data.import.videos.torrent.enabled).to.be.true
  expect(data.autoBlacklist.videos.ofUsers.enabled).to.be.false

  expect(data.followers.instance.enabled).to.be.true
  expect(data.followers.instance.manualApproval).to.be.false

  expect(data.followings.instance.autoFollowBack.enabled).to.be.false
  expect(data.followings.instance.autoFollowIndex.enabled).to.be.false
  expect(data.followings.instance.autoFollowIndex.indexUrl).to.equal('')

  expect(data.broadcastMessage.enabled).to.be.false
  expect(data.broadcastMessage.level).to.equal('info')
  expect(data.broadcastMessage.message).to.equal('')
  expect(data.broadcastMessage.dismissable).to.be.false
}

function checkUpdatedConfig (data: CustomConfig) {
  expect(data.instance.name).to.equal('PeerTube updated')
  expect(data.instance.shortDescription).to.equal('my short description')
  expect(data.instance.description).to.equal('my super description')

  expect(data.instance.terms).to.equal('my super terms')
  expect(data.instance.creationReason).to.equal('my super creation reason')
  expect(data.instance.codeOfConduct).to.equal('my super coc')
  expect(data.instance.moderationInformation).to.equal('my super moderation information')
  expect(data.instance.administrator).to.equal('Kuja')
  expect(data.instance.maintenanceLifetime).to.equal('forever')
  expect(data.instance.businessModel).to.equal('my super business model')
  expect(data.instance.hardwareInformation).to.equal('2vCore 3GB RAM')

  expect(data.instance.languages).to.deep.equal([ 'en', 'es' ])
  expect(data.instance.categories).to.deep.equal([ 1, 2 ])

  expect(data.instance.defaultClientRoute).to.equal('/videos/recently-added')
  expect(data.instance.isNSFW).to.be.true
  expect(data.instance.defaultNSFWPolicy).to.equal('blur')
  expect(data.instance.customizations.javascript).to.equal('alert("coucou")')
  expect(data.instance.customizations.css).to.equal('body { background-color: red; }')

  expect(data.services.twitter.username).to.equal('@Kuja')
  expect(data.services.twitter.whitelisted).to.be.true

  expect(data.cache.previews.size).to.equal(2)
  expect(data.cache.captions.size).to.equal(3)
  expect(data.cache.torrents.size).to.equal(4)

  expect(data.signup.enabled).to.be.false
  expect(data.signup.limit).to.equal(5)
  expect(data.signup.requiresEmailVerification).to.be.false
  expect(data.signup.minimumAge).to.equal(10)

  // We override admin email in parallel tests, so skip this exception
  if (parallelTests() === false) {
    expect(data.admin.email).to.equal('<EMAIL>')
  }

  expect(data.contactForm.enabled).to.be.false

  expect(data.user.videoQuota).to.equal(5242881)
  expect(data.user.videoQuotaDaily).to.equal(318742)

  expect(data.transcoding.enabled).to.be.true
  expect(data.transcoding.threads).to.equal(1)
  expect(data.transcoding.concurrency).to.equal(3)
  expect(data.transcoding.allowAdditionalExtensions).to.be.true
  expect(data.transcoding.allowAudioFiles).to.be.true
  expect(data.transcoding.profile).to.equal('vod_profile')
  expect(data.transcoding.resolutions['240p']).to.be.false
  expect(data.transcoding.resolutions['360p']).to.be.true
  expect(data.transcoding.resolutions['480p']).to.be.true
  expect(data.transcoding.resolutions['720p']).to.be.false
  expect(data.transcoding.resolutions['1080p']).to.be.false
  expect(data.transcoding.resolutions['2160p']).to.be.false
  expect(data.transcoding.hls.enabled).to.be.false
  expect(data.transcoding.webtorrent.enabled).to.be.true

  expect(data.live.enabled).to.be.true
  expect(data.live.allowReplay).to.be.true
  expect(data.live.maxDuration).to.equal(5000)
  expect(data.live.maxInstanceLives).to.equal(-1)
  expect(data.live.maxUserLives).to.equal(10)
  expect(data.live.transcoding.enabled).to.be.true
  expect(data.live.transcoding.threads).to.equal(4)
  expect(data.live.transcoding.profile).to.equal('live_profile')
  expect(data.live.transcoding.resolutions['240p']).to.be.true
  expect(data.live.transcoding.resolutions['360p']).to.be.true
  expect(data.live.transcoding.resolutions['480p']).to.be.true
  expect(data.live.transcoding.resolutions['720p']).to.be.true
  expect(data.live.transcoding.resolutions['1080p']).to.be.true
  expect(data.live.transcoding.resolutions['2160p']).to.be.true

  expect(data.import.videos.concurrency).to.equal(4)
  expect(data.import.videos.http.enabled).to.be.false
  expect(data.import.videos.torrent.enabled).to.be.false
  expect(data.autoBlacklist.videos.ofUsers.enabled).to.be.true

  expect(data.followers.instance.enabled).to.be.false
  expect(data.followers.instance.manualApproval).to.be.true

  expect(data.followings.instance.autoFollowBack.enabled).to.be.true
  expect(data.followings.instance.autoFollowIndex.enabled).to.be.true
  expect(data.followings.instance.autoFollowIndex.indexUrl).to.equal('https://updated.example.com')

  expect(data.broadcastMessage.enabled).to.be.true
  expect(data.broadcastMessage.level).to.equal('error')
  expect(data.broadcastMessage.message).to.equal('super bad message')
  expect(data.broadcastMessage.dismissable).to.be.true
}

const newCustomConfig: CustomConfig = {
  instance: {
    name: 'PeerTube updated',
    shortDescription: 'my short description',
    description: 'my super description',
    terms: 'my super terms',
    codeOfConduct: 'my super coc',

    creationReason: 'my super creation reason',
    moderationInformation: 'my super moderation information',
    administrator: 'Kuja',
    maintenanceLifetime: 'forever',
    businessModel: 'my super business model',
    hardwareInformation: '2vCore 3GB RAM',

    languages: [ 'en', 'es' ],
    categories: [ 1, 2 ],

    isNSFW: true,
    defaultNSFWPolicy: 'blur' as 'blur',

    defaultClientRoute: '/videos/recently-added',

    customizations: {
      javascript: 'alert("coucou")',
      css: 'body { background-color: red; }'
    }
  },
  theme: {
    default: 'default'
  },
  services: {
    twitter: {
      username: '@Kuja',
      whitelisted: true
    }
  },
  cache: {
    previews: {
      size: 2
    },
    captions: {
      size: 3
    },
    torrents: {
      size: 4
    }
  },
  signup: {
    enabled: false,
    limit: 5,
    requiresEmailVerification: false,
    minimumAge: 10
  },
  admin: {
    email: '<EMAIL>'
  },
  contactForm: {
    enabled: false
  },
  user: {
    videoQuota: 5242881,
    videoQuotaDaily: 318742
  },
  transcoding: {
    enabled: true,
    allowAdditionalExtensions: true,
    allowAudioFiles: true,
    threads: 1,
    concurrency: 3,
    profile: 'vod_profile',
    resolutions: {
      '0p': false,
      '240p': false,
      '360p': true,
      '480p': true,
      '720p': false,
      '1080p': false,
      '1440p': false,
      '2160p': false
    },
    webtorrent: {
      enabled: true
    },
    hls: {
      enabled: false
    }
  },
  live: {
    enabled: true,
    allowReplay: true,
    maxDuration: 5000,
    maxInstanceLives: -1,
    maxUserLives: 10,
    transcoding: {
      enabled: true,
      threads: 4,
      profile: 'live_profile',
      resolutions: {
        '240p': true,
        '360p': true,
        '480p': true,
        '720p': true,
        '1080p': true,
        '1440p': true,
        '2160p': true
      }
    }
  },
  import: {
    videos: {
      concurrency: 4,
      http: {
        enabled: false
      },
      torrent: {
        enabled: false
      }
    }
  },
  trending: {
    videos: {
      algorithms: {
        enabled: [ 'best', 'hot', 'most-viewed', 'most-liked' ],
        default: 'hot'
      }
    }
  },
  autoBlacklist: {
    videos: {
      ofUsers: {
        enabled: true
      }
    }
  },
  followers: {
    instance: {
      enabled: false,
      manualApproval: true
    }
  },
  followings: {
    instance: {
      autoFollowBack: {
        enabled: true
      },
      autoFollowIndex: {
        enabled: true,
        indexUrl: 'https://updated.example.com'
      }
    }
  },
  broadcastMessage: {
    enabled: true,
    level: 'error',
    message: 'super bad message',
    dismissable: true
  },
  search: {
    remoteUri: {
      anonymous: true,
      users: true
    },
    searchIndex: {
      enabled: true,
      url: 'https://search.joinpeertube.org',
      disableLocalSearch: true,
      isDefaultSearch: true
    }
  }
}

describe('Test static config', function () {
  let server: PeerTubeServer = null

  before(async function () {
    this.timeout(30000)

    server = await createSingleServer(1, { webadmin: { configuration: { edit: { allowed: false } } } })
    await setAccessTokensToServers([ server ])
  })

  it('Should tell the client that edits are not allowed', async function () {
    const data = await server.config.getConfig()

    expect(data.allowEdits).to.be.false
  })

  it('Should error when client tries to update', async function () {
    await server.config.updateCustomConfig({ newCustomConfig, expectedStatus: 405 })
  })
})

describe('Test config', function () {
  let server: PeerTubeServer = null

  before(async function () {
    this.timeout(30000)
<commit_msg>Fix config test cleanup<commit_after>/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */

import 'mocha'
import * as chai from 'chai'
import {
  cleanupTests,
  createSingleServer,
  killallServers,
  makeGetRequest,
  parallelTests,
  PeerTubeServer,
  setAccessTokensToServers
} from '@shared/extra-utils'
import { CustomConfig, HttpStatusCode } from '@shared/models'

const expect = chai.expect

function checkInitialConfig (server: PeerTubeServer, data: CustomConfig) {
  expect(data.instance.name).to.equal('PeerTube')
  expect(data.instance.shortDescription).to.equal(
    'PeerTube, an ActivityPub-federated video streaming platform using P2P directly in your web browser.'
  )
  expect(data.instance.description).to.equal('Welcome to this PeerTube instance!')

  expect(data.instance.terms).to.equal('No terms for now.')
  expect(data.instance.creationReason).to.be.empty
  expect(data.instance.codeOfConduct).to.be.empty
  expect(data.instance.moderationInformation).to.be.empty
  expect(data.instance.administrator).to.be.empty
  expect(data.instance.maintenanceLifetime).to.be.empty
  expect(data.instance.businessModel).to.be.empty
  expect(data.instance.hardwareInformation).to.be.empty

  expect(data.instance.languages).to.have.lengthOf(0)
  expect(data.instance.categories).to.have.lengthOf(0)

  expect(data.instance.defaultClientRoute).to.equal('/videos/trending')
  expect(data.instance.isNSFW).to.be.false
  expect(data.instance.defaultNSFWPolicy).to.equal('display')
  expect(data.instance.customizations.css).to.be.empty
  expect(data.instance.customizations.javascript).to.be.empty

  expect(data.services.twitter.username).to.equal('@Chocobozzz')
  expect(data.services.twitter.whitelisted).to.be.false

  expect(data.cache.previews.size).to.equal(1)
  expect(data.cache.captions.size).to.equal(1)
  expect(data.cache.torrents.size).to.equal(1)

  expect(data.signup.enabled).to.be.true
  expect(data.signup.limit).to.equal(4)
  expect(data.signup.minimumAge).to.equal(16)
  expect(data.signup.requiresEmailVerification).to.be.false

  expect(data.admin.email).to.equal('admin' + server.internalServerNumber + '@example.com')
  expect(data.contactForm.enabled).to.be.true

  expect(data.user.videoQuota).to.equal(5242880)
  expect(data.user.videoQuotaDaily).to.equal(-1)

  expect(data.transcoding.enabled).to.be.false
  expect(data.transcoding.allowAdditionalExtensions).to.be.false
  expect(data.transcoding.allowAudioFiles).to.be.false
  expect(data.transcoding.threads).to.equal(2)
  expect(data.transcoding.concurrency).to.equal(2)
  expect(data.transcoding.profile).to.equal('default')
  expect(data.transcoding.resolutions['240p']).to.be.true
  expect(data.transcoding.resolutions['360p']).to.be.true
  expect(data.transcoding.resolutions['480p']).to.be.true
  expect(data.transcoding.resolutions['720p']).to.be.true
  expect(data.transcoding.resolutions['1080p']).to.be.true
  expect(data.transcoding.resolutions['1440p']).to.be.true
  expect(data.transcoding.resolutions['2160p']).to.be.true
  expect(data.transcoding.webtorrent.enabled).to.be.true
  expect(data.transcoding.hls.enabled).to.be.true

  expect(data.live.enabled).to.be.false
  expect(data.live.allowReplay).to.be.false
  expect(data.live.maxDuration).to.equal(-1)
  expect(data.live.maxInstanceLives).to.equal(20)
  expect(data.live.maxUserLives).to.equal(3)
  expect(data.live.transcoding.enabled).to.be.false
  expect(data.live.transcoding.threads).to.equal(2)
  expect(data.live.transcoding.profile).to.equal('default')
  expect(data.live.transcoding.resolutions['240p']).to.be.false
  expect(data.live.transcoding.resolutions['360p']).to.be.false
  expect(data.live.transcoding.resolutions['480p']).to.be.false
  expect(data.live.transcoding.resolutions['720p']).to.be.false
  expect(data.live.transcoding.resolutions['1080p']).to.be.false
  expect(data.live.transcoding.resolutions['1440p']).to.be.false
  expect(data.live.transcoding.resolutions['2160p']).to.be.false

  expect(data.import.videos.concurrency).to.equal(2)
  expect(data.import.videos.http.enabled).to.be.true
  expect(data.import.videos.torrent.enabled).to.be.true
  expect(data.autoBlacklist.videos.ofUsers.enabled).to.be.false

  expect(data.followers.instance.enabled).to.be.true
  expect(data.followers.instance.manualApproval).to.be.false

  expect(data.followings.instance.autoFollowBack.enabled).to.be.false
  expect(data.followings.instance.autoFollowIndex.enabled).to.be.false
  expect(data.followings.instance.autoFollowIndex.indexUrl).to.equal('')

  expect(data.broadcastMessage.enabled).to.be.false
  expect(data.broadcastMessage.level).to.equal('info')
  expect(data.broadcastMessage.message).to.equal('')
  expect(data.broadcastMessage.dismissable).to.be.false
}

function checkUpdatedConfig (data: CustomConfig) {
  expect(data.instance.name).to.equal('PeerTube updated')
  expect(data.instance.shortDescription).to.equal('my short description')
  expect(data.instance.description).to.equal('my super description')

  expect(data.instance.terms).to.equal('my super terms')
  expect(data.instance.creationReason).to.equal('my super creation reason')
  expect(data.instance.codeOfConduct).to.equal('my super coc')
  expect(data.instance.moderationInformation).to.equal('my super moderation information')
  expect(data.instance.administrator).to.equal('Kuja')
  expect(data.instance.maintenanceLifetime).to.equal('forever')
  expect(data.instance.businessModel).to.equal('my super business model')
  expect(data.instance.hardwareInformation).to.equal('2vCore 3GB RAM')

  expect(data.instance.languages).to.deep.equal([ 'en', 'es' ])
  expect(data.instance.categories).to.deep.equal([ 1, 2 ])

  expect(data.instance.defaultClientRoute).to.equal('/videos/recently-added')
  expect(data.instance.isNSFW).to.be.true
  expect(data.instance.defaultNSFWPolicy).to.equal('blur')
  expect(data.instance.customizations.javascript).to.equal('alert("coucou")')
  expect(data.instance.customizations.css).to.equal('body { background-color: red; }')

  expect(data.services.twitter.username).to.equal('@Kuja')
  expect(data.services.twitter.whitelisted).to.be.true

  expect(data.cache.previews.size).to.equal(2)
  expect(data.cache.captions.size).to.equal(3)
  expect(data.cache.torrents.size).to.equal(4)

  expect(data.signup.enabled).to.be.false
  expect(data.signup.limit).to.equal(5)
  expect(data.signup.requiresEmailVerification).to.be.false
  expect(data.signup.minimumAge).to.equal(10)

  // We override admin email in parallel tests, so skip this exception
  if (parallelTests() === false) {
    expect(data.admin.email).to.equal('<EMAIL>')
  }

  expect(data.contactForm.enabled).to.be.false

  expect(data.user.videoQuota).to.equal(5242881)
  expect(data.user.videoQuotaDaily).to.equal(318742)

  expect(data.transcoding.enabled).to.be.true
  expect(data.transcoding.threads).to.equal(1)
  expect(data.transcoding.concurrency).to.equal(3)
  expect(data.transcoding.allowAdditionalExtensions).to.be.true
  expect(data.transcoding.allowAudioFiles).to.be.true
  expect(data.transcoding.profile).to.equal('vod_profile')
  expect(data.transcoding.resolutions['240p']).to.be.false
  expect(data.transcoding.resolutions['360p']).to.be.true
  expect(data.transcoding.resolutions['480p']).to.be.true
  expect(data.transcoding.resolutions['720p']).to.be.false
  expect(data.transcoding.resolutions['1080p']).to.be.false
  expect(data.transcoding.resolutions['2160p']).to.be.false
  expect(data.transcoding.hls.enabled).to.be.false
  expect(data.transcoding.webtorrent.enabled).to.be.true

  expect(data.live.enabled).to.be.true
  expect(data.live.allowReplay).to.be.true
  expect(data.live.maxDuration).to.equal(5000)
  expect(data.live.maxInstanceLives).to.equal(-1)
  expect(data.live.maxUserLives).to.equal(10)
  expect(data.live.transcoding.enabled).to.be.true
  expect(data.live.transcoding.threads).to.equal(4)
  expect(data.live.transcoding.profile).to.equal('live_profile')
  expect(data.live.transcoding.resolutions['240p']).to.be.true
  expect(data.live.transcoding.resolutions['360p']).to.be.true
  expect(data.live.transcoding.resolutions['480p']).to.be.true
  expect(data.live.transcoding.resolutions['720p']).to.be.true
  expect(data.live.transcoding.resolutions['1080p']).to.be.true
  expect(data.live.transcoding.resolutions['2160p']).to.be.true

  expect(data.import.videos.concurrency).to.equal(4)
  expect(data.import.videos.http.enabled).to.be.false
  expect(data.import.videos.torrent.enabled).to.be.false
  expect(data.autoBlacklist.videos.ofUsers.enabled).to.be.true

  expect(data.followers.instance.enabled).to.be.false
  expect(data.followers.instance.manualApproval).to.be.true

  expect(data.followings.instance.autoFollowBack.enabled).to.be.true
  expect(data.followings.instance.autoFollowIndex.enabled).to.be.true
  expect(data.followings.instance.autoFollowIndex.indexUrl).to.equal('https://updated.example.com')

  expect(data.broadcastMessage.enabled).to.be.true
  expect(data.broadcastMessage.level).to.equal('error')
  expect(data.broadcastMessage.message).to.equal('super bad message')
  expect(data.broadcastMessage.dismissable).to.be.true
}

const newCustomConfig: CustomConfig = {
  instance: {
    name: 'PeerTube updated',
    shortDescription: 'my short description',
    description: 'my super description',
    terms: 'my super terms',
    codeOfConduct: 'my super coc',

    creationReason: 'my super creation reason',
    moderationInformation: 'my super moderation information',
    administrator: 'Kuja',
    maintenanceLifetime: 'forever',
    businessModel: 'my super business model',
    hardwareInformation: '2vCore 3GB RAM',

    languages: [ 'en', 'es' ],
    categories: [ 1, 2 ],

    isNSFW: true,
    defaultNSFWPolicy: 'blur' as 'blur',

    defaultClientRoute: '/videos/recently-added',

    customizations: {
      javascript: 'alert("coucou")',
      css: 'body { background-color: red; }'
    }
  },
  theme: {
    default: 'default'
  },
  services: {
    twitter: {
      username: '@Kuja',
      whitelisted: true
    }
  },
  cache: {
    previews: {
      size: 2
    },
    captions: {
      size: 3
    },
    torrents: {
      size: 4
    }
  },
  signup: {
    enabled: false,
    limit: 5,
    requiresEmailVerification: false,
    minimumAge: 10
  },
  admin: {
    email: '<EMAIL>'
  },
  contactForm: {
    enabled: false
  },
  user: {
    videoQuota: 5242881,
    videoQuotaDaily: 318742
  },
  transcoding: {
    enabled: true,
    allowAdditionalExtensions: true,
    allowAudioFiles: true,
    threads: 1,
    concurrency: 3,
    profile: 'vod_profile',
    resolutions: {
      '0p': false,
      '240p': false,
      '360p': true,
      '480p': true,
      '720p': false,
      '1080p': false,
      '1440p': false,
      '2160p': false
    },
    webtorrent: {
      enabled: true
    },
    hls: {
      enabled: false
    }
  },
  live: {
    enabled: true,
    allowReplay: true,
    maxDuration: 5000,
    maxInstanceLives: -1,
    maxUserLives: 10,
    transcoding: {
      enabled: true,
      threads: 4,
      profile: 'live_profile',
      resolutions: {
        '240p': true,
        '360p': true,
        '480p': true,
        '720p': true,
        '1080p': true,
        '1440p': true,
        '2160p': true
      }
    }
  },
  import: {
    videos: {
      concurrency: 4,
      http: {
        enabled: false
      },
      torrent: {
        enabled: false
      }
    }
  },
  trending: {
    videos: {
      algorithms: {
        enabled: [ 'best', 'hot', 'most-viewed', 'most-liked' ],
        default: 'hot'
      }
    }
  },
  autoBlacklist: {
    videos: {
      ofUsers: {
        enabled: true
      }
    }
  },
  followers: {
    instance: {
      enabled: false,
      manualApproval: true
    }
  },
  followings: {
    instance: {
      autoFollowBack: {
        enabled: true
      },
      autoFollowIndex: {
        enabled: true,
        indexUrl: 'https://updated.example.com'
      }
    }
  },
  broadcastMessage: {
    enabled: true,
    level: 'error',
    message: 'super bad message',
    dismissable: true
  },
  search: {
    remoteUri: {
      anonymous: true,
      users: true
    },
    searchIndex: {
      enabled: true,
      url: 'https://search.joinpeertube.org',
      disableLocalSearch: true,
      isDefaultSearch: true
    }
  }
}

describe('Test static config', function () {
  let server: PeerTubeServer = null

  before(async function () {
    this.timeout(30000)

    server = await createSingleServer(1, { webadmin: { configuration: { edit: { allowed: false } } } })
    await setAccessTokensToServers([ server ])
  })

  it('Should tell the client that edits are not allowed', async function () {
    const data = await server.config.getConfig()

    expect(data.allowEdits).to.be.false
  })

  it('Should error when client tries to update', async function () {
    await server.config.updateCustomConfig({ newCustomConfig, expectedStatus: 405 })
  })

  after(async function () {
    await cleanupTests([ server ])
  })
})

describe('Test config', function () {
  let server: PeerTubeServer = null

  before(async function () {
    this.timeout(30000)

{'fraction_non_alphanumeric': 0.14971354858291916, 'fraction_numerical': 0.01851500550138483, 'mean_word_length': 3.9807256235827664, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 7, 'https://': 6, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3810367', 'n_tokens_mistral': 9367, 'n_tokens_neox': 8828, 'n_words': 1112}