استوديو الذكاء الاصطناعي
كل المشاريع

حجز قاعات الاجتماعات (تجربة)

اسأل عن هذا المشروع

نظام داخلي لحجز قاعات الاجتماعات في إدارة واحدة. الموظف يرى القاعات المتاحة وسعتها وتجهيزاتها، ويحجز قاعة لموعد محدد بتاريخ ووقت بداية ونهاية، ويلغي حجزه. لا يُسمح بحجزين متداخلين على القاعة نفسها. مدير المرافق يضيف القاعات ويعدّلها ويوقفها مؤقتاً للصيانة، ويرى تقريراً شهرياً بنسبة إشغال كل قاعة. يتلقى الموظف إشعاراً عند تأكيد حجزه أو إلغائه.

اطلب تعديلًا

تُفتح المحادثة حين تصبح هذه المرحلة جاهزة للتوليد.

متوقف مؤقتًا: أُعيد فتح الشيفرة البرمجية للتعديل. عمل الاختبار محفوظ أدناه ويستمر بعد اعتماد الشيفرة البرمجية مرة أخرى.

الانتقال إلى الشيفرة البرمجية
النسخة ⁨1⁩مسودةأُنشئ قبل 5 أيام

فحص البناء والاختبار

ما زالت تفشل بعد 3 جولات إصلاح.

خطأ واحد في آخر فحص

Failed App.Tests.RoomPageTests.Employee_role_cannot_access_Manage_page [39 ms]

يُفحص الكود المعتمد من جديد ويُصلح Qwen Code ما يفشل. تبقى خطة الاختبار كما هي، ويُحفظ التقرير الجديد في نسخة جديدة.

يثبّت الفحص المكتبات اللازمة، ويترجم كل ملف، ويشغّل الاختبارات، داخل حاوية معزولة.

فُحصت النسخة ⁨5⁩ من مرحلة الشفرة، وحُفظت إصلاحات Qwen Code فيها.

عدّل Qwen Code ⁨7⁩ ملفات، وأضاف ⁨0⁩، وحذف ⁨0⁩
  • ~ Helper/App.Helper/Dto/RoomFormDto.cs
  • ~ Tests/App.Tests/OccupancyReportPageTests.cs
  • ~ WebApps/App.Web/Controllers/OccupancyReportController.cs
  • ~ WebApps/App.Web/Controllers/RoomController.cs
  • ~ WebApps/App.Web/Views/OccupancyReport/Monthly.cshtml
  • ~ WebApps/App.Web/Views/Room/Index.cshtml
  • ~ WebApps/App.Web/Views/Room/Manage.cshtml

