feat(image): 新建 knowai-core:1.0.0 镜像并完成推送
Some checks reported errors
continuous-integration/drone/push Build was killed
Some checks reported errors
continuous-integration/drone/push Build was killed
- 搭建 api、auth、utils 等逻辑模块 - 通过 tsc、eslint、vitest 测试验证 BREAKING CHANGE: 新镜像分支
This commit is contained in:
702
test/mocks/data-factory.ts
Normal file
702
test/mocks/data-factory.ts
Normal file
@@ -0,0 +1,702 @@
|
||||
/**
|
||||
* Mock数据工厂
|
||||
* 用于生成测试中使用的各种模拟数据
|
||||
*/
|
||||
|
||||
import type {
|
||||
User,
|
||||
UserProfile,
|
||||
LoginRequest,
|
||||
LoginResponse,
|
||||
RegisterRequest,
|
||||
RegisterResponse,
|
||||
RefreshTokenRequest,
|
||||
RefreshTokenResponse,
|
||||
UserProfileUpdateRequest,
|
||||
UserProfileUpdateResponse,
|
||||
UserFollowRequest,
|
||||
UserFollowResponse
|
||||
} from '@/types/user';
|
||||
import type {
|
||||
Post,
|
||||
PostComment,
|
||||
CreatePostRequest,
|
||||
CreatePostResponse,
|
||||
GetPostsRequest,
|
||||
GetPostsResponse,
|
||||
GetPostRequest,
|
||||
GetPostResponse,
|
||||
LikePostRequest,
|
||||
LikePostResponse,
|
||||
BookmarkPostRequest,
|
||||
BookmarkPostResponse,
|
||||
CreateCommentRequest,
|
||||
CreateCommentResponse,
|
||||
GetCommentsRequest,
|
||||
GetCommentsResponse,
|
||||
LikeCommentRequest,
|
||||
LikeCommentResponse
|
||||
} from '@/types/post';
|
||||
import type {
|
||||
AIModel,
|
||||
ModelComment,
|
||||
GetAIPlazaRequest,
|
||||
GetAIPlazaResponse,
|
||||
GetModelDetailRequest,
|
||||
GetModelDetailResponse,
|
||||
GetModelCommentsRequest,
|
||||
GetModelCommentsResponse,
|
||||
CreateModelCommentRequest,
|
||||
CreateModelCommentResponse,
|
||||
LikeModelCommentRequest,
|
||||
LikeModelCommentResponse
|
||||
} from '@/types/model';
|
||||
import type {
|
||||
ChatSession,
|
||||
ChatMessage,
|
||||
CreateChatSessionRequest,
|
||||
UpdateChatSessionRequest,
|
||||
SendMessageRequest,
|
||||
GetChatSessionsRequest,
|
||||
GetChatSessionsResponse,
|
||||
GetChatMessagesRequest,
|
||||
GetChatMessagesResponse,
|
||||
MarkMessagesAsReadRequest,
|
||||
MarkMessagesAsReadResponse
|
||||
} from '@/types/chat';
|
||||
import type { ApiResponse, ApiRequestConfig } from '@/types';
|
||||
|
||||
// 生成模拟用户数据
|
||||
export function createMockUser(overrides: Partial<User> = {}): User {
|
||||
return {
|
||||
id: 'user-123',
|
||||
username: 'testuser',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟用户档案数据
|
||||
export function createMockUserProfile(overrides: Partial<UserProfile> = {}): UserProfile {
|
||||
return {
|
||||
user: createMockUser(),
|
||||
avatar: 'https://example.com/avatar.jpg',
|
||||
introduction: 'Test user introduction',
|
||||
level: 'advanced',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟登录请求数据
|
||||
export function createMockLoginRequest(overrides: Partial<LoginRequest> = {}): LoginRequest {
|
||||
return {
|
||||
username: 'testuser',
|
||||
password: 'password123',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟登录响应数据
|
||||
export function createMockLoginResponse(overrides: Partial<LoginResponse> = {}): LoginResponse {
|
||||
return {
|
||||
user: createMockUser(),
|
||||
avatar: 'https://example.com/avatar.jpg',
|
||||
token: 'mock-jwt-token',
|
||||
expiresIn: 3600,
|
||||
refreshToken: 'mock-refresh-token',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟注册请求数据
|
||||
export function createMockRegisterRequest(overrides: Partial<RegisterRequest> = {}): RegisterRequest {
|
||||
return {
|
||||
username: 'newuser',
|
||||
password: 'password123',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟注册响应数据
|
||||
export function createMockRegisterResponse(overrides: Partial<RegisterResponse> = {}): RegisterResponse {
|
||||
return {
|
||||
user: createMockUser({ username: 'newuser' }),
|
||||
avatar: 'https://example.com/avatar.jpg',
|
||||
token: 'mock-jwt-token',
|
||||
expiresIn: 3600,
|
||||
refreshToken: 'mock-refresh-token',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟刷新令牌请求数据
|
||||
export function createMockRefreshTokenRequest(overrides: Partial<RefreshTokenRequest> = {}): RefreshTokenRequest {
|
||||
return {
|
||||
refreshToken: 'mock-refresh-token',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟刷新令牌响应数据
|
||||
export function createMockRefreshTokenResponse(overrides: Partial<RefreshTokenResponse> = {}): RefreshTokenResponse {
|
||||
return {
|
||||
token: 'new-mock-jwt-token',
|
||||
expiresIn: 3600,
|
||||
refreshToken: 'new-mock-refresh-token',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟用户档案更新请求数据
|
||||
export function createMockUserProfileUpdateRequest(overrides: Partial<UserProfileUpdateRequest> = {}): UserProfileUpdateRequest {
|
||||
return {
|
||||
avatar: 'https://example.com/new-avatar.jpg',
|
||||
introduction: 'Updated introduction',
|
||||
level: 'expert',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟用户档案更新响应数据
|
||||
export function createMockUserProfileUpdateResponse(overrides: Partial<UserProfileUpdateResponse> = {}): UserProfileUpdateResponse {
|
||||
return {
|
||||
profile: createMockUserProfile({
|
||||
avatar: 'https://example.com/new-avatar.jpg',
|
||||
introduction: 'Updated introduction',
|
||||
level: 'expert'
|
||||
}),
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟用户关注请求数据
|
||||
export function createMockUserFollowRequest(overrides: Partial<UserFollowRequest> = {}): UserFollowRequest {
|
||||
return {
|
||||
userId: 'user-456',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟用户关注响应数据
|
||||
export function createMockUserFollowResponse(overrides: Partial<UserFollowResponse> = {}): UserFollowResponse {
|
||||
return {
|
||||
success: true,
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟帖子数据
|
||||
export function createMockPost(overrides: Partial<Post> = {}): Post {
|
||||
const now = new Date();
|
||||
return {
|
||||
id: 'post-123',
|
||||
createdAt: now,
|
||||
updatedAt: now,
|
||||
title: 'Test Post Title',
|
||||
excerpt: 'This is a test post excerpt',
|
||||
tags: ['test', 'mock'],
|
||||
stars: 5,
|
||||
likes: 10,
|
||||
comments: 2,
|
||||
type: 'article',
|
||||
authorId: 'user-123',
|
||||
author: { user: createMockUser() },
|
||||
images: ['https://example.com/image.jpg'],
|
||||
publishedAt: now,
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟创建帖子请求数据
|
||||
export function createMockCreatePostRequest(overrides: Partial<CreatePostRequest> = {}): CreatePostRequest {
|
||||
return {
|
||||
title: 'New Test Post',
|
||||
excerpt: 'This is a new test post excerpt',
|
||||
tags: ['new', 'test'],
|
||||
stars: 0,
|
||||
likes: 0,
|
||||
comments: 0,
|
||||
type: 'article',
|
||||
images: ['https://example.com/new-image.jpg'],
|
||||
publishedAt: new Date(),
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟创建帖子响应数据
|
||||
export function createMockCreatePostResponse(overrides: Partial<CreatePostResponse> = {}): CreatePostResponse {
|
||||
return {
|
||||
post: createMockPost(),
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟获取帖子列表请求数据
|
||||
export function createMockGetPostsRequest(overrides: Partial<GetPostsRequest> = {}): GetPostsRequest {
|
||||
return {
|
||||
page: 1,
|
||||
limit: 10,
|
||||
sortBy: 'createdAt',
|
||||
type: 'article',
|
||||
sortOrder: 'desc',
|
||||
authorId: 'user-123',
|
||||
search: 'test query',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟获取帖子列表响应数据
|
||||
export function createMockGetPostsResponse(overrides: Partial<GetPostsResponse> = {}): GetPostsResponse {
|
||||
return {
|
||||
data: [createMockPost(), createMockPost({ id: 'post-456' })],
|
||||
total: 2,
|
||||
page: 1,
|
||||
limit: 10,
|
||||
hasMore: false,
|
||||
sortBy: 'createdAt',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟获取帖子详情请求数据
|
||||
export function createMockGetPostRequest(overrides: Partial<GetPostRequest> = {}): GetPostRequest {
|
||||
return {
|
||||
postId: 'post-123',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟获取帖子详情响应数据
|
||||
export function createMockGetPostResponse(overrides: Partial<GetPostResponse> = {}): GetPostResponse {
|
||||
return {
|
||||
post: createMockPost(),
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟点赞帖子请求数据
|
||||
export function createMockLikePostRequest(overrides: Partial<LikePostRequest> = {}): LikePostRequest {
|
||||
return {
|
||||
postId: 'post-123',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟点赞帖子响应数据
|
||||
export function createMockLikePostResponse(overrides: Partial<LikePostResponse> = {}): LikePostResponse {
|
||||
return {
|
||||
success: true,
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟收藏帖子请求数据
|
||||
export function createMockBookmarkPostRequest(overrides: Partial<BookmarkPostRequest> = {}): BookmarkPostRequest {
|
||||
return {
|
||||
postId: 'post-123',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟收藏帖子响应数据
|
||||
export function createMockBookmarkPostResponse(overrides: Partial<BookmarkPostResponse> = {}): BookmarkPostResponse {
|
||||
return {
|
||||
success: true,
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟帖子评论数据
|
||||
export function createMockPostComment(overrides: Partial<PostComment> = {}): PostComment {
|
||||
const now = new Date();
|
||||
return {
|
||||
id: 'comment-123',
|
||||
createdAt: now,
|
||||
updatedAt: now,
|
||||
authorId: 'user-456',
|
||||
author: { user: createMockUser({ id: 'user-456', username: 'commenter' }) },
|
||||
content: 'This is a test comment',
|
||||
parentId: 'parent-comment-123',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟创建评论请求数据
|
||||
export function createMockCreateCommentRequest(overrides: Partial<CreateCommentRequest> = {}): CreateCommentRequest {
|
||||
return {
|
||||
postId: 'post-123',
|
||||
content: 'This is a new test comment',
|
||||
parentId: 'parent-comment-123',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟创建评论响应数据
|
||||
export function createMockCreateCommentResponse(overrides: Partial<CreateCommentResponse> = {}): CreateCommentResponse {
|
||||
return {
|
||||
comment: createMockPostComment(),
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟获取评论列表请求数据
|
||||
export function createMockGetCommentsRequest(overrides: Partial<GetCommentsRequest> = {}): GetCommentsRequest {
|
||||
return {
|
||||
page: 1,
|
||||
limit: 10,
|
||||
sortOrder: 'desc',
|
||||
postId: 'post-123',
|
||||
parentId: 'parent-comment-123',
|
||||
sortBy: 'createdAt',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟获取评论列表响应数据
|
||||
export function createMockGetCommentsResponse(overrides: Partial<GetCommentsResponse> = {}): GetCommentsResponse {
|
||||
return {
|
||||
data: [createMockPostComment(), createMockPostComment({ id: 'comment-456' })],
|
||||
total: 2,
|
||||
page: 1,
|
||||
limit: 10,
|
||||
hasMore: false,
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟点赞评论请求数据
|
||||
export function createMockLikeCommentRequest(overrides: Partial<LikeCommentRequest> = {}): LikeCommentRequest {
|
||||
return {
|
||||
commentId: 'comment-123',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟点赞评论响应数据
|
||||
export function createMockLikeCommentResponse(overrides: Partial<LikeCommentResponse> = {}): LikeCommentResponse {
|
||||
return {
|
||||
success: true,
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟AI模型数据
|
||||
export function createMockAIModel(overrides: Partial<AIModel> = {}): AIModel {
|
||||
return {
|
||||
id: 'model-123',
|
||||
name: 'Test AI Model',
|
||||
description: 'This is a test AI model description',
|
||||
avatar: 'https://example.com/model-avatar.jpg',
|
||||
tags: ['test', 'ai', 'model'],
|
||||
website: 'https://example.com/model-website',
|
||||
clickCount: 1000,
|
||||
likeCount: 50,
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟AI模型评论数据
|
||||
export function createMockModelComment(overrides: Partial<ModelComment> = {}): ModelComment {
|
||||
const now = new Date();
|
||||
return {
|
||||
id: 'model-comment-123',
|
||||
createdAt: now,
|
||||
updatedAt: now,
|
||||
modelId: 'model-123',
|
||||
authorId: 'user-456',
|
||||
author: { user: createMockUser({ id: 'user-456', username: 'reviewer' }) },
|
||||
content: 'This is a test model review',
|
||||
parentId: 'parent-comment-123',
|
||||
stats: {
|
||||
stars: 5,
|
||||
likes: 10,
|
||||
comments: 2,
|
||||
replies: 1
|
||||
},
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟获取AI模型广场请求数据
|
||||
export function createMockGetAIPlazaRequest(overrides: Partial<GetAIPlazaRequest> = {}): GetAIPlazaRequest {
|
||||
return {
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟获取AI模型广场响应数据
|
||||
export function createMockGetAIPlazaResponse(overrides: Partial<GetAIPlazaResponse> = {}): GetAIPlazaResponse {
|
||||
return {
|
||||
models: [createMockAIModel(), createMockAIModel({ id: 'model-456' })],
|
||||
hotRankings: [
|
||||
{ model: createMockAIModel(), rank: 1, change: 'up' },
|
||||
{ model: createMockAIModel({ id: 'model-456' }), rank: 2, change: 'same' }
|
||||
],
|
||||
clickRankings: [
|
||||
{ model: createMockAIModel(), rank: 1, change: 'down' },
|
||||
{ model: createMockAIModel({ id: 'model-456' }), rank: 2, change: 'up' }
|
||||
],
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟获取模型详情请求数据
|
||||
export function createMockGetModelDetailRequest(overrides: Partial<GetModelDetailRequest> = {}): GetModelDetailRequest {
|
||||
return {
|
||||
modelId: 'model-123',
|
||||
page: 1,
|
||||
limit: 10,
|
||||
sortBy: 'createdAt',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟获取模型详情响应数据
|
||||
export function createMockGetModelDetailResponse(overrides: Partial<GetModelDetailResponse> = {}): GetModelDetailResponse {
|
||||
return {
|
||||
model: createMockAIModel(),
|
||||
comments: [createMockModelComment(), createMockModelComment({ id: 'model-comment-456' })],
|
||||
totalComments: 2,
|
||||
hasMoreComments: false,
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟获取模型评论请求数据
|
||||
export function createMockGetModelCommentsRequest(overrides: Partial<GetModelCommentsRequest> = {}): GetModelCommentsRequest {
|
||||
return {
|
||||
modelId: 'model-123',
|
||||
page: 1,
|
||||
limit: 10,
|
||||
sortBy: 'createdAt',
|
||||
parentId: 'parent-comment-123',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟获取模型评论响应数据
|
||||
export function createMockGetModelCommentsResponse(overrides: Partial<GetModelCommentsResponse> = {}): GetModelCommentsResponse {
|
||||
return {
|
||||
comments: [createMockModelComment(), createMockModelComment({ id: 'model-comment-456' })],
|
||||
total: 2,
|
||||
page: 1,
|
||||
limit: 10,
|
||||
hasMore: false,
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟创建模型评论请求数据
|
||||
export function createMockCreateModelCommentRequest(overrides: Partial<CreateModelCommentRequest> = {}): CreateModelCommentRequest {
|
||||
return {
|
||||
modelId: 'model-123',
|
||||
content: 'This is a new test model review',
|
||||
parentId: 'parent-comment-123',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟创建模型评论响应数据
|
||||
export function createMockCreateModelCommentResponse(overrides: Partial<CreateModelCommentResponse> = {}): CreateModelCommentResponse {
|
||||
return {
|
||||
comment: createMockModelComment(),
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟点赞模型评论请求数据
|
||||
export function createMockLikeModelCommentRequest(overrides: Partial<LikeModelCommentRequest> = {}): LikeModelCommentRequest {
|
||||
return {
|
||||
commentId: 'model-comment-123',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟点赞模型评论响应数据
|
||||
export function createMockLikeModelCommentResponse(overrides: Partial<LikeModelCommentResponse> = {}): LikeModelCommentResponse {
|
||||
return {
|
||||
success: true,
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟聊天会话数据
|
||||
export function createMockChatSession(overrides: Partial<ChatSession> = {}): ChatSession {
|
||||
const now = new Date();
|
||||
const user1 = createMockUser({ id: 'user-1', username: 'user1' });
|
||||
const user2 = createMockUser({ id: 'user-2', username: 'user2' });
|
||||
|
||||
return {
|
||||
id: 'session-123',
|
||||
participant1Id: 'user-1',
|
||||
participant2Id: 'user-2',
|
||||
participant1: user1,
|
||||
participant2: user2,
|
||||
lastMessage: {
|
||||
id: 'message-123',
|
||||
content: 'This is the last message',
|
||||
senderId: 'user-1',
|
||||
createdAt: now
|
||||
},
|
||||
unreadCount1: 0,
|
||||
unreadCount2: 1,
|
||||
createdAt: now,
|
||||
updatedAt: now,
|
||||
metadata: {
|
||||
backgroundColor: '#f0f0f0',
|
||||
customProperty: 'test-value'
|
||||
},
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟聊天消息数据
|
||||
export function createMockChatMessage(overrides: Partial<ChatMessage> = {}): ChatMessage {
|
||||
const now = new Date();
|
||||
const sender = createMockUser({ id: 'user-1', username: 'sender' });
|
||||
const receiver = createMockUser({ id: 'user-2', username: 'receiver' });
|
||||
|
||||
return {
|
||||
id: 'message-123',
|
||||
sessionId: 'session-123',
|
||||
sender,
|
||||
receiver,
|
||||
content: 'This is a test message',
|
||||
type: 'text',
|
||||
status: 'sent',
|
||||
createdAt: now,
|
||||
metadata: {
|
||||
fileName: 'test-file.txt',
|
||||
fileSize: 1024,
|
||||
duration: 30,
|
||||
thumbnail: 'https://example.com/thumbnail.jpg'
|
||||
},
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟创建聊天会话请求数据
|
||||
export function createMockCreateChatSessionRequest(overrides: Partial<CreateChatSessionRequest> = {}): CreateChatSessionRequest {
|
||||
return {
|
||||
participantId: 'user-456',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟更新聊天会话请求数据
|
||||
export function createMockUpdateChatSessionRequest(overrides: Partial<UpdateChatSessionRequest> = {}): UpdateChatSessionRequest {
|
||||
return {
|
||||
sessionId: 'session-123',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟发送消息请求数据
|
||||
export function createMockSendMessageRequest(overrides: Partial<SendMessageRequest> = {}): SendMessageRequest {
|
||||
return {
|
||||
sessionId: 'session-123',
|
||||
content: 'This is a new test message',
|
||||
type: 'text',
|
||||
metadata: {
|
||||
fileName: 'new-file.txt',
|
||||
fileSize: 2048
|
||||
},
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟获取聊天会话列表请求数据
|
||||
export function createMockGetChatSessionsRequest(overrides: Partial<GetChatSessionsRequest> = {}): GetChatSessionsRequest {
|
||||
return {
|
||||
page: 1,
|
||||
limit: 10,
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟获取聊天会话列表响应数据
|
||||
export function createMockGetChatSessionsResponse(overrides: Partial<GetChatSessionsResponse> = {}): GetChatSessionsResponse {
|
||||
return {
|
||||
sessions: [createMockChatSession(), createMockChatSession({ id: 'session-456' })],
|
||||
total: 2,
|
||||
page: 1,
|
||||
limit: 10,
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟获取聊天消息请求数据
|
||||
export function createMockGetChatMessagesRequest(overrides: Partial<GetChatMessagesRequest> = {}): GetChatMessagesRequest {
|
||||
return {
|
||||
sessionId: 'session-123',
|
||||
page: 1,
|
||||
limit: 10,
|
||||
before: 'message-456',
|
||||
after: 'message-123',
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟获取聊天消息响应数据
|
||||
export function createMockGetChatMessagesResponse(overrides: Partial<GetChatMessagesResponse> = {}): GetChatMessagesResponse {
|
||||
return {
|
||||
messages: [createMockChatMessage(), createMockChatMessage({ id: 'message-456' })],
|
||||
total: 2,
|
||||
page: 1,
|
||||
limit: 10,
|
||||
hasMore: false,
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟标记消息已读请求数据
|
||||
export function createMockMarkMessagesAsReadRequest(overrides: Partial<MarkMessagesAsReadRequest> = {}): MarkMessagesAsReadRequest {
|
||||
return {
|
||||
sessionId: 'session-123',
|
||||
messageIds: ['message-123', 'message-456'],
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟标记消息已读响应数据
|
||||
export function createMockMarkMessagesAsReadResponse(overrides: Partial<MarkMessagesAsReadResponse> = {}): MarkMessagesAsReadResponse {
|
||||
return {
|
||||
success: true,
|
||||
markedMessageIds: ['message-123', 'message-456'],
|
||||
failedMessageIds: ['message-789'],
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟API响应
|
||||
export function createMockApiResponse<T>(data: T, overrides: Partial<ApiResponse<T>> = {}): ApiResponse<T> {
|
||||
return {
|
||||
success: true,
|
||||
data,
|
||||
message: 'Success',
|
||||
code: 200,
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟API请求配置
|
||||
export function createMockApiRequestConfig(overrides: Partial<ApiRequestConfig> = {}): ApiRequestConfig {
|
||||
return {
|
||||
url: '/api/test',
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
timeout: 10000,
|
||||
...overrides
|
||||
};
|
||||
}
|
||||
|
||||
// 生成模拟错误响应
|
||||
export function createMockErrorResponse(message: string, code: number = 400) {
|
||||
return {
|
||||
success: false,
|
||||
data: null,
|
||||
message,
|
||||
code
|
||||
};
|
||||
}
|
||||
74
test/mocks/http-client.ts
Normal file
74
test/mocks/http-client.ts
Normal file
@@ -0,0 +1,74 @@
|
||||
/**
|
||||
* HTTP客户端Mock
|
||||
* 用于模拟axios行为
|
||||
*/
|
||||
|
||||
import vi from 'vitest';
|
||||
import type { AxiosResponse, AxiosError } from 'axios';
|
||||
import { createMockApiResponse, createMockErrorResponse } from './data-factory';
|
||||
|
||||
// 模拟axios响应
|
||||
export function createMockAxiosResponse<T>(data: T, status = 200): AxiosResponse<T> {
|
||||
return {
|
||||
data,
|
||||
status,
|
||||
statusText: 'OK',
|
||||
headers: {},
|
||||
config: {} as any
|
||||
};
|
||||
}
|
||||
|
||||
// 模拟axios错误
|
||||
export function createMockAxiosError(message: string, code = 'ERR_BAD_REQUEST', status = 400): AxiosError {
|
||||
const error = new Error(message) as AxiosError;
|
||||
error.code = code;
|
||||
error.response = {
|
||||
data: createMockErrorResponse(message, status),
|
||||
status,
|
||||
statusText: 'Bad Request',
|
||||
headers: {},
|
||||
config: {} as any
|
||||
};
|
||||
return error;
|
||||
}
|
||||
|
||||
// 创建模拟的axios实例
|
||||
export function createMockAxios() {
|
||||
return {
|
||||
get: vi.fn(),
|
||||
post: vi.fn(),
|
||||
put: vi.fn(),
|
||||
delete: vi.fn(),
|
||||
patch: vi.fn(),
|
||||
request: vi.fn(),
|
||||
interceptors: {
|
||||
request: {
|
||||
use: vi.fn(),
|
||||
eject: vi.fn()
|
||||
},
|
||||
response: {
|
||||
use: vi.fn(),
|
||||
eject: vi.fn()
|
||||
}
|
||||
},
|
||||
defaults: {
|
||||
headers: {
|
||||
common: {},
|
||||
get: {},
|
||||
post: {},
|
||||
put: {},
|
||||
delete: {}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// 模拟成功响应
|
||||
export function mockSuccessResponse<T>(data: T) {
|
||||
return Promise.resolve(createMockAxiosResponse(createMockApiResponse(data)));
|
||||
}
|
||||
|
||||
// 模拟失败响应
|
||||
export function mockErrorResponse(message: string, status = 400) {
|
||||
return Promise.reject(createMockAxiosError(message, 'ERR_BAD_REQUEST', status));
|
||||
}
|
||||
7
test/mocks/index.ts
Normal file
7
test/mocks/index.ts
Normal file
@@ -0,0 +1,7 @@
|
||||
/**
|
||||
* 测试模拟工具导出
|
||||
*/
|
||||
|
||||
export * from './data-factory';
|
||||
export * from './http-client';
|
||||
export * from './storage';
|
||||
23
test/mocks/storage.ts
Normal file
23
test/mocks/storage.ts
Normal file
@@ -0,0 +1,23 @@
|
||||
/**
|
||||
* 测试用的模拟存储适配器
|
||||
*/
|
||||
|
||||
import { vi } from 'vitest';
|
||||
import type { StorageAdapter } from '@/auth/storage-adapter';
|
||||
|
||||
/**
|
||||
* 创建模拟的存储适配器
|
||||
* @returns 模拟的存储适配器实例
|
||||
*/
|
||||
export const createMockStorage = (): StorageAdapter => {
|
||||
const storage: Record<string, string> = {};
|
||||
return {
|
||||
getItem: vi.fn((key: string) => storage[key] || null),
|
||||
setItem: vi.fn((key: string, value: string) => {
|
||||
storage[key] = value;
|
||||
}),
|
||||
removeItem: vi.fn((key: string) => {
|
||||
delete storage[key];
|
||||
})
|
||||
};
|
||||
};
|
||||
Reference in New Issue
Block a user