Add ability to filter overall video stats by date

This commit is contained in:
Chocobozzz
2022-05-06 14:23:02 +02:00
parent 49f0468d44
commit f40712abbb
15 changed files with 383 additions and 107 deletions

View File

@@ -176,7 +176,7 @@ describe('Test videos views', function () {
await servers[0].videoStats.getTimeserieStats({
videoId,
metric: 'viewers',
startDate: new Date('2021-04-07T08:31:57.126Z'),
startDate: new Date('2000-04-07T08:31:57.126Z'),
endDate: new Date(),
expectedStatus: HttpStatusCode.BAD_REQUEST_400
})

View File

@@ -169,6 +169,7 @@ describe('Test views overall stats', function () {
describe('Test watchers peak stats of local videos on VOD', function () {
let videoUUID: string
let before2Watchers: Date
before(async function () {
this.timeout(120000);
@@ -201,7 +202,7 @@ describe('Test views overall stats', function () {
it('Should have watcher peak with 2 watchers', async function () {
this.timeout(60000)
const before = new Date()
before2Watchers = new Date()
await servers[0].views.view({ id: videoUUID, currentTime: 0 })
await servers[1].views.view({ id: videoUUID, currentTime: 0 })
await servers[0].views.view({ id: videoUUID, currentTime: 2 })
@@ -213,11 +214,26 @@ describe('Test views overall stats', function () {
const stats = await servers[0].videoStats.getOverallStats({ videoId: videoUUID })
expect(stats.viewersPeak).to.equal(2)
expect(new Date(stats.viewersPeakDate)).to.be.above(before).and.below(after)
expect(new Date(stats.viewersPeakDate)).to.be.above(before2Watchers).and.below(after)
})
it('Should filter peak viewers stats by date', async function () {
{
const stats = await servers[0].videoStats.getOverallStats({ videoId: videoUUID, startDate: new Date().toISOString() })
expect(stats.viewersPeak).to.equal(0)
expect(stats.viewersPeakDate).to.not.exist
}
{
const stats = await servers[0].videoStats.getOverallStats({ videoId: videoUUID, endDate: before2Watchers.toISOString() })
expect(stats.viewersPeak).to.equal(1)
expect(new Date(stats.viewersPeakDate)).to.be.below(before2Watchers)
}
})
})
describe('Test countries', function () {
let videoUUID: string
it('Should not report countries if geoip is disabled', async function () {
this.timeout(120000)
@@ -237,6 +253,7 @@ describe('Test views overall stats', function () {
this.timeout(240000)
const { uuid } = await servers[0].videos.quickUpload({ name: 'video' })
videoUUID = uuid
await waitJobs(servers)
await Promise.all([
@@ -265,6 +282,11 @@ describe('Test views overall stats', function () {
expect(stats.countries[1].isoCode).to.equal('FR')
expect(stats.countries[1].viewers).to.equal(1)
})
it('Should filter countries stats by date', async function () {
const stats = await servers[0].videoStats.getOverallStats({ videoId: videoUUID, startDate: new Date().toISOString() })
expect(stats.countries).to.have.lengthOf(0)
})
})
after(async function () {

View File

@@ -9,6 +9,15 @@ import { cleanupTests, PeerTubeServer, stopFfmpeg } from '@shared/server-command
const expect = chai.expect
function buildOneMonthAgo () {
const monthAgo = new Date()
monthAgo.setHours(0, 0, 0, 0)
monthAgo.setDate(monthAgo.getDate() - 29)
return monthAgo
}
describe('Test views timeserie stats', function () {
const availableMetrics: VideoStatsTimeserieMetric[] = [ 'viewers' ]
@@ -33,7 +42,7 @@ describe('Test views timeserie stats', function () {
for (const metric of availableMetrics) {
const { data } = await servers[0].videoStats.getTimeserieStats({ videoId: vodVideoId, metric })
expect(data).to.have.lengthOf(30)
expect(data).to.have.length.at.least(1)
for (const d of data) {
expect(d.value).to.equal(0)
@@ -47,17 +56,19 @@ describe('Test views timeserie stats', function () {
let liveVideoId: string
let command: FfmpegCommand
function expectTodayLastValue (result: VideoStatsTimeserie, lastValue: number) {
function expectTodayLastValue (result: VideoStatsTimeserie, lastValue?: number) {
const { data } = result
const last = data[data.length - 1]
const today = new Date().getDate()
expect(new Date(last.date).getDate()).to.equal(today)
if (lastValue) expect(last.value).to.equal(lastValue)
}
function expectTimeserieData (result: VideoStatsTimeserie, lastValue: number) {
const { data } = result
expect(data).to.have.lengthOf(30)
expect(data).to.have.length.at.least(25)
expectTodayLastValue(result, lastValue)
@@ -87,14 +98,24 @@ describe('Test views timeserie stats', function () {
await processViewersStats(servers)
for (const videoId of [ vodVideoId, liveVideoId ]) {
const result = await servers[0].videoStats.getTimeserieStats({ videoId, metric: 'viewers' })
const result = await servers[0].videoStats.getTimeserieStats({
videoId,
startDate: buildOneMonthAgo(),
endDate: new Date(),
metric: 'viewers'
})
expectTimeserieData(result, 2)
}
})
it('Should display appropriate watch time metrics', async function () {
for (const videoId of [ vodVideoId, liveVideoId ]) {
const result = await servers[0].videoStats.getTimeserieStats({ videoId, metric: 'aggregateWatchTime' })
const result = await servers[0].videoStats.getTimeserieStats({
videoId,
startDate: buildOneMonthAgo(),
endDate: new Date(),
metric: 'aggregateWatchTime'
})
expectTimeserieData(result, 8)
await servers[1].views.simulateViewer({ id: videoId, currentTimes: [ 0, 1 ] })
@@ -103,7 +124,12 @@ describe('Test views timeserie stats', function () {
await processViewersStats(servers)
for (const videoId of [ vodVideoId, liveVideoId ]) {
const result = await servers[0].videoStats.getTimeserieStats({ videoId, metric: 'aggregateWatchTime' })
const result = await servers[0].videoStats.getTimeserieStats({
videoId,
startDate: buildOneMonthAgo(),
endDate: new Date(),
metric: 'aggregateWatchTime'
})
expectTimeserieData(result, 9)
}
})
@@ -130,6 +156,38 @@ describe('Test views timeserie stats', function () {
expectTodayLastValue(result, 9)
})
it('Should automatically group by months', async function () {
const now = new Date()
const heightYearsAgo = new Date()
heightYearsAgo.setFullYear(heightYearsAgo.getFullYear() - 7)
const result = await servers[0].videoStats.getTimeserieStats({
videoId: vodVideoId,
metric: 'aggregateWatchTime',
startDate: heightYearsAgo,
endDate: now
})
expect(result.groupInterval).to.equal('6 months')
expect(result.data).to.have.length.above(10).and.below(200)
})
it('Should automatically group by days', async function () {
const now = new Date()
const threeMonthsAgo = new Date()
threeMonthsAgo.setMonth(threeMonthsAgo.getMonth() - 3)
const result = await servers[0].videoStats.getTimeserieStats({
videoId: vodVideoId,
metric: 'aggregateWatchTime',
startDate: threeMonthsAgo,
endDate: now
})
expect(result.groupInterval).to.equal('2 days')
expect(result.data).to.have.length.above(10).and.below(200)
})
it('Should automatically group by hours', async function () {
const now = new Date()
const twoDaysAgo = new Date()
@@ -165,7 +223,7 @@ describe('Test views timeserie stats', function () {
expect(result.data).to.have.length.above(20).and.below(30)
expectInterval(result, 60 * 10 * 1000)
expectTodayLastValue(result, 9)
expectTodayLastValue(result)
})
it('Should automatically group by one minute', async function () {
@@ -184,7 +242,7 @@ describe('Test views timeserie stats', function () {
expect(result.data).to.have.length.above(20).and.below(40)
expectInterval(result, 60 * 1000)
expectTodayLastValue(result, 9)
expectTodayLastValue(result)
})
after(async function () {