X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=server%2Ftests%2Fapi%2Fserver%2Fstats.ts;h=65ef4607bde908c1ec0b7faae1d4319a92872657;hb=bf54587a3e2ad9c2c186828f2a5682b91ee2cc00;hp=c207bb5f00196e649e163458c62766e06d2cbab9;hpb=7cd1b12c19d0589d1d692ed0571ca0800f028aea;p=github%2FChocobozzz%2FPeerTube.git diff --git a/server/tests/api/server/stats.ts b/server/tests/api/server/stats.ts index c207bb5f0..65ef4607b 100644 --- a/server/tests/api/server/stats.ts +++ b/server/tests/api/server/stats.ts @@ -1,59 +1,54 @@ /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */ -import * as chai from 'chai' import 'mocha' -import { ServerStats } from '../../../../shared/models/server/server-stats.model' +import * as chai from 'chai' import { cleanupTests, - createUser, + createMultipleServers, doubleFollow, - flushAndRunMultipleServers, - follow, - ServerInfo, - uploadVideo, - viewVideo, - wait -} from '../../../../shared/extra-utils' -import { setAccessTokensToServers } from '../../../../shared/extra-utils/index' -import { getStats } from '../../../../shared/extra-utils/server/stats' -import { addVideoCommentThread } from '../../../../shared/extra-utils/videos/video-comments' -import { waitJobs } from '../../../../shared/extra-utils/server/jobs' + PeerTubeServer, + setAccessTokensToServers, + wait, + waitJobs +} from '@shared/server-commands' +import { ActivityType, VideoPlaylistPrivacy } from '@shared/models' const expect = chai.expect describe('Test stats (excluding redundancy)', function () { - let servers: ServerInfo[] = [] + let servers: PeerTubeServer[] = [] + let channelId + const user = { + username: 'user1', + password: 'super_password' + } before(async function () { this.timeout(60000) - servers = await flushAndRunMultipleServers(3) + + servers = await createMultipleServers(3) + await setAccessTokensToServers(servers) await doubleFollow(servers[0], servers[1]) - const user = { - username: 'user1', - password: 'super_password' - } - await createUser({ url: servers[0].url, accessToken: servers[0].accessToken, username: user.username, password: user.password }) + await servers[0].users.create({ username: user.username, password: user.password }) - const resVideo = await uploadVideo(servers[0].url, servers[0].accessToken, { fixture: 'video_short.webm' }) - const videoUUID = resVideo.body.video.uuid + const { uuid } = await servers[0].videos.upload({ attributes: { fixture: 'video_short.webm' } }) - await addVideoCommentThread(servers[0].url, servers[0].accessToken, videoUUID, 'comment') + await servers[0].comments.createThread({ videoId: uuid, text: 'comment' }) - await viewVideo(servers[0].url, videoUUID) + await servers[0].videos.view({ id: uuid }) // Wait the video views repeatable job await wait(8000) - await follow(servers[2].url, [ servers[0].url ], servers[2].accessToken) + await servers[2].follows.follow({ hosts: [ servers[0].url ] }) await waitJobs(servers) }) it('Should have the correct stats on instance 1', async function () { - const res = await getStats(servers[0].url) - const data: ServerStats = res.body + const data = await servers[0].stats.get() expect(data.totalLocalVideoComments).to.equal(1) expect(data.totalLocalVideos).to.equal(1) @@ -64,11 +59,11 @@ describe('Test stats (excluding redundancy)', function () { expect(data.totalVideos).to.equal(1) expect(data.totalInstanceFollowers).to.equal(2) expect(data.totalInstanceFollowing).to.equal(1) + expect(data.totalLocalPlaylists).to.equal(0) }) it('Should have the correct stats on instance 2', async function () { - const res = await getStats(servers[1].url) - const data: ServerStats = res.body + const data = await servers[1].stats.get() expect(data.totalLocalVideoComments).to.equal(0) expect(data.totalLocalVideos).to.equal(0) @@ -79,11 +74,11 @@ describe('Test stats (excluding redundancy)', function () { expect(data.totalVideos).to.equal(1) expect(data.totalInstanceFollowers).to.equal(1) expect(data.totalInstanceFollowing).to.equal(1) + expect(data.totalLocalPlaylists).to.equal(0) }) it('Should have the correct stats on instance 3', async function () { - const res = await getStats(servers[2].url) - const data: ServerStats = res.body + const data = await servers[2].stats.get() expect(data.totalLocalVideoComments).to.equal(0) expect(data.totalLocalVideos).to.equal(0) @@ -93,6 +88,191 @@ describe('Test stats (excluding redundancy)', function () { expect(data.totalVideos).to.equal(1) expect(data.totalInstanceFollowing).to.equal(1) expect(data.totalInstanceFollowers).to.equal(0) + expect(data.totalLocalPlaylists).to.equal(0) + }) + + it('Should have the correct total videos stats after an unfollow', async function () { + this.timeout(15000) + + await servers[2].follows.unfollow({ target: servers[0] }) + await waitJobs(servers) + + const data = await servers[2].stats.get() + + expect(data.totalVideos).to.equal(0) + }) + + it('Should have the correct active user stats', async function () { + const server = servers[0] + + { + const data = await server.stats.get() + + expect(data.totalDailyActiveUsers).to.equal(1) + expect(data.totalWeeklyActiveUsers).to.equal(1) + expect(data.totalMonthlyActiveUsers).to.equal(1) + } + + { + await server.login.getAccessToken(user) + + const data = await server.stats.get() + + expect(data.totalDailyActiveUsers).to.equal(2) + expect(data.totalWeeklyActiveUsers).to.equal(2) + expect(data.totalMonthlyActiveUsers).to.equal(2) + } + }) + + it('Should have the correct active channel stats', async function () { + const server = servers[0] + + { + const data = await server.stats.get() + + expect(data.totalLocalDailyActiveVideoChannels).to.equal(1) + expect(data.totalLocalWeeklyActiveVideoChannels).to.equal(1) + expect(data.totalLocalMonthlyActiveVideoChannels).to.equal(1) + } + + { + const attributes = { + name: 'stats_channel', + displayName: 'My stats channel' + } + const created = await server.channels.create({ attributes }) + channelId = created.id + + const data = await server.stats.get() + + expect(data.totalLocalDailyActiveVideoChannels).to.equal(1) + expect(data.totalLocalWeeklyActiveVideoChannels).to.equal(1) + expect(data.totalLocalMonthlyActiveVideoChannels).to.equal(1) + } + + { + await server.videos.upload({ attributes: { fixture: 'video_short.webm', channelId } }) + + const data = await server.stats.get() + + expect(data.totalLocalDailyActiveVideoChannels).to.equal(2) + expect(data.totalLocalWeeklyActiveVideoChannels).to.equal(2) + expect(data.totalLocalMonthlyActiveVideoChannels).to.equal(2) + } + }) + + it('Should have the correct playlist stats', async function () { + const server = servers[0] + + { + const data = await server.stats.get() + expect(data.totalLocalPlaylists).to.equal(0) + } + + { + await server.playlists.create({ + attributes: { + displayName: 'playlist for count', + privacy: VideoPlaylistPrivacy.PUBLIC, + videoChannelId: channelId + } + }) + + const data = await server.stats.get() + expect(data.totalLocalPlaylists).to.equal(1) + } + }) + + it('Should correctly count video file sizes if transcoding is enabled', async function () { + this.timeout(60000) + + await servers[0].config.updateCustomSubConfig({ + newConfig: { + transcoding: { + enabled: true, + webtorrent: { + enabled: true + }, + hls: { + enabled: true + }, + resolutions: { + '0p': false, + '144p': false, + '240p': false, + '360p': false, + '480p': false, + '720p': false, + '1080p': false, + '1440p': false, + '2160p': false + } + } + } + }) + + await servers[0].videos.upload({ attributes: { name: 'video', fixture: 'video_short.webm' } }) + + await waitJobs(servers) + + { + const data = await servers[1].stats.get() + expect(data.totalLocalVideoFilesSize).to.equal(0) + } + + { + const data = await servers[0].stats.get() + expect(data.totalLocalVideoFilesSize).to.be.greaterThan(500000) + expect(data.totalLocalVideoFilesSize).to.be.lessThan(600000) + } + }) + + it('Should have the correct AP stats', async function () { + this.timeout(60000) + + await servers[0].config.updateCustomSubConfig({ + newConfig: { + transcoding: { + enabled: false + } + } + }) + + const first = await servers[1].stats.get() + + for (let i = 0; i < 10; i++) { + await servers[0].videos.upload({ attributes: { name: 'video' } }) + } + + await waitJobs(servers) + + await wait(6000) + + const second = await servers[1].stats.get() + expect(second.totalActivityPubMessagesProcessed).to.be.greaterThan(first.totalActivityPubMessagesProcessed) + + const apTypes: ActivityType[] = [ + 'Create', 'Update', 'Delete', 'Follow', 'Accept', 'Announce', 'Undo', 'Like', 'Reject', 'View', 'Dislike', 'Flag' + ] + + const processed = apTypes.reduce( + (previous, type) => previous + second['totalActivityPub' + type + 'MessagesSuccesses'], + 0 + ) + expect(second.totalActivityPubMessagesProcessed).to.equal(processed) + expect(second.totalActivityPubMessagesSuccesses).to.equal(processed) + + expect(second.totalActivityPubMessagesErrors).to.equal(0) + + for (const apType of apTypes) { + expect(second['totalActivityPub' + apType + 'MessagesErrors']).to.equal(0) + } + + await wait(6000) + + const third = await servers[1].stats.get() + expect(third.totalActivityPubMessagesWaiting).to.equal(0) + expect(third.activityPubMessagesProcessedPerSecond).to.be.lessThan(second.activityPubMessagesProcessedPerSecond) }) after(async function () {