返回 AiToEarn
viral-title.e2e-spec.ts
根目录 / project / aitoearn-electron / server / test / viral-title / viral-title.e2e-spec.ts
1 import supertest from 'supertest';
2 import { Agent } from '../agent';
3 import { platform, platform2 } from '../mockData';
4
5 describe('ViralTitleController (e2e)', () => {
6 let agent: supertest.Agent;
7
8 beforeAll(async () => {
9 agent = Agent.get();
10 });
11
12 describe('findPlatformsWithData', () => {
13 it('should return platforms that have viral title data', async () => {
14 const result = await agent.get('/viral-titles/platforms').expect(200);
15
16 expect(Array.isArray(result.body.data)).toBe(true);
17 result.body.data.forEach(platform => {
18 expect(platform).toHaveProperty('_id');
19 expect(platform).toHaveProperty('name');
20 expect(platform).toHaveProperty('description');
21 expect(platform).toHaveProperty('type');
22 expect(platform).toHaveProperty('status');
23 });
24 });
25 });
26
27 describe('findCategoriesByPlatform', () => {
28 it('should return categories for a specific platform', async () => {
29 const result = await agent
30 .get(`/viral-titles/platforms/${platform._id}/categories`)
31 .expect(200);
32
33 expect(Array.isArray(result.body.data)).toBe(true);
34 result.body.data.forEach(category => {
35 expect(typeof category).toBe('string');
36 });
37 });
38
39 it('should return empty array for platform without data', async () => {
40 const result = await agent
41 .get(`/viral-titles/platforms/${platform2._id}/categories`)
42 .expect(200);
43
44 expect(Array.isArray(result.body.data)).toBe(true);
45 expect(result.body.data.length).toBe(0);
46 });
47 });
48
49 describe('findTopByPlatformAndCategories', () => {
50 it('should return top 5 titles for each category in platform', async () => {
51 const result = await agent
52 .get(`/viral-titles/platforms/${platform._id}/top-by-categories`)
53 .expect(200);
54
55 expect(Array.isArray(result.body.data)).toBe(true);
56 result.body.data.forEach(categoryGroup => {
57 expect(categoryGroup).toHaveProperty('category');
58 expect(categoryGroup).toHaveProperty('titles');
59 expect(Array.isArray(categoryGroup.titles)).toBe(true);
60 expect(categoryGroup.titles.length).toBeLessThanOrEqual(5);
61
62 // Verify each title has required properties
63 categoryGroup.titles.forEach(title => {
64 expect(title).toHaveProperty('platformId');
65 expect(title).toHaveProperty('category');
66 expect(title).toHaveProperty('title');
67 expect(title).toHaveProperty('url');
68 expect(title).toHaveProperty('rank');
69 expect(title).toHaveProperty('engagement');
70 expect(title).toHaveProperty('publishTime');
71
72 // Verify titles belong to correct category and platform
73 expect(title.category).toBe(categoryGroup.category);
74 expect(title.platformId.toString()).toBe(platform._id.toString());
75 });
76
77 // Verify titles are sorted by engagement
78 const engagements = categoryGroup.titles.map(title => title.engagement);
79 expect(engagements).toEqual([...engagements].sort((a, b) => b - a));
80 });
81 });
82 });
83
84 describe('findByPlatformAndCategory', () => {
85 it('should return paginated titles for platform and category', async () => {
86 const result = await agent
87 .get(`/viral-titles/platforms/${platform._id}`)
88 .query({
89 category: '美食',
90 page: 1,
91 pageSize: 10
92 })
93 .expect(200);
94
95 expect(result.body.data).toHaveProperty('items');
96 expect(result.body.data).toHaveProperty('meta');
97
98 const { items, meta } = result.body.data;
99 expect(Array.isArray(items)).toBe(true);
100 expect(items.length).toBeLessThanOrEqual(10);
101
102 // Verify pagination meta
103 expect(meta).toHaveProperty('currentPage');
104 expect(meta).toHaveProperty('itemCount');
105 expect(meta).toHaveProperty('itemsPerPage');
106 expect(meta).toHaveProperty('totalItems');
107 expect(meta).toHaveProperty('totalPages');
108
109 // Verify each title has required properties
110 items.forEach(title => {
111 expect(title).toHaveProperty('platformId');
112 expect(title).toHaveProperty('category');
113 expect(title).toHaveProperty('title');
114 expect(title).toHaveProperty('url');
115 expect(title).toHaveProperty('rank');
116 expect(title).toHaveProperty('engagement');
117 expect(title).toHaveProperty('publishTime');
118
119 // Verify titles belong to correct category and platform
120 expect(title.category).toBe('美食');
121 expect(title.platformId.toString()).toBe(platform._id.toString());
122 });
123
124 // Verify titles are sorted by engagement and rank
125 const engagements = items.map(title => title.engagement);
126 expect(engagements).toEqual([...engagements].sort((a, b) => b - a));
127 });
128
129 it('should filter by date range', async () => {
130 const startTime = new Date('2025-02-15T00:00:00Z');
131 const endTime = new Date('2025-02-15T23:59:59Z');
132
133 const result = await agent
134 .get(`/viral-titles/platforms/${platform._id}`)
135 .query({
136 startTime: startTime.toISOString(),
137 endTime: endTime.toISOString(),
138 page: 1,
139 pageSize: 10
140 })
141 .expect(200);
142
143 const { items } = result.body.data;
144 items.forEach(title => {
145 const publishTime = new Date(title.publishTime);
146 expect(publishTime.getTime()).toBeGreaterThanOrEqual(startTime.getTime());
147 expect(publishTime.getTime()).toBeLessThanOrEqual(endTime.getTime());
148 });
149 });
150 });
151 });
152
152 lines TYPESCRIPT