الإخفاقات في كل فحص: ⁨5⁩ → ⁨3⁩ → ⁨3⁩ → ⁨1⁩

  1. الفحص ⁨1⁩: 5 إخفاقات 2:11

    يفشل (⁨5⁩)

    • Failed App.Tests.RoomPageTests.AddEditRoom_POST_creates_room_successfully
    • Failed App.Tests.RoomPageTests.ToggleStatus_POST_changes_room_status
    • Failed App.Tests.RoomPageTests.Index_page_displays_available_rooms_for_Employee
    • Failed App.Tests.RoomPageTests.AddEditRoom_POST_returns_validation_errors_for_invalid_data
    • FAILED: GET /Room/Manage as FacilityManager -> 500: server error

    وصل الفحص إلى: dotnet: start the application and open every page

    المخرجات كاملة
    ### What failed (gathered from the output below)
    Failed App.Tests.RoomPageTests.AddEditRoom_POST_creates_room_successfully [93 ms]
    Failed App.Tests.RoomPageTests.ToggleStatus_POST_changes_room_status [70 ms]
    Failed App.Tests.RoomPageTests.Index_page_displays_available_rooms_for_Employee [40 ms]
    Failed App.Tests.RoomPageTests.AddEditRoom_POST_returns_validation_errors_for_invalid_data [205 ms]
    FAILED: GET /Room/Manage as FacilityManager -> 500: server error
    
    ...
    )
             at Microsoft.AspNetCore.Session.SessionMiddleware.Invoke(HttpContext context)
             at Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddlewareImpl.<Invoke>g__Awaited|10_0(ExceptionHandlerMiddlewareImpl middleware, HttpContext context, Task task)
    [xUnit.net 00:00:08.82]     App.Tests.RoomPageTests.AddEditRoom_POST_returns_validation_errors_for_invalid_data [FAIL]
    [xUnit.net 00:00:08.82]       Assert.Contains() Failure: Sub-string not found
    [xUnit.net 00:00:08.82]       String:    "\n<form id="roomForm" method="post" action"···
    [xUnit.net 00:00:08.82]       Not found: "السعة يجب أن تكون رقما موجبا"
    [xUnit.net 00:00:08.82]       Stack Trace:
    [xUnit.net 00:00:08.82]         /workspace/Tests/App.Tests/RoomPageTests.cs(129,0): at App.Tests.RoomPageTests.AddEditRoom_POST_returns_validation_errors_for_invalid_data()
    [xUnit.net 00:00:08.82]         --- End of stack trace from previous location ---
      Error Message:
       Assert.Contains() Failure: Sub-string not found
    String:    "{"success":true,"message":"\\u062A\\u0645\\u"···
    Not found: "تمت إضافة القاعة"
      Stack Trace:
         at App.Tests.RoomPageTests.AddEditRoom_POST_creates_room_successfully() in /workspace/Tests/App.Tests/RoomPageTests.cs:line 105
    --- End of stack trace from previous location ---
      Error Message:
       Assert.Contains() Failure: Sub-string not found
    String:    "{"success":true,"message":"\\u062A\\u0645 \\"···
    Not found: "تم تغيير حالة القاعة"
      Stack Trace:
         at App.Tests.RoomPageTests.ToggleStatus_POST_changes_room_status() in /workspace/Tests/App.Tests/RoomPageTests.cs:line 148
    --- End of stack trace from previous location ---
      Error Message:
       Assert.Equal() Failure: Values differ
    Expected: OK
    Actual:   InternalServerError
      Stack Trace:
         at App.Tests.RoomPageTests.Index_page_displays_available_rooms_for_Employee() in /workspace/Tests/App.Tests/RoomPageTests.cs:line 46
    --- End of stack trace from previous location ---
      Error Message:
       Assert.Contains() Failure: Sub-string not found
    String:    "\n<form id="roomForm" method="post" action"···
    Not found: "السعة يجب أن تكون رقما موجبا"
      Stack Trace:
         at App.Tests.RoomPageTests.AddEditRoom_POST_returns_validation_errors_for_invalid_data() in /workspace/Tests/App.Tests/RoomPageTests.cs:line 129
    --- End of stack trace from previous location ---
    [xUnit.net 00:00:09.20]   Finished:    App.Tests
    Test Run Failed.
    Total tests: 44
         Passed: 35
         Failed: 9
     Total time: 9.5233 Seconds
    
    ### dotnet: start the application and open every page
    starting WebApps/App.Web/App.Web.csproj on SQLite, then GET 8 routes, 10 requests with the roles they name
    answering after 4s
    GET / -> 302 to /Account/Login
    GET /Room/Index -> 302 to /Account/Login
    GET /Room/Book/1 -> 302 to /Account/Login
    GET /Room/Manage -> 302 to /Account/Login
    GET /Booking/Create/1 -> 302 to /Account/Login
    GET /Booking/Confirm/1 -> 302 to /Account/Login
    GET /Booking/MyBookings -> 302 to /Account/Login
    GET /OccupancyReport/Monthly -> 302 to /Account/Login
    GET /OccupancyReport/Monthly as FacilityManager -> 200
    
    The application's log:
    fail: App.Infrastructure.Security.GlobalExceptionHandlerMiddleware[0]
          [EXCEPTION] ErrorCode: INVALIDOPERATION-20261028145914, Severity: MEDIUM, UserId: 5b4da6cf-3d1c-482a-9801-95ae51403696, IP: 127.0.0.1, Path: /Room/Manage, Method: GET, Message: The model item passed into the ViewDataDictionary is of type 'System.Collections.Generic.List`1[App.Helper.Dto.RoomDto]', but this ViewDataDictionary instance requires a model item of type 'App.Helper.Paging.PaginatedResult`1[App.Helper.Dto.RoomDto]'.
          System.InvalidOperationException: The model item passed into the ViewDataDictionary is of type 'System.Collections.Generic.List`1[App.Helper.Dto.RoomDto]', but this ViewDataDictionary instance requires a model item of type 'App.Helper.Paging.PaginatedResult`1[App.Helper.Dto.RoomDto]'.
             at App.Web.Middleware.ProfileImageMiddleware.InvokeAsync(HttpContext context, UserManager`1 userManager) in /workspace/WebApps/App.Web/Middleware/ProfileImageMiddleware.cs:line 52
             at App.Infrastructure.Security.SecurityHeadersMiddleware.InvokeAsync(HttpContext context) in /workspace/Infrastructure/App.Infrastructure/Security/SecurityHeadersMiddleware.cs:line 94
             at App.Infrastructure.Middleware.AuditMiddleware.InvokeAsync(HttpContext context) in /workspace/Infrastructure/App.Infrastructure/Middleware/AuditMiddleware.cs:line 28
             at App.Infrastructure.Security.GlobalExceptionHandlerMiddleware.InvokeAsync(HttpContext context) in /workspace/Infrastructure/App.Infrastructure/Security/GlobalExceptionHandlerMiddleware.cs:line 33
    fail: Microsoft.AspNetCore.Diagnostics.ExceptionHandlerMiddleware[1]
          An unhandled exception has occurred while executing the request.
          System.InvalidOperationException: The model item passed into the ViewDataDictionary is of type 'System.Collections.Generic.List`1[App.Helper.Dto.RoomDto]', but this ViewDataDictionary instance requires a model item of type 'App.Helper.Paging.PaginatedResult`1[App.Helper.Dto.RoomDto]'.
             at App.Infrastructure.Security.GlobalExceptionHandlerMiddleware.HandleExceptionAsync(HttpContext context, Exception exception) in /workspace/Infrastructure/App.Infrastructure/Security/GlobalExceptionHandlerMiddleware.cs:line 107
             at App.Infrastructure.Security.GlobalExceptionHandlerMiddleware.InvokeAsync(HttpContext context) in /workspace/Infrastructure/App.Infrastructure/Security/GlobalExceptionHandlerMiddleware.cs:line 37
    
    ### result
    FAILED
    الإصلاح ⁨1⁩: انتهى وقته 30:01

    انتهى وقت Qwen Code قبل أن يقدّم ملخصًا.

    عُدّلت 4 ملفات في هذه الجولة:

    • Helper/App.Helper/Dto/RoomFormDto.cs
    • WebApps/App.Web/Controllers/RoomController.cs
    • WebApps/App.Web/Views/Room/Index.cshtml
    • WebApps/App.Web/Views/Room/Manage.cshtml
  2. الفحص ⁨2⁩: 3 إخفاقات 0:18

    مقارنة بالفحص السابق: أُصلح ⁨5⁩، وما زال ⁨0⁩ يفشل، و⁨3⁩ جديد.

    جديد (⁨3⁩)

    • Failed App.Tests.RoomPageTests.Employee_role_cannot_access_Manage_page
    • Failed App.Tests.OccupancyReportPageTests.The_monthly_report_sends_an_employee_to_sign_in
    • Failed App.Tests.OccupancyReportPageTests.The_monthly_report_lists_the_rooms_with_their_occupancy

    أُصلح (⁨5⁩)

    • Failed App.Tests.RoomPageTests.AddEditRoom_POST_creates_room_successfully
    • Failed App.Tests.RoomPageTests.ToggleStatus_POST_changes_room_status
    • Failed App.Tests.RoomPageTests.Index_page_displays_available_rooms_for_Employee
    • Failed App.Tests.RoomPageTests.AddEditRoom_POST_returns_validation_errors_for_invalid_data
    • FAILED: GET /Room/Manage as FacilityManager -> 500: server error

    وصل الفحص إلى: dotnet: start the application and open every page

    المخرجات كاملة
    ### What failed (gathered from the output below)
    Failed App.Tests.RoomPageTests.Employee_role_cannot_access_Manage_page [30 ms]
    Failed App.Tests.OccupancyReportPageTests.The_monthly_report_sends_an_employee_to_sign_in [30 ms]
    Failed App.Tests.OccupancyReportPageTests.The_monthly_report_lists_the_rooms_with_their_occupancy [1 ms]
    
    ...
    Test data seeding completed successfully!
    Added 5 notifications.
    Test data seeding completed successfully!
    Added 6 notifications.
    Test data seeding completed successfully!
    warn: Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware[3]
          Failed to determine the https port for redirect.
    warn: Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware[3]
          Failed to determine the https port for redirect.
    warn: Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware[3]
          Failed to determine the https port for redirect.
    [xUnit.net 00:00:07.31]     App.Tests.RoomPageTests.Employee_role_cannot_access_Manage_page [FAIL]
    [xUnit.net 00:00:07.31]       Assert.Equal() Failure: Values differ
    [xUnit.net 00:00:07.31]       Expected: Forbidden
    [xUnit.net 00:00:07.31]       Actual:   Found
    [xUnit.net 00:00:07.31]       Stack Trace:
    [xUnit.net 00:00:07.31]         /workspace/Tests/App.Tests/RoomPageTests.cs(159,0): at App.Tests.RoomPageTests.Employee_role_cannot_access_Manage_page()
    [xUnit.net 00:00:07.31]         --- End of stack trace from previous location ---
    [xUnit.net 00:00:07.31]     App.Tests.OccupancyReportPageTests.The_monthly_report_sends_an_employee_to_sign_in [FAIL]
    [xUnit.net 00:00:07.31]       Assert.Contains() Failure: Sub-string not found
    [xUnit.net 00:00:07.31]       String:    "/Error"
    [xUnit.net 00:00:07.31]       Not found: "/Account/Login"
    [xUnit.net 00:00:07.31]       Stack Trace:
    [xUnit.net 00:00:07.31]         /workspace/Tests/App.Tests/OccupancyReportPageTests.cs(32,0): at App.Tests.OccupancyReportPageTests.The_monthly_report_sends_an_employee_to_sign_in()
    [xUnit.net 00:00:07.31]         --- End of stack trace from previous location ---
    [xUnit.net 00:00:07.33]     App.Tests.OccupancyReportPageTests.The_monthly_report_lists_the_rooms_with_their_occupancy [FAIL]
    [xUnit.net 00:00:07.33]       System.InvalidOperationException : Cannot resolve scoped service 'App.Infrastructure.AppDatabase.AppDbContext' from root provider.
    [xUnit.net 00:00:07.33]       Stack Trace:
    [xUnit.net 00:00:07.33]            at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(ServiceCallSite callSite, IServiceScope scope, IServiceScope rootScope)
    [xUnit.net 00:00:07.33]            at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(ServiceIdentifier serviceIdentifier, ServiceProviderEngineScope serviceProviderEngineScope)
    [xUnit.net 00:00:07.33]            at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType)
    [xUnit.net 00:00:07.33]            at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
    [xUnit.net 00:00:07.33]            at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
    [xUnit.net 00:00:07.33]         /workspace/Tests/App.Tests/OccupancyReportPageTests.cs(57,0): at App.Tests.OccupancyReportPageTests.The_monthly_report_lists_the_rooms_with_their_occupancy()
    [xUnit.net 00:00:07.33]         --- End of stack trace from previous location ---
      Error Message:
       Assert.Equal() Failure: Values differ
    Expected: Forbidden
    Actual:   Found
      Stack Trace:
         at App.Tests.RoomPageTests.Employee_role_cannot_access_Manage_page() in /workspace/Tests/App.Tests/RoomPageTests.cs:line 159
    --- End of stack trace from previous location ---
      Error Message:
       Assert.Contains() Failure: Sub-string not found
    String:    "/Error"
    Not found: "/Account/Login"
      Stack Trace:
         at App.Tests.OccupancyReportPageTests.The_monthly_report_sends_an_employee_to_sign_in() in /workspace/Tests/App.Tests/OccupancyReportPageTests.cs:line 32
    --- End of stack trace from previous location ---
      Error Message:
       System.InvalidOperationException : Cannot resolve scoped service 'App.Infrastructure.AppDatabase.AppDbContext' from root provider.
      Stack Trace:
         at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(ServiceCallSite callSite, IServiceScope scope, IServiceScope rootScope)
       at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(ServiceIdentifier serviceIdentifier, ServiceProviderEngineScope serviceProviderEngineScope)
       at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType)
       at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType)
       at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider)
       at App.Tests.OccupancyReportPageTests.The_monthly_report_lists_the_rooms_with_their_occupancy() in /workspace/Tests/App.Tests/OccupancyReportPageTests.cs:line 57
    --- End of stack trace from previous location ---
    [xUnit.net 00:00:08.55]   Finished:    App.Tests
    Test Run Failed.
    Total tests: 44
         Passed: 41
         Failed: 3
     Total time: 8.8955 Seconds
    
    ### dotnet: start the application and open every page
    starting WebApps/App.Web/App.Web.csproj on SQLite, then GET 8 routes, 10 requests with the roles they name
    answering after 2s
    GET / -> 302 to /Account/Login
    GET /Room/Index -> 302 to /Account/Login
    GET /Room/Book/1 -> 302 to /Account/Login
    GET /Room/Manage -> 302 to /Account/Login
    GET /Room/Manage as FacilityManager -> 200
    GET /Booking/Create/1 -> 302 to /Account/Login
    GET /Booking/Confirm/1 -> 302 to /Account/Login
    GET /Booking/MyBookings -> 302 to /Account/Login
    GET /OccupancyReport/Monthly -> 302 to /Account/Login
    GET /OccupancyReport/Monthly as FacilityManager -> 200
    
    ### result
    FAILED
    الإصلاح ⁨2⁩: انتهى وقته 30:01

    انتهى وقت Qwen Code قبل أن يقدّم ملخصًا.

    عُدّلت 3 ملفات في هذه الجولة:

    • Tests/App.Tests/OccupancyReportPageTests.cs
    • WebApps/App.Web/Controllers/OccupancyReportController.cs
    • WebApps/App.Web/Controllers/RoomController.cs
  3. الفحص ⁨3⁩: 3 إخفاقات 1:19

    مقارنة بالفحص السابق: أُصلح ⁨0⁩، وما زال ⁨3⁩ يفشل، و⁨0⁩ جديد.

    ما زال يفشل (⁨3⁩)

    • Failed App.Tests.OccupancyReportPageTests.The_monthly_report_sends_an_employee_to_sign_in
    • Failed App.Tests.RoomPageTests.Employee_role_cannot_access_Manage_page
    • Failed App.Tests.OccupancyReportPageTests.The_monthly_report_lists_the_rooms_with_their_occupancy

    وصل الفحص إلى: dotnet: start the application and open every page

    المخرجات كاملة
    ### What failed (gathered from the output below)
    Failed App.Tests.OccupancyReportPageTests.The_monthly_report_sends_an_employee_to_sign_in [30 ms]
    Failed App.Tests.RoomPageTests.Employee_role_cannot_access_Manage_page [30 ms]
    Failed App.Tests.OccupancyReportPageTests.The_monthly_report_lists_the_rooms_with_their_occupancy [61 ms]
    
    ...
    er 'Distinct' as the ordering would otherwise get erased.
    Added 18 comments.
    Added 24 comments.
    Adding Support Tickets...
    Adding Support Tickets...
    warn: Microsoft.EntityFrameworkCore.Query[10102]
          The query uses a row limiting operator ('Skip'/'Take') without an 'OrderBy' operator. This may lead to unpredictable results. If the 'Distinct' operator is used after 'OrderBy', then make sure to use the 'OrderBy' operator after 'Distinct' as the ordering would otherwise get erased.
    Added 200 empty jobs. Total now: 200
    Adding Update Requests...
    Added 15 update requests.
    Adding Update Request Comments...
    Added 1 support tickets.
    Added 1 support tickets.
    Adding Support Messages...
    Adding Support Messages...
    warn: Microsoft.EntityFrameworkCore.Query[10102]
          The query uses a row limiting operator ('Skip'/'Take') without an 'OrderBy' operator. This may lead to unpredictable results. If the 'Distinct' operator is used after 'OrderBy', then make sure to use the 'OrderBy' operator after 'Distinct' as the ordering would otherwise get erased.
    Added 22 comments.
    Adding Support Tickets...
    Added 3 support messages.
    Added 4 support messages.
    Adding Notifications...
    Adding Notifications...
    Added 1 support tickets.
    Adding Support Messages...
    Added 3 support messages.
    Adding Notifications...
    Added 6 notifications.
    Test data seeding completed successfully!
    Added 6 notifications.
    Test data seeding completed successfully!
    Added 7 notifications.
    Test data seeding completed successfully!
    warn: Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware[3]
          Failed to determine the https port for redirect.
    warn: Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware[3]
          Failed to determine the https port for redirect.
    warn: Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware[3]
          Failed to determine the https port for redirect.
    [xUnit.net 00:00:07.85]     App.Tests.OccupancyReportPageTests.The_monthly_report_sends_an_employee_to_sign_in [FAIL]
    [xUnit.net 00:00:07.85]       Assert.Contains() Failure: Sub-string not found
    [xUnit.net 00:00:07.85]       String:    "http://localhost/Account/AccessDenied?Ret"···
    [xUnit.net 00:00:07.85]       Not found: "/Account/Login"
    [xUnit.net 00:00:07.85]       Stack Trace:
    [xUnit.net 00:00:07.85]         /workspace/Tests/App.Tests/OccupancyReportPageTests.cs(32,0): at App.Tests.OccupancyReportPageTests.The_monthly_report_sends_an_employee_to_sign_in()
    [xUnit.net 00:00:07.85]         --- End of stack trace from previous location ---
    [xUnit.net 00:00:07.85]     App.Tests.RoomPageTests.Employee_role_cannot_access_Manage_page [FAIL]
    [xUnit.net 00:00:07.85]       Assert.Equal() Failure: Values differ
    [xUnit.net 00:00:07.85]       Expected: Forbidden
    [xUnit.net 00:00:07.85]       Actual:   Found
    [xUnit.net 00:00:07.85]       Stack Trace:
    [xUnit.net 00:00:07.85]         /workspace/Tests/App.Tests/RoomPageTests.cs(159,0): at App.Tests.RoomPageTests.Employee_role_cannot_access_Manage_page()
    [xUnit.net 00:00:07.85]         --- End of stack trace from previous location ---
    [xUnit.net 00:00:07.93]     App.Tests.OccupancyReportPageTests.The_monthly_report_lists_the_rooms_with_their_occupancy [FAIL]
    [xUnit.net 00:00:07.93]       Assert.Contains() Failure: Sub-string not found
    [xUnit.net 00:00:07.93]       String:    "\n\n<!DOCTYPE html>\n\n<html lang="ar" dir="r"···
    [xUnit.net 00:00:07.93]       Not found: "3.0"
    [xUnit.net 00:00:07.93]       Stack Trace:
    [xUnit.net 00:00:07.93]         /workspace/Tests/App.Tests/OccupancyReportPageTests.cs(88,0): at App.Tests.OccupancyReportPageTests.The_monthly_report_lists_the_rooms_with_their_occupancy()
    [xUnit.net 00:00:07.93]         --- End of stack trace from previous location ---
      Error Message:
       Assert.Contains() Failure: Sub-string not found
    String:    "http://localhost/Account/AccessDenied?Ret"···
    Not found: "/Account/Login"
      Stack Trace:
         at App.Tests.OccupancyReportPageTests.The_monthly_report_sends_an_employee_to_sign_in() in /workspace/Tests/App.Tests/OccupancyReportPageTests.cs:line 32
    --- End of stack trace from previous location ---
      Error Message:
       Assert.Equal() Failure: Values differ
    Expected: Forbidden
    Actual:   Found
      Stack Trace:
         at App.Tests.RoomPageTests.Employee_role_cannot_access_Manage_page() in /workspace/Tests/App.Tests/RoomPageTests.cs:line 159
    --- End of stack trace from previous location ---
      Error Message:
       Assert.Contains() Failure: Sub-string not found
    String:    "\n\n<!DOCTYPE html>\n\n<html lang="ar" dir="r"···
    Not found: "3.0"
      Stack Trace:
         at App.Tests.OccupancyReportPageTests.The_monthly_report_lists_the_rooms_with_their_occupancy() in /workspace/Tests/App.Tests/OccupancyReportPageTests.cs:line 88
    --- End of stack trace from previous location ---
    [xUnit.net 00:00:09.07]   Finished:    App.Tests
    Test Run Failed.
    Total tests: 44
         Passed: 41
         Failed: 3
     Total time: 9.3956 Seconds
    
    ### dotnet: start the application and open every page
    starting WebApps/App.Web/App.Web.csproj on SQLite, then GET 8 routes, 10 requests with the roles they name
    answering after 2s
    GET / -> 302 to /Account/Login
    GET /Room/Index -> 302 to /Account/Login
    GET /Room/Book/1 -> 302 to /Account/Login
    GET /Room/Manage -> 302 to http://127.0.0.1:37933/Account/Login?ReturnUrl=%2FRoom%2FManage
    GET /Room/Manage as FacilityManager -> 200
    GET /Booking/Create/1 -> 302 to /Account/Login
    GET /Booking/Confirm/1 -> 302 to /Account/Login
    GET /Booking/MyBookings -> 302 to /Account/Login
    GET /OccupancyReport/Monthly -> 302 to http://127.0.0.1:37933/Account/Login?ReturnUrl=%2FOccupancyReport%2FMonthly
    GET /OccupancyReport/Monthly as FacilityManager -> 200
    
    ### result
    FAILED
    الإصلاح ⁨3⁩: انتهى وقته 30:01

    انتهى وقت Qwen Code قبل أن يقدّم ملخصًا.

    عُدّل ملفان في هذه الجولة:

    • WebApps/App.Web/Controllers/OccupancyReportController.cs
    • WebApps/App.Web/Views/OccupancyReport/Monthly.cshtml
  4. الفحص ⁨4⁩: إخفاق واحد 1:13

    مقارنة بالفحص السابق: أُصلح ⁨2⁩، وما زال ⁨1⁩ يفشل، و⁨0⁩ جديد.

    ما زال يفشل (⁨1⁩)

    • Failed App.Tests.RoomPageTests.Employee_role_cannot_access_Manage_page

    أُصلح (⁨2⁩)

    • Failed App.Tests.OccupancyReportPageTests.The_monthly_report_sends_an_employee_to_sign_in
    • Failed App.Tests.OccupancyReportPageTests.The_monthly_report_lists_the_rooms_with_their_occupancy

    وصل الفحص إلى: dotnet: start the application and open every page

    المخرجات كاملة
    ### What failed (gathered from the output below)
    Failed App.Tests.RoomPageTests.Employee_role_cannot_access_Manage_page [39 ms]
    
    ...
    nt: 0)
    Adding Officers... (Current count: 0)
    Adding Officers... (Current count: 0)
    Added batch 1, total: 100/1000
    Added batch 1, total: 100/1000
    Added batch 1, total: 100/1000
    Added batch 2, total: 200/1000
    Added batch 2, total: 200/1000
    Added batch 2, total: 200/1000
    Added batch 3, total: 300/1000
    Added batch 3, total: 300/1000
    Added batch 3, total: 300/1000
    Added batch 4, total: 400/1000
    Added batch 4, total: 400/1000
    Added batch 4, total: 400/1000
    Added batch 5, total: 500/1000
    Added batch 5, total: 500/1000
    Added batch 5, total: 500/1000
    Added batch 6, total: 600/1000
    Added batch 6, total: 600/1000
    Added batch 6, total: 600/1000
    Added batch 7, total: 700/1000
    Added batch 7, total: 700/1000
    Added batch 7, total: 700/1000
    Added batch 8, total: 800/1000
    Added batch 8, total: 800/1000
    Added batch 8, total: 800/1000
    Added batch 9, total: 900/1000
    Added batch 9, total: 900/1000
    Added batch 9, total: 900/1000
    Added batch 10, total: 1000/1000
    Added 1000 officers. Total now: 1000
    Adding Courses... (Current count: 0)
    warn: Microsoft.EntityFrameworkCore.Query[10102]
          The query uses a row limiting operator ('Skip'/'Take') without an 'OrderBy' operator. This may lead to unpredictable results. If the 'Distinct' operator is used after 'OrderBy', then make sure to use the 'OrderBy' operator after 'Distinct' as the ordering would otherwise get erased.
    Added batch 10, total: 1000/1000
    Added 1000 officers. Total now: 1000
    Adding Courses... (Current count: 0)
    Added batch 10, total: 1000/1000
    Added 1000 officers. Total now: 1000
    Adding Courses... (Current count: 0)
    Added 811 courses. Total now: 811
    Added 788 courses. Total now: 788
    Adding Empty Jobs... (Current count: 0)
    Adding Empty Jobs... (Current count: 0)
    Added 750 courses. Total now: 750
    Adding Empty Jobs... (Current count: 0)
    Added 200 empty jobs. Total now: 200
    Adding Update Requests...
    Added 200 empty jobs. Total now: 200
    Adding Update Requests...
    Added 200 empty jobs. Total now: 200
    Adding Update Requests...
    Added 15 update requests.
    Added 15 update requests.
    Added 15 update requests.
    Adding Update Request Comments...
    Adding Update Request Comments...
    Adding Update Request Comments...
    warn: Microsoft.EntityFrameworkCore.Query[10102]
          The query uses a row limiting operator ('Skip'/'Take') without an 'OrderBy' operator. This may lead to unpredictable results. If the 'Distinct' operator is used after 'OrderBy', then make sure to use the 'OrderBy' operator after 'Distinct' as the ordering would otherwise get erased.
    Added 20 comments.
    Adding Support Tickets...
    warn: Microsoft.EntityFrameworkCore.Query[10102]
          The query uses a row limiting operator ('Skip'/'Take') without an 'OrderBy' operator. This may lead to unpredictable results. If the 'Distinct' operator is used after 'OrderBy', then make sure to use the 'OrderBy' operator after 'Distinct' as the ordering would otherwise get erased.
    Added 24 comments.
    Adding Support Tickets...
    Added 23 comments.
    Adding Support Tickets...
    Added 1 support tickets.
    Adding Support Messages...
    warn: Microsoft.EntityFrameworkCore.Query[10102]
          The query uses a row limiting operator ('Skip'/'Take') without an 'OrderBy' operator. This may lead to unpredictable results. If the 'Distinct' operator is used after 'OrderBy', then make sure to use the 'OrderBy' operator after 'Distinct' as the ordering would otherwise get erased.
    Added 1 support tickets.
    Adding Support Messages...
    Added 1 support tickets.
    Adding Support Messages...
    Added 2 support messages.
    Added 4 support messages.
    Adding Notifications...
    Adding Notifications...
    Added 3 support messages.
    Adding Notifications...
    Added 4 notifications.
    Test data seeding completed successfully!
    Added 6 notifications.
    Test data seeding completed successfully!
    Added 5 notifications.
    Test data seeding completed successfully!
    warn: Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware[3]
          Failed to determine the https port for redirect.
    warn: Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware[3]
          Failed to determine the https port for redirect.
    warn: Microsoft.AspNetCore.HttpsPolicy.HttpsRedirectionMiddleware[3]
          Failed to determine the https port for redirect.
    [xUnit.net 00:00:07.55]     App.Tests.RoomPageTests.Employee_role_cannot_access_Manage_page [FAIL]
    [xUnit.net 00:00:07.55]       Assert.Equal() Failure: Values differ
    [xUnit.net 00:00:07.55]       Expected: Forbidden
    [xUnit.net 00:00:07.55]       Actual:   Found
    [xUnit.net 00:00:07.55]       Stack Trace:
    [xUnit.net 00:00:07.55]         /workspace/Tests/App.Tests/RoomPageTests.cs(159,0): at App.Tests.RoomPageTests.Employee_role_cannot_access_Manage_page()
    [xUnit.net 00:00:07.55]         --- End of stack trace from previous location ---
      Error Message:
       Assert.Equal() Failure: Values differ
    Expected: Forbidden
    Actual:   Found
      Stack Trace:
         at App.Tests.RoomPageTests.Employee_role_cannot_access_Manage_page() in /workspace/Tests/App.Tests/RoomPageTests.cs:line 159
    --- End of stack trace from previous location ---
    [xUnit.net 00:00:08.78]   Finished:    App.Tests
    Test Run Failed.
    Total tests: 44
         Passed: 43
         Failed: 1
     Total time: 9.1208 Seconds
    
    ### dotnet: start the application and open every page
    starting WebApps/App.Web/App.Web.csproj on SQLite, then GET 8 routes, 10 requests with the roles they name
    answering after 2s
    GET / -> 302 to /Account/Login
    GET /Room/Index -> 302 to /Account/Login
    GET /Room/Book/1 -> 302 to /Account/Login
    GET /Room/Manage -> 302 to http://127.0.0.1:58669/Account/Login?ReturnUrl=%2FRoom%2FManage
    GET /Room/Manage as FacilityManager -> 200
    GET /Booking/Create/1 -> 302 to /Account/Login
    GET /Booking/Confirm/1 -> 302 to /Account/Login
    GET /Booking/MyBookings -> 302 to /Account/Login
    GET /OccupancyReport/Monthly -> 302 to /Account/Login
    GET /OccupancyReport/Monthly as FacilityManager -> 200
    
    ### result
    FAILED

استراتيجية الاختبار

تتبنى خطة اختبار نظام حجز قاعات الاجتماعات منهجية اختبار متعددة المستويات لضمان التحقق الشامل من جودة النظام وملاءمته لبيئة العمل الداخلية. يبدأ الاختبار بمستوى الاختبارات الوحدوية (Unit Testing) التي تُنفذ ضمن مشروع App.Tests المخصص لهذا الغرض، حيث يتم اختبار المنطق البرمجي المعزول لكل خدمة على حدة، مع التركيز بشكل خاص على خدمة BookingService للتحقق من صحة خوارزمية منع التداخل الزمني بين الحجوزات، وخدمة RoomService للتأكد من صحة عمليات تغيير حالة القاعة، وخدمة NotificationService للتحقق من آلية توليد رسائل الإشعار. تُنفذ هذه الاختبارات آلياً بالكامل باستخدام إطار عمل xUnit، وتُدمج في خط أنابيب التطوير المستمر (CI) لتشغيلها تلقائياً مع كل عملية دمج للكود، مما يضمن اكتشاف الأخطاء المنطقية في مرحلة مبكرة قبل انتقالها إلى المراحل اللاحقة.

يتبع ذلك مستوى اختبار التكامل (Integration Testing) الذي يهدف إلى التحقق من التفاعل السليم بين طبقات النظام المختلفة، بما في ذلك التفاعل بين المتحكمات (Controllers) في طبقة App.Web وطبقة الخدمات في App.Infrastructure، والتكامل مع قاعدة بيانات SQLite المستخدمة في بيئة الاختبار. يركز هذا المستوى على ضمان أن البيانات تنتقل بشكل صحيح عبر طبقات Entity Framework Core، وأن عمليات الاستعلام عن القاعات المتاحة والحجوزات تُنفذ بكفاءة، مع التحقق من أن قواعد التوثيق المركزي (SSO) تُطبَّق بشكل صحيح عند محاولة الوصول إلى الموارد. تُنفذ هذه الاختبارات يدوياً بواسطة فريق التطوير في بيئة الاختبار المعزولة، مع توثيق النتائج في سجل الاختبارات لضمان التتبع.

يأتي بعد ذلك مستوى اختبار النظام (System Testing) الذي يُنفذ بناءً على سيناريوهات الاستخدام الكاملة المستمدة من وثيقة المتطلبات (BRD) ومتطلبات القبول. في هذا المستوى، يُختبر النظام كوحدة متكاملة في بيئة تشبه بيئة الإنتاج، مع استخدام بيانات تجريبية واقعية تمثل حالات الموظفين ومدير المرافق. يتم تنفيذ الاختبارات الوظيفية (Functional Testing) يدوياً بواسطة فريق الاختبار المخصص، مع التركيز على التحقق من تدفقات العمل الرئيسية مثل إنشاء الحجز، ومنع التداخل، والإلغاء، وإدارة القاعات، وتوليد التقارير الشهرية. كما يُنفذ اختبار الأداء (Performance Testing) باستخدام أدوات توليد الحمل لتقييم استجابة النظام تحت الضغط، مع التأكد من استيفاء متطلبات الأداء NFR-01 وNFR-02 التي تشترط استجابة النظام خلال ثانيتين لعرض القوائم وخمس ثوانٍ لإتمام عمليات الحجز والإلغاء. يُنفذ هذا الاختبار آلياً باستخدام أدوات مثل JMeter لمحاكاة عدد كبير من المستخدمين المتزامنين، وتُحلل النتائج لضمان عدم تجاوز حدود الوقت المحددة.

أخيراً، يُنفذ مستوى اختبار القبول (Acceptance Testing) بواسطة فريق الأعمال ومدير المرافق في بيئة ما قبل الإنتاج (Staging)، حيث يتم التحقق من أن النظام يلبي المتطلبات التجارية (BR-01 إلى BR-08) ومتطلبات القبول المحددة. يركز هذا المستوى على التحقق من تجربة المستخدم، ودقة البيانات المعروضة، والامتثال لمتطلبات الأمان والخصوصية، بما في ذلك تشفير البيانات وفقاً لمعايير هيئة الحكومة الرقمية السعودية، ودعم اللغة العربية واتجاه الكتابة من اليمين إلى اليسار (RTL). تُوثق جميع النتائج في محضر استلام نهائي، ولا يُعتبر النظام جاهزاً للنشر إلا بعد اجتياز جميع الاختبارات الحرجة والحصول على توقيع مدير المرافق والجهة المسؤولة عن التخطيط. تُستخدم أدوات أتمتة الاختبار (Test Automation) لتغطية الاختبارات الوحدوية واختبارات التكامل، بينما تبقى الاختبارات الوظيفية والقبولية يدوية لضمان التقييم الشامل لتجربة المستخدم والامتثال التنظيمي.

حالات الاختبار

  1. TC-01
    تسجيل دخول الموظف عبر نظام التوثيق المركزي (SSO) والانتقال إلى شاشة القائمة الرئيسية للتحقق من عرض القاعات المتاحة فقط مع تفاصيل سعتها وتجهيزاتها التقنية، والتأكد من استجابة النظام خلال ثانيتين.
    أساسييتحقق من ⁨FR-01⁩ و⁨NFR-01⁩ و⁨NFR-04⁩
  2. TC-02
    اختيار قاعة متاحة وإدخال تاريخ الجلسة ووقت البداية والنهاية لإنشاء حجز جديد، والتحقق من نجاح العملية وتأكيد الحالة في قاعدة البيانات خلال خمس ثوانٍ.
    أساسييتحقق من ⁨FR-02⁩ و⁨NFR-02⁩
  3. TC-03
    محاولة إنشاء حجز جديد يتداخل زمنياً مع حجز قائم مسبقاً على نفس القاعة، والتحقق من رفض النظام العملية وإظهار رسالة خطأ واضحة توضح سبب الرفض دون حدوث خلل في الواجهة.
    أساسييتحقق من ⁨FR-03⁩
  4. TC-04
    الانتقال إلى شاشة إدارة الحجوزات واختيار حجز مؤكد سابقاً لإلغائه، والتحقق من تحديث حالة الحجز إلى 'ملغي' في قاعدة البيانات وتحرير القاعة للاستخدام الفوري.
    أساسييتحقق من ⁨FR-04⁩
  5. TC-05
    التحقق من استلام الموظف إشعاراً فورياً عبر البريد الإلكتروني المؤسسي يؤكد نجاح عملية الحجز أو الإلغاء، والتأكد من توثيق إرسال الإشعار في سجل التدقيق.
    أساسييتحقق من ⁨FR-05⁩
  6. TC-06
    دخول مدير المرافق إلى لوحة التحكم وإضافة قاعة جديدة مع تحديد بياناتها الأساسية (الاسم، السعة، التجهيزات)، والتحقق من ظهورها في قاعدة البيانات بحالة 'متاحة'.
    أساسييتحقق من ⁨FR-06⁩
  7. TC-07
    تعديل بيانات قاعة حالية (مثل تغيير السعة أو إضافة تجهيزات جديدة)، والتحقق من انعكاس التعديلات فوراً على شاشة عرض القاعات المتاحة للموظفين.
    أساسييتحقق من ⁨FR-07⁩
  8. TC-08
    إيقاف قاعة مؤقتاً عن الحجز بتغيير حالتها إلى 'موقوفة للصيانة'، والتحقق من عدم ظهور هذه القاعة في قائمة الحجز المتاحة للموظفين.
    أساسييتحقق من ⁨FR-08⁩
  9. TC-09
    توليد التقرير الشهري لنسب الإشغال، والتحقق من دقة الحساب بناءً على ساعات الحجز الفعلية مقارنة بالساعات المتاحة مع استثناء فترات الصيانة المؤقتة من الحساب.
    مهميتحقق من ⁨FR-09⁩
  10. TC-10
    التحقق من تشفير بيانات الموظفين ومواعيد الحجز أثناء التخزين في قاعدة البيانات وأثناء النقل عبر الشبكة باستخدام الخوارزميات المعتمدة من هيئة الحكومة الرقمية السعودية.
    أساسييتحقق من ⁨NFR-05⁩
  11. TC-11
    التبديل بين اللغتين العربية والإنجليزية في الواجهات والإشعارات، والتحقق من دعم اتجاه الكتابة من اليمين إلى اليسار (RTL) بشكل كامل في الواجهة العربية دون تشوه في العرض.
    أساسييتحقق من ⁨NFR-06⁩

بيئة الاختبار

تُنفذ جميع أنشطة الاختبار في بيئة اختبار مستقلة عن بيئة الإنتاج، وتتم استضافة هذه البيئة على البنية السحابية المعتمدة لدى المؤسسة لضمان محاكاة الظروف التشغيلية الحقيقية. تعتمد بيئة الاختبار على إطار عمل .NET 8 مع استخدام قاعدة بيانات SQLite بدلاً من Microsoft SQL Server، وذلك استناداً إلى البنية التقنية المعتمدة في المشروع لتسهيل إدارة البيانات التجريبية وضمان سرعة الاستجابة أثناء تنفيذ السيناريوهات. تُهيأ قاعدة بيانات الاختبار مسبقاً ببيانات تجريبية (Mock Data) تمثل قاعات الاجتماعات بحالاتها المختلفة (متاحة، موقوفة للصيانة) وحجوزات متعددة التواريخ والأوقات، بما في ذلك حالات التداخل الزمني المصطنعة لاختبار منطق الرفض في TC-03. كما تُجهز حسابات اختبارية لمستخدمين بصلاحيات مختلفة (موظف عادي، مدير مرافق) مرتبطة بنظام التوثيق المركزي (SSO) لاختبار صلاحيات الوصول ومبدأ أقل صلاحيات. لحماية البيانات في بيئة الاختبار، تُطبق نفس آليات التشفير المعتمدة في بيئة الإنتاج، حيث يتم تشفير بيانات الموظفين ومواعيد الحجز أثناء التخزين وأثناء النقل باستخدام الخوارزميات المعتمدة من هيئة الحكومة الرقمية السعودية. لا تُستخدم أي بيانات إنتاجية حقيقية في بيئة الاختبار، بل تُستبدل ببيانات اصطناعية تحاكي البنية دون الكشف عن معلومات حساسة، مع ضمان عزل بيئة الاختبار عن شبكات الإنتاج الداخلية لمنع أي تسرب للبيانات أو تأثير على العمليات التشغيلية الجارية. تُسجَّل جميع محاولات الوصول إلى بيانات الاختبار في سجل التدقيق لضمان تتبع أي استخدام غير مصرح به، وتُطبق سياسات النسخ الاحتياطي على قاعدة بيانات الاختبار بشكل دوري لضمان استمرارية الاختبارات في حال حدوث أعطال تقنية.

معايير إنهاء الاختبار

تُعد معايير الخروج المرجع الحاسم لقياس جاهزية نظام حجز قاعات الاجتماعات للانتقال من مرحلة الاختبار إلى بيئة التشغيل الفعلي، ولا يُسمح بإطلاق النظام إلا بعد تحقق جميع الشروط التالية بشكل قاطع. أولاً، يجب أن تسجّل جميع حالات الاختبار الإلزامية (must) الموثقة في سجل الاختبارات نتائج نجاح بنسبة 100%، مع ضمان عدم وجود أي أخطاء حرجة (Critical) أو جسيمة (Major) مفتوحة أو غير معالجة في النظام. ثانياً، يجب أن يثبت النظام قدرته على منع التداخلات الزمنية بشكل مطلق، حيث يُشترط أن ترفض جميع محاولات إنشاء الحجوزات المتقاطعة مع حجوزات قائمة على نفس القاعة، مع إظهار رسائل خطأ واضحة ومفهومة للمستخدم دون أي انهيار في الواجهة أو فقدان للبيانات. ثالثاً، يجب أن يستوفي النظام المتطلبات غير الوظيفية للأداء، وذلك بتأكيد استجابة شاشة عرض القاعات خلال ثانيتين، وإتمام عمليات إنشاء الحجز والإلغاء بما فيها إرسال الإشعارات خلال خمس ثوانٍ كحد أقصى تحت الحمل الطبيعي المتوقع. رابعاً، يجب التحقق من اكتمال دورة حياة الحجز والإشعارات، بحيث يتلقى الموظف إشعاراً فورياً عبر البريد الإلكتروني المؤسسي عند تأكيد الحجز أو إلغائه، مع توثيق هذه العمليات في سجل التدقيق بشكل دقيق. خامساً، يجب أن تثبت صلاحيات مدير المرافق فعاليتها الكاملة، بما في ذلك إضافة القاعات وتعديلها وإيقافها للصيانة، مع التأكد من عدم ظهور القاعات الموقوفة في واجهة الموظف، ودقة التقارير الشهرية في استثناء فترات الصيانة من حساب نسب الإشغال. سادساً، يجب أن ينجح النظام في التكامل مع نظام التوثيق المركزي (SSO) دون أي أعطال، مع ضمان تشفير البيانات أثناء النقل والتخزين وفقاً لمعايير هيئة الحكومة الرقمية السعودية، والتحقق من التوافق الكامل مع دعم اللغة العربية واتجاه الكتابة من اليمين إلى اليسار. أخيراً، يُشترط الحصول على موافقة خطية وتوقيع من مدير المرافق والجهة المسؤولة عن التخطيط على محضر استلام نهائي يثبت خلو النظام من العيوب الجوهرية واستيفاءه لجميع معايير القبول المعتمدة في وثيقة المتطلبات.