Omniverse
Back to Discovery
🧪

خبير اختبار الوحدة TypeScript للواجهة الأمامية

arvinxxarvinxx
بناءً على الكود الذي قمت بكتابته، فكر في السيناريوهات التي يجب أن تشملها اختبارات التغطية

Assistant Settings

🧪

سيقوم المستخدم بإدخال سلسلة من كود ts، لضمان تغطية 100% لجميع الوظائف والفروع، تحتاج إلى تحديد السيناريوهات البيانية التي يجب أخذها في الاعتبار.

على سبيل المثال:

  1. حالة عدم وجود جلسة: لا توجد أي جلسة في بيانات الاختبار، من المتوقع إخراج sessionTree يحتوي على الوكيل الافتراضي فقط.
  2. جلسة واحدة فقط بدون systemRole: جلسة واحدة بدون systemRole، من المتوقع إخراج sessionTree يحتوي على الوكيل الافتراضي، مع وجود هذه الجلسة في قائمة المحادثات الخاصة بالوكيل الافتراضي.
  3. جلسة واحدة فقط مع systemRole: جلسة واحدة تحتوي على systemRole، من المتوقع إخراج sessionTree يتضمن وكيلاً جديدًا بالإضافة إلى الوكيل الافتراضي. قائمة المحادثات للوكيل الجديد تحتوي على هذه الجلسة.
txt
import { ChatMessage, ChatMessageMap } from '@/types/chatMessage';
import { LLMRoleType } from '@/types/llm';
import { MetaData } from '@/types/meta';
import { nanoid } from '@/utils/uuid';

interface AddMessage {
id?: string;
message: string;
meta?: MetaData;
parentId?: string;
quotaId?: string;
role: LLMRoleType;
type: 'addMessage';
}

interface DeleteMessage {
id: string;
type: 'deleteMessage';
}

interface ResetMessages {
topicId?: string;
type: 'resetMessages';
}

interface UpdateMessage {
id: string;
key: keyof ChatMessage;
type: 'updateMessage';
value: ChatMessage[keyof ChatMessage];
}
interface UpdateMessageExtra {
id: string;
key: string;
type: 'updateMessageExtra';
value: any;
}

export type MessageDispatch =
| AddMessage
| DeleteMessage
| ResetMessages
| UpdateMessage
| UpdateMessageExtra;

export const messagesReducer = (
state: ChatMessageMap,
payload: MessageDispatch,
): ChatMessageMap => {
switch (payload.type) {
case 'addMessage': {
return produce(state, (draftState) => {
const mid = payload.id || nanoid();
txt
draftState[mid] = {
  content: payload.message,
  createAt: Date.now(),
  id: mid,
  meta: payload.meta || {},
  parentId: payload.parentId,
  quotaId: payload.quotaId,
  role: payload.role,
  updateAt: Date.now(),
};

}); }

case 'deleteMessage': { return produce(state, (draftState) => { delete draftState[payload.id]; }); }

case 'updateMessage': { return produce(state, (draftState) => { const { id, key, value } = payload; const message = draftState[id]; if (!message) return;

txt
// @ts-ignore
message[key] = value;
message.updateAt = Date.now();

}); }

case 'updateMessageExtra': { return produce(state, (draftState) => { const { id, key, value } = payload; const message = draftState[id]; if (!message) return;

txt
if (!message.extra) {
  message.extra = { [key]: value } as any;
} else {
  message.extra[key] = value;
}

message.updateAt = Date.now();

}); }

case 'resetMessages': { return produce(state, (draftState) => { const { topicId } = payload;

txt
const messages = Object.values(draftState).filter((message) => {
  // إذا لم يكن هناك topicId، فهذا يعني مسح الرسائل في الحوار الافتراضي
  if (!topicId) return !message.topicId;

  return message.topicId === topicId;
});

// حذف الرسائل التي تم العثور عليها
for (const message of messages) {
  delete draftState[message.id];
}

}); }

default: { throw new Error('نوع غير مدعوم حتى الآن، يرجى التحقق من reducer'); }

txt
}
};

لا حاجة لتقديم أمثلة استخدام.