config.ts 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
  2. import 'mocha'
  3. import * as chai from 'chai'
  4. import { About } from '../../../../shared/models/server/about.model'
  5. import { CustomConfig } from '../../../../shared/models/server/custom-config.model'
  6. import {
  7. cleanupTests,
  8. deleteCustomConfig,
  9. flushAndRunServer,
  10. getAbout,
  11. getConfig,
  12. getCustomConfig,
  13. killallServers,
  14. parallelTests,
  15. registerUser,
  16. reRunServer,
  17. ServerInfo,
  18. setAccessTokensToServers,
  19. updateCustomConfig,
  20. uploadVideo
  21. } from '../../../../shared/extra-utils'
  22. import { ServerConfig } from '../../../../shared/models'
  23. const expect = chai.expect
  24. function checkInitialConfig (server: ServerInfo, data: CustomConfig) {
  25. expect(data.instance.name).to.equal('PeerTube')
  26. expect(data.instance.shortDescription).to.equal(
  27. 'PeerTube, an ActivityPub-federated video streaming platform using P2P directly in your web browser.'
  28. )
  29. expect(data.instance.description).to.equal('Welcome to this PeerTube instance!')
  30. expect(data.instance.terms).to.equal('No terms for now.')
  31. expect(data.instance.creationReason).to.be.empty
  32. expect(data.instance.codeOfConduct).to.be.empty
  33. expect(data.instance.moderationInformation).to.be.empty
  34. expect(data.instance.administrator).to.be.empty
  35. expect(data.instance.maintenanceLifetime).to.be.empty
  36. expect(data.instance.businessModel).to.be.empty
  37. expect(data.instance.hardwareInformation).to.be.empty
  38. expect(data.instance.languages).to.have.lengthOf(0)
  39. expect(data.instance.categories).to.have.lengthOf(0)
  40. expect(data.instance.defaultClientRoute).to.equal('/videos/trending')
  41. expect(data.instance.isNSFW).to.be.false
  42. expect(data.instance.defaultNSFWPolicy).to.equal('display')
  43. expect(data.instance.customizations.css).to.be.empty
  44. expect(data.instance.customizations.javascript).to.be.empty
  45. expect(data.services.twitter.username).to.equal('@Chocobozzz')
  46. expect(data.services.twitter.whitelisted).to.be.false
  47. expect(data.cache.previews.size).to.equal(1)
  48. expect(data.cache.captions.size).to.equal(1)
  49. expect(data.signup.enabled).to.be.true
  50. expect(data.signup.limit).to.equal(4)
  51. expect(data.signup.requiresEmailVerification).to.be.false
  52. expect(data.admin.email).to.equal('admin' + server.internalServerNumber + '@example.com')
  53. expect(data.contactForm.enabled).to.be.true
  54. expect(data.user.videoQuota).to.equal(5242880)
  55. expect(data.user.videoQuotaDaily).to.equal(-1)
  56. expect(data.transcoding.enabled).to.be.false
  57. expect(data.transcoding.allowAdditionalExtensions).to.be.false
  58. expect(data.transcoding.allowAudioFiles).to.be.false
  59. expect(data.transcoding.threads).to.equal(2)
  60. expect(data.transcoding.resolutions['240p']).to.be.true
  61. expect(data.transcoding.resolutions['360p']).to.be.true
  62. expect(data.transcoding.resolutions['480p']).to.be.true
  63. expect(data.transcoding.resolutions['720p']).to.be.true
  64. expect(data.transcoding.resolutions['1080p']).to.be.true
  65. expect(data.transcoding.resolutions['2160p']).to.be.true
  66. expect(data.transcoding.webtorrent.enabled).to.be.true
  67. expect(data.transcoding.hls.enabled).to.be.true
  68. expect(data.import.videos.http.enabled).to.be.true
  69. expect(data.import.videos.torrent.enabled).to.be.true
  70. expect(data.autoBlacklist.videos.ofUsers.enabled).to.be.false
  71. expect(data.followers.instance.enabled).to.be.true
  72. expect(data.followers.instance.manualApproval).to.be.false
  73. expect(data.followings.instance.autoFollowBack.enabled).to.be.false
  74. expect(data.followings.instance.autoFollowIndex.enabled).to.be.false
  75. expect(data.followings.instance.autoFollowIndex.indexUrl).to.equal('')
  76. expect(data.broadcastMessage.enabled).to.be.false
  77. expect(data.broadcastMessage.level).to.equal('info')
  78. expect(data.broadcastMessage.message).to.equal('')
  79. expect(data.broadcastMessage.dismissable).to.be.false
  80. }
  81. function checkUpdatedConfig (data: CustomConfig) {
  82. expect(data.instance.name).to.equal('PeerTube updated')
  83. expect(data.instance.shortDescription).to.equal('my short description')
  84. expect(data.instance.description).to.equal('my super description')
  85. expect(data.instance.terms).to.equal('my super terms')
  86. expect(data.instance.creationReason).to.equal('my super creation reason')
  87. expect(data.instance.codeOfConduct).to.equal('my super coc')
  88. expect(data.instance.moderationInformation).to.equal('my super moderation information')
  89. expect(data.instance.administrator).to.equal('Kuja')
  90. expect(data.instance.maintenanceLifetime).to.equal('forever')
  91. expect(data.instance.businessModel).to.equal('my super business model')
  92. expect(data.instance.hardwareInformation).to.equal('2vCore 3GB RAM')
  93. expect(data.instance.languages).to.deep.equal([ 'en', 'es' ])
  94. expect(data.instance.categories).to.deep.equal([ 1, 2 ])
  95. expect(data.instance.defaultClientRoute).to.equal('/videos/recently-added')
  96. expect(data.instance.isNSFW).to.be.true
  97. expect(data.instance.defaultNSFWPolicy).to.equal('blur')
  98. expect(data.instance.customizations.javascript).to.equal('alert("coucou")')
  99. expect(data.instance.customizations.css).to.equal('body { background-color: red; }')
  100. expect(data.services.twitter.username).to.equal('@Kuja')
  101. expect(data.services.twitter.whitelisted).to.be.true
  102. expect(data.cache.previews.size).to.equal(2)
  103. expect(data.cache.captions.size).to.equal(3)
  104. expect(data.signup.enabled).to.be.false
  105. expect(data.signup.limit).to.equal(5)
  106. expect(data.signup.requiresEmailVerification).to.be.false
  107. // We override admin email in parallel tests, so skip this exception
  108. if (parallelTests() === false) {
  109. expect(data.admin.email).to.equal('superadmin1@example.com')
  110. }
  111. expect(data.contactForm.enabled).to.be.false
  112. expect(data.user.videoQuota).to.equal(5242881)
  113. expect(data.user.videoQuotaDaily).to.equal(318742)
  114. expect(data.transcoding.enabled).to.be.true
  115. expect(data.transcoding.threads).to.equal(1)
  116. expect(data.transcoding.allowAdditionalExtensions).to.be.true
  117. expect(data.transcoding.allowAudioFiles).to.be.true
  118. expect(data.transcoding.resolutions['240p']).to.be.false
  119. expect(data.transcoding.resolutions['360p']).to.be.true
  120. expect(data.transcoding.resolutions['480p']).to.be.true
  121. expect(data.transcoding.resolutions['720p']).to.be.false
  122. expect(data.transcoding.resolutions['1080p']).to.be.false
  123. expect(data.transcoding.resolutions['2160p']).to.be.false
  124. expect(data.transcoding.hls.enabled).to.be.false
  125. expect(data.transcoding.webtorrent.enabled).to.be.true
  126. expect(data.import.videos.http.enabled).to.be.false
  127. expect(data.import.videos.torrent.enabled).to.be.false
  128. expect(data.autoBlacklist.videos.ofUsers.enabled).to.be.true
  129. expect(data.followers.instance.enabled).to.be.false
  130. expect(data.followers.instance.manualApproval).to.be.true
  131. expect(data.followings.instance.autoFollowBack.enabled).to.be.true
  132. expect(data.followings.instance.autoFollowIndex.enabled).to.be.true
  133. expect(data.followings.instance.autoFollowIndex.indexUrl).to.equal('https://updated.example.com')
  134. expect(data.broadcastMessage.enabled).to.be.true
  135. expect(data.broadcastMessage.level).to.equal('error')
  136. expect(data.broadcastMessage.message).to.equal('super bad message')
  137. expect(data.broadcastMessage.dismissable).to.be.true
  138. }
  139. describe('Test config', function () {
  140. let server = null
  141. before(async function () {
  142. this.timeout(30000)
  143. server = await flushAndRunServer(1)
  144. await setAccessTokensToServers([ server ])
  145. })
  146. it('Should have a correct config on a server with registration enabled', async function () {
  147. const res = await getConfig(server.url)
  148. const data: ServerConfig = res.body
  149. expect(data.signup.allowed).to.be.true
  150. })
  151. it('Should have a correct config on a server with registration enabled and a users limit', async function () {
  152. this.timeout(5000)
  153. await Promise.all([
  154. registerUser(server.url, 'user1', 'super password'),
  155. registerUser(server.url, 'user2', 'super password'),
  156. registerUser(server.url, 'user3', 'super password')
  157. ])
  158. const res = await getConfig(server.url)
  159. const data: ServerConfig = res.body
  160. expect(data.signup.allowed).to.be.false
  161. })
  162. it('Should have the correct video allowed extensions', async function () {
  163. const res = await getConfig(server.url)
  164. const data: ServerConfig = res.body
  165. expect(data.video.file.extensions).to.have.lengthOf(3)
  166. expect(data.video.file.extensions).to.contain('.mp4')
  167. expect(data.video.file.extensions).to.contain('.webm')
  168. expect(data.video.file.extensions).to.contain('.ogv')
  169. await uploadVideo(server.url, server.accessToken, { fixture: 'video_short.mkv' }, 400)
  170. await uploadVideo(server.url, server.accessToken, { fixture: 'sample.ogg' }, 400)
  171. expect(data.contactForm.enabled).to.be.true
  172. })
  173. it('Should get the customized configuration', async function () {
  174. const res = await getCustomConfig(server.url, server.accessToken)
  175. const data = res.body as CustomConfig
  176. checkInitialConfig(server, data)
  177. })
  178. it('Should update the customized configuration', async function () {
  179. const newCustomConfig: CustomConfig = {
  180. instance: {
  181. name: 'PeerTube updated',
  182. shortDescription: 'my short description',
  183. description: 'my super description',
  184. terms: 'my super terms',
  185. codeOfConduct: 'my super coc',
  186. creationReason: 'my super creation reason',
  187. moderationInformation: 'my super moderation information',
  188. administrator: 'Kuja',
  189. maintenanceLifetime: 'forever',
  190. businessModel: 'my super business model',
  191. hardwareInformation: '2vCore 3GB RAM',
  192. languages: [ 'en', 'es' ],
  193. categories: [ 1, 2 ],
  194. defaultClientRoute: '/videos/recently-added',
  195. isNSFW: true,
  196. defaultNSFWPolicy: 'blur' as 'blur',
  197. customizations: {
  198. javascript: 'alert("coucou")',
  199. css: 'body { background-color: red; }'
  200. }
  201. },
  202. theme: {
  203. default: 'default'
  204. },
  205. services: {
  206. twitter: {
  207. username: '@Kuja',
  208. whitelisted: true
  209. }
  210. },
  211. cache: {
  212. previews: {
  213. size: 2
  214. },
  215. captions: {
  216. size: 3
  217. }
  218. },
  219. signup: {
  220. enabled: false,
  221. limit: 5,
  222. requiresEmailVerification: false
  223. },
  224. admin: {
  225. email: 'superadmin1@example.com'
  226. },
  227. contactForm: {
  228. enabled: false
  229. },
  230. user: {
  231. videoQuota: 5242881,
  232. videoQuotaDaily: 318742
  233. },
  234. transcoding: {
  235. enabled: true,
  236. allowAdditionalExtensions: true,
  237. allowAudioFiles: true,
  238. threads: 1,
  239. resolutions: {
  240. '0p': false,
  241. '240p': false,
  242. '360p': true,
  243. '480p': true,
  244. '720p': false,
  245. '1080p': false,
  246. '2160p': false
  247. },
  248. webtorrent: {
  249. enabled: true
  250. },
  251. hls: {
  252. enabled: false
  253. }
  254. },
  255. import: {
  256. videos: {
  257. http: {
  258. enabled: false
  259. },
  260. torrent: {
  261. enabled: false
  262. }
  263. }
  264. },
  265. autoBlacklist: {
  266. videos: {
  267. ofUsers: {
  268. enabled: true
  269. }
  270. }
  271. },
  272. followers: {
  273. instance: {
  274. enabled: false,
  275. manualApproval: true
  276. }
  277. },
  278. followings: {
  279. instance: {
  280. autoFollowBack: {
  281. enabled: true
  282. },
  283. autoFollowIndex: {
  284. enabled: true,
  285. indexUrl: 'https://updated.example.com'
  286. }
  287. }
  288. },
  289. broadcastMessage: {
  290. enabled: true,
  291. level: 'error',
  292. message: 'super bad message',
  293. dismissable: true
  294. },
  295. search: {
  296. remoteUri: {
  297. anonymous: true,
  298. users: true
  299. },
  300. searchIndex: {
  301. enabled: true,
  302. url: 'https://search.joinpeertube.org',
  303. disableLocalSearch: true,
  304. isDefaultSearch: true
  305. }
  306. }
  307. }
  308. await updateCustomConfig(server.url, server.accessToken, newCustomConfig)
  309. const res = await getCustomConfig(server.url, server.accessToken)
  310. const data = res.body
  311. checkUpdatedConfig(data)
  312. })
  313. it('Should have the correct updated video allowed extensions', async function () {
  314. const res = await getConfig(server.url)
  315. const data: ServerConfig = res.body
  316. expect(data.video.file.extensions).to.have.length.above(3)
  317. expect(data.video.file.extensions).to.contain('.mp4')
  318. expect(data.video.file.extensions).to.contain('.webm')
  319. expect(data.video.file.extensions).to.contain('.ogv')
  320. expect(data.video.file.extensions).to.contain('.flv')
  321. expect(data.video.file.extensions).to.contain('.wmv')
  322. expect(data.video.file.extensions).to.contain('.mkv')
  323. expect(data.video.file.extensions).to.contain('.mp3')
  324. expect(data.video.file.extensions).to.contain('.ogg')
  325. expect(data.video.file.extensions).to.contain('.flac')
  326. await uploadVideo(server.url, server.accessToken, { fixture: 'video_short.mkv' }, 200)
  327. await uploadVideo(server.url, server.accessToken, { fixture: 'sample.ogg' }, 200)
  328. })
  329. it('Should have the configuration updated after a restart', async function () {
  330. this.timeout(10000)
  331. killallServers([ server ])
  332. await reRunServer(server)
  333. const res = await getCustomConfig(server.url, server.accessToken)
  334. const data = res.body
  335. checkUpdatedConfig(data)
  336. })
  337. it('Should fetch the about information', async function () {
  338. const res = await getAbout(server.url)
  339. const data: About = res.body
  340. expect(data.instance.name).to.equal('PeerTube updated')
  341. expect(data.instance.shortDescription).to.equal('my short description')
  342. expect(data.instance.description).to.equal('my super description')
  343. expect(data.instance.terms).to.equal('my super terms')
  344. expect(data.instance.codeOfConduct).to.equal('my super coc')
  345. expect(data.instance.creationReason).to.equal('my super creation reason')
  346. expect(data.instance.moderationInformation).to.equal('my super moderation information')
  347. expect(data.instance.administrator).to.equal('Kuja')
  348. expect(data.instance.maintenanceLifetime).to.equal('forever')
  349. expect(data.instance.businessModel).to.equal('my super business model')
  350. expect(data.instance.hardwareInformation).to.equal('2vCore 3GB RAM')
  351. expect(data.instance.languages).to.deep.equal([ 'en', 'es' ])
  352. expect(data.instance.categories).to.deep.equal([ 1, 2 ])
  353. })
  354. it('Should remove the custom configuration', async function () {
  355. this.timeout(10000)
  356. await deleteCustomConfig(server.url, server.accessToken)
  357. const res = await getCustomConfig(server.url, server.accessToken)
  358. const data = res.body
  359. checkInitialConfig(server, data)
  360. })
  361. after(async function () {
  362. await cleanupTests([ server ])
  363. })
  364. })