diff --git a/functional_tests/README.md b/functional_tests/README.md index 1c972b2..74219b6 100644 --- a/functional_tests/README.md +++ b/functional_tests/README.md @@ -65,3 +65,20 @@ --- +**Execution Date:** 12/18/2025, 1:37:15 PM + +**Test Unique Identifier:** "roost_test_1766044895" + +**Input(s):** + 1. ecommerce.pdf + Path: /Users/iamdm/Desktop/atid/ecommerce.pdf + +**Test Output Folder:** + 1. [roost_test_1766044895.json](roost_test_1766044895/roost_test_1766044895.json) + 2. [roost_test_1766044895.feature](roost_test_1766044895/roost_test_1766044895.feature) + 3. [roost_test_1766044895.csv](roost_test_1766044895/roost_test_1766044895.csv) + 4. [roost_test_1766044895.xlsx](roost_test_1766044895/roost_test_1766044895.xlsx) + 5. [roost_test_1766044895.yaml](roost_test_1766044895/roost_test_1766044895.yaml) + +--- + diff --git a/functional_tests/roost_test_1766044895/.roost/roost_metadata.json b/functional_tests/roost_test_1766044895/.roost/roost_metadata.json new file mode 100644 index 0000000..72db0bb --- /dev/null +++ b/functional_tests/roost_test_1766044895/.roost/roost_metadata.json @@ -0,0 +1,19 @@ +{ + "project": { + "name": "roost_test_1766044895", + "created_at": "2025-12-18T08:07:15.127Z", + "updated_at": "2025-12-18T08:07:15.127Z" + }, + "files": { + "input_files": [ + { + "fileName": "ecommerce.pdf", + "fileURI": "/var/tmp/Roost/RoostGPT/hapo-functional-test/1766044895/functional_tests/roost_test_1766044895/ecommerce.pdf", + "fileSha": "7454ebf59c" + } + ] + }, + "api_files": { + "input_files": [] + } +} \ No newline at end of file diff --git a/functional_tests/roost_test_1766044895/roost_test_1766044895.csv b/functional_tests/roost_test_1766044895/roost_test_1766044895.csv new file mode 100644 index 0000000..40af78c --- /dev/null +++ b/functional_tests/roost_test_1766044895/roost_test_1766044895.csv @@ -0,0 +1,48 @@ +מסע משתמש מלא עם ולידציות שגיאה (חוסר מיקוד ושיטת תשלום לא תקינה) +הזמנה מוצלחת עם תשלום אשראי תקין ומייל אישור +ניווט חלופי לעמוד 2 - מספר עמוד מול חץ 'הבא' +בחירת מוצר באמצעות תמונה או שם +עדכון עגלה - כמות, חישובי סכומים בש"ח והסרה +בחירת שיטת משלוח והשפעתה על המחיר ועל זמן האספקה +ולידציות שדות בצ'קאאוט - אימייל, טלפון, מיקוד ושדות חובה +קופון הנחה תקף - החלה וביטול +קופון לא תקין/פג תוקף +תשלום בכרטיסים מקומיים - ישראכרט ודיינרס +תשלום ב-PayPal (אם קיים) וחזרה לסיכום +צ'קאאוט כאורח ללא יצירת חשבון +צ'קאאוט כמשתמש רשום ושמירת פרטים +מוצר ללא מלאי - מניעת הזמנה +מיקוד ישראלי - 7 ספרות ועזרה למשתמש +הודעות אימייל - אישור הזמנה +ממשק בעברית ו-RTL בכל הדפים המרכזיים +מניעת הזמנה כפולה בלחיצה כפולה על 'PLACE ORDER' +הצגת מע"מ 17% בסיכום ההזמנה והחשבונית +Local pickup - הסרת חובת כתובת והצגת מידע איסוף +עדכון זמן אספקה לפי עיר בישראל +שמירת עגלה בין מכשירים וסשנים למשתמש רשום +הוספת מוצר נוסף והשפעה על עלות משלוח משוקללת +תמיכה בעברית בשדות כתובת - תווים מיוחדים ושמות רחובות +התאמת שיטת תשלום לפי סכום הזמנה +התאוששות משגיאת 'Invalid payment method' - הנחיה לפתרון +פרטיות - הסכמה לעיבוד נתונים ומינימיזציה של PII +שימושיות - הודעות שגיאה בעברית ברורות ומנחות +נגישות - תאימות לתקן 5568/WCAG 2.1 AA +תאימות דפדפנים ומכשירים נפוצים בישראל +אמינות - שמירת הזמנה לא גמורה והמשך מאוחר יותר +אבטחה - דרישת 3D Secure לפי סכום +API - מניעת הזמנה כפולה עם Idempotency-Key +API - עדכון מלאי לאחר הזמנה מוצלחת +API - ביטול הזמנה והחזר לפי מדיניות +API - זמני אספקה ועלויות לפי עיר +API - מניעת מכירה יתר (Race Condition) עם מלאי 1 +API - אימות שליחת אימייל אישור הזמנה +API - Feature Flags לשיטות משלוח +API - תאימות חוזים בין גרסאות v1/v2 +API - התאוששות מכשל זמני בשער תשלום (Retry) +API - לוגים, ניטור והתראות ללא חשיפת PII +API - נפילת שירות משלוח ו-Fallback +API - הצפנת תעבורה ועמידה ב-PCI DSS (TLS/HSTS) +ביצועים - זמן טעינת דף הבית והקטגוריה (FCP/TTFB) +סקיילביליות - צ'קאאוט תחת עומס עולה +אבטחה - ולידציית קלט, XSS ו-SQL Injection +אבטחה - ניהול סשן, Cookies ו-CSRF \ No newline at end of file diff --git a/functional_tests/roost_test_1766044895/roost_test_1766044895.feature b/functional_tests/roost_test_1766044895/roost_test_1766044895.feature new file mode 100644 index 0000000..8fbaff5 --- /dev/null +++ b/functional_tests/roost_test_1766044895/roost_test_1766044895.feature @@ -0,0 +1,515 @@ +Feature: חנות אונליין - בדיקות מקצה לקצה, API ולוקליזציה לישראל (₪, RTL, תקני אבטחה) + + Background: + Given סביבת הבדיקות מוגדרת לדפדפן בעברית ובפריסת RTL + And API base URL מוגדר במשתנה סביבה 'API_BASE_URL' + And מוגדר טוקן הרשאה תקף לבדיקות API + + # UI Tests - תרחישים פונקציונליים בממשק + @ui @rtl @e2e @TC-FUNC-001 + Scenario: מסע משתמש מלא עם ולידציות שגיאה (חוסר מיקוד ושיטת תשלום לא תקינה) + Given אני נמצא בדף הבית בכתובת 'https://share.google/gX4PkITYxjSjISHwh' + When אני לוחץ על הכפתור 'SHOP NOW' תחת הקטגוריה 'Latest Eyewear For You' + And אני לוחץ על מספר העמוד '2' בניווט הדפים + Then אני אמור להיות בעמוד 2 של הקטגוריה ולראות רשימת מוצרים מעודכנת + When אני חוזר לעמוד 1 באמצעות הניווט + And אני לוחץ על חץ 'הבא' בניווט הדפים + Then אני אמור לראות שהגעתי לאותו תוכן ו-URL כפי שהופיע בעמוד 2 (עקביות שני מסלולים) + When אני לוחץ על תמונת המוצר 'Red Hoodie' + Then אני אמור לראות את עמוד הפריט 'Red Hoodie' + When אני חוזר לעמוד הקטגוריה + And אני לוחץ על שם המוצר 'Red Hoodie' + Then אני אמור לראות שוב את עמוד הפריט 'Red Hoodie' + When אני לוחץ על הכפתור 'ADD TO CART' + And אני לוחץ על הכפתור 'VIEW CART' + Then אני אמור לראות את 'Red Hoodie' בעגלה + When אני בוחר את שיטת המשלוח 'Local pickup' + Then עלות המשלוח אמורה להתעדכן ל-₪0 (או לפי הגדרה) ומוצגת הערכת זמן איסוף + When אני בוחר את שיטת המשלוח 'Delivery Express' + Then עלות המשלוח אמורה להתעדכן לטווח צפוי (למשל ₪35-₪60) ומוצג זמן אספקה מותאם + When אני בוחר את שיטת המשלוח 'Registered Mail' + Then עלות המשלוח אמורה להתעדכן לטווח צפוי (למשל ₪20-₪30) ומוצג זמן אספקה מותאם + When אני לוחץ על 'PROCEED TO CHECKOUT' + And אני ממלא את פרטי הצ'קאאוט פרט ל-Postcode/ZIP: שם פרטי 'דנה', שם משפחה 'כהן', כתובת 'הרצל 10', עיר 'תל אביב', טלפון '0541234567', אימייל 'dana@test.co.il' + And אינני בוחר שיטת תשלום + And אני לוחץ על 'PLACE ORDER' + Then אמורה להופיע הודעת שגיאה בעברית על חוסר בשדה מיקוד (Postcode/ZIP) 7 ספרות + When אני מזין בשדה Postcode/ZIP את '6777655' + And אני לוחץ על 'PLACE ORDER' + Then אמורה להופיע הודעת שגיאה בעברית לגבי שיטת תשלום לא תקינה/לא נבחרה + + @ui @rtl @payments @TC-FUNC-002 + Scenario: הזמנה מוצלחת עם תשלום אשראי תקין ומייל אישור + Given אני נמצא בדף הבית בכתובת 'https://share.google/gX4PkITYxjSjISHwh' + When אני לוחץ על 'SHOP NOW' בקטגוריה 'Latest Eyewear For You' + And אני מנווט לעמוד '2' ולוחץ על 'Red Hoodie' + And אני לוחץ 'ADD TO CART' ואז 'VIEW CART' + And אני בוחר 'Delivery Express' ומוודא שסימן המטבע הוא ₪ + And אני לוחץ 'PROCEED TO CHECKOUT' + And אני ממלא פרטים: שם 'יואב', משפחה 'לוי', כתובת 'בן גוריון 25', עיר 'חיפה', טלפון '0529876543', אימייל 'yoav@example.com', מיקוד '3276543' + And אני בוחר שיטת תשלום 'Credit Card' + And אני מזין כרטיס: מספר '4111111111111111', תוקף '12/28', CVV '123', ת"ז '123456789', שם בעל הכרטיס 'יואב לוי' + And אני לוחץ 'PLACE ORDER' + Then אמורה להופיע הודעת הצלחה עם מספר הזמנה ייחודי וסיכום הכולל מע"מ 17% וש"ח + And אמור להתקבל אימייל אישור בעברית הכולל תאריך בפורמט dd/mm/yyyy ושעה באזור Asia/Jerusalem + + @ui @rtl @navigation @TC-FUNC-003 + Scenario: ניווט חלופי לעמוד 2 - מספר עמוד מול חץ 'הבא' + Given אני בעמוד הקטגוריה לאחר לחיצה על 'SHOP NOW' + When אני לוחץ על '2' בניווט הדפים + And אני שומר את רשימת המוצרים ואת ה-URL + And אני חוזר לעמוד 1 + And אני לוחץ על חץ 'הבא' + Then רשימת המוצרים וה-URL אמורים להיות זהים/עקביים לעומת העמוד שאוחסן קודם (page=2 או בהתאם לסטנדרט האתר) + + @ui @rtl @product @TC-FUNC-004 + Scenario Outline: בחירת מוצר באמצעות תמונה או שם + Given אני בעמוד הקטגוריה שבו מוצג 'Red Hoodie' + When אני לוחץ על <רכיב_לחיץ> של 'Red Hoodie' + Then אני אמור לראות את עמוד המוצר 'Red Hoodie' + + Examples: + | רכיב_לחיץ | + | תמונה | + | שם המוצר | + + @ui @rtl @cart @pricing @TC-FUNC-005 + Scenario: עדכון עגלה - כמות, חישובי סכומים בש"ח והסרה + Given הוספתי את 'Red Hoodie' לעגלה ואני בעמוד 'VIEW CART' + When אני משנה את הכמות ל-2 ומעדכן את העגלה (אם נדרש) + Then סכום הביניים אמור להיות מחיר יחידה כפול 2 בש"ח + And אם מוצג מע"מ 17% הוא מחושב נכון + And הסכום הכולל מוצג נכון בשקלים + When אני מסיר את הפריט מהעגלה + Then העגלה אמורה להיות ריקה וללא עלות משלוח + + @ui @rtl @shipping @TC-FUNC-006 + Scenario Outline: בחירת שיטת משלוח והשפעתה על המחיר ועל זמן האספקה + Given יש מוצר בעגלה ואני בעמוד 'VIEW CART' + When אני בוחר את שיטת המשלוח '<שיטת_משלוח>' + Then עלות המשלוח אמורה להיות בטווח '<טווח_מחיר_ש"ח>' + And זמן האספקה אמור להיות '<זמן_אספקה>' + + Examples: + | שיטת_משלוח | טווח_מחיר_ש"ח | זמן_אספקה | + | Local pickup | ₪0 | איסוף מיידי/זמן איסוף | + | Delivery Express | ₪35-₪60 | 1-2 ימי עסקים | + | Registered Mail | ₪20-₪30 | 3-7 ימי עסקים | + + @ui @rtl @validation @checkout @TC-FUNC-007 + Scenario Outline: ולידציות שדות בצ'קאאוט - אימייל, טלפון, מיקוד ושדות חובה + Given יש מוצר בעגלה ואני בעמוד הצ'קאאוט + When אני מזין בשדה '<שדה>' את הערך '<ערך>' (או משאיר ריק אם מצוין) + And אני לוחץ 'PLACE ORDER' + Then אמורה להופיע הודעת שגיאה בעברית: '<הודעת_שגיאה>' + + Examples: + | שדה | ערך | הודעת_שגיאה | + | שם פרטי | | שדה חובה | + | אימייל | user@wrong | אימייל אינו תקין | + | טלפון | 1234 | מספר טלפון ישראלי אינו תקין | + | Postcode/ZIP| 12345 | יש להזין מיקוד בן 7 ספרות | + + @ui @rtl @coupon @pricing @TC-FUNC-008 + Scenario: קופון הנחה תקף - החלה וביטול + Given יש מוצר בעגלה + When אני מזין קוד קופון 'SALE10' ולוחץ 'Apply' + Then המחיר אמור לרדת ב-10% והנחה מוצגת בש"ח + When אני מבטל/מסיר את הקופון + Then המחיר אמור לחזור למחיר המלא ללא הנחה + + @ui @rtl @coupon @TC-FUNC-008 + Scenario: קופון לא תקין/פג תוקף + Given יש מוצר בעגלה + When אני מזין קוד קופון 'OLD5' ולוחץ 'Apply' + Then אמורה להופיע הודעה בעברית: 'קופון פג תוקף' או 'קופון לא תקין' + + @ui @rtl @payments @cards @TC-FUNC-009 + Scenario Outline: תשלום בכרטיסים מקומיים - ישראכרט ודיינרס + Given יש מוצר בעגלה ואני בעמוד הצ'קאאוט + When אני בוחר תשלום 'Credit Card' ומזין כרטיס <מותג>: מספר '<מספר>', תוקף '<תוקף>', CVV ''<תז> + And אני לוחץ 'PLACE ORDER' + Then מתקבלת תגובת הצלחה או שגיאה מבוקרת בהתאם לסביבת הבדיקות ללא חשיפת פרטי כרטיס מלאים + + Examples: + | מותג | מספר | תוקף | CVV | תז | + | ישראכרט | 4580000000000000 | 05/27 | 123 | , ת"ז '123456782' | + | דיינרס | 30000000000004 | 11/26 | 123 | | + + @ui @rtl @paypal @TC-FUNC-010 + Scenario: תשלום ב-PayPal (אם קיים) וחזרה לסיכום + Given יש מוצר בעגלה ואני בעמוד הצ'קאאוט + When אני בוחר 'PayPal' + Then אני אמור להיות מנותב לעמוד PayPal + When אני מבצע כניסה לחשבון בדמה ומאשר תשלום + Then אני אמור לחזור לאתר עם סטטוס 'אושר' וסיכום הזמנה כולל מספר הזמנה + + @ui @rtl @auth @TC-FUNC-011 + Scenario: צ'קאאוט כאורח ללא יצירת חשבון + Given יש מוצר בעגלה ואני בעמוד הצ'קאאוט + When אני ממלא את כל הפרטים הנדרשים ללא כניסה לחשבון + And אני משלים הזמנה + Then ההזמנה נקלטת ואין דרישה ליצירת חשבון + + @ui @rtl @auth @TC-FUNC-011 + Scenario: צ'קאאוט כמשתמש רשום ושמירת פרטים + Given אני מתנתק/מנקה עוגיות ונכנס עם 'noa@example.com' + When אני מגיע לצ'קאאוט + Then פרטי המשלוח נטענים אוטומטית מהפרופיל + When אני מעדכן כתובת ושומר + Then הכתובת החדשה נשמרת ומוצגת בפרופיל לבאות + + @ui @rtl @stock @TC-FUNC-012 + Scenario: מוצר ללא מלאי - מניעת הזמנה + Given אני בעמוד פריט שמסומן Out of Stock + When אני מנסה ללחוץ 'ADD TO CART' + Then הכפתור מושבת או מוצגת הודעה 'אין במלאי' ואין הוספה לעגלה + + @ui @rtl @postcode @TC-FUNC-013 + Scenario: מיקוד ישראלי - 7 ספרות ועזרה למשתמש + Given יש מוצר בעגלה ואני בעמוד הצ'קאאוט + When אני מזין מיקוד '123456' ולוחץ 'PLACE ORDER' + Then מוצגת הודעת שגיאה: 'יש להזין מיקוד בן 7 ספרות' + And קיים קישור/טיפ עזרה (למשל לאתר דואר ישראל) למציאת מיקוד + + @ui @rtl @email @TC-FUNC-014 + Scenario: הודעות אימייל - אישור הזמנה + Given השלמתי הזמנה מוצלחת + When אני בודק את תיבת הדואר של הלקוח בסביבת בדיקה + Then מתקבל אימייל בעברית עם תאריך dd/mm/yyyy, סכומים ב-₪ ופירוט מע"מ + And אם קיים, מופיע קישור לשחזור עגלה/הזמנה + + @ui @rtl @i18n @TC-FUNC-015 + Scenario: ממשק בעברית ו-RTL בכל הדפים המרכזיים + Given אני בודק את דף הבית, קטגוריה, מוצר, עגלה וצ'קאאוט + Then כל הטקסטים בעברית, יישור לימין ותוויות מוצגות נכון + And אין ערבוב כיוונים (LTR/RTL) הגורם לשבירה + And אין שגיאות כתיב בעברית + + @ui @rtl @idempotency @TC-FUNC-016 + Scenario: מניעת הזמנה כפולה בלחיצה כפולה על 'PLACE ORDER' + Given יש מוצר בעגלה ואני בעמוד הצ'קאאוט עם פרטים מלאים + When אני לוחץ פעמיים במהירות על 'PLACE ORDER' + Then נוצרת רק הזמנה אחת ואין חיוב כפול + + @ui @rtl @vat @TC-FUNC-019 + Scenario: הצגת מע"מ 17% בסיכום ההזמנה והחשבונית + Given יש מוצר בעגלה + When אני משלים הזמנה + Then בסיכום/חשבונית מוצג פירוט מע"מ 17% בש"ח והסכומים מדויקים + + @ui @rtl @shipping @form @TC-FUNC-020 + Scenario: Local pickup - הסרת חובת כתובת והצגת מידע איסוף + Given בחרתי 'Local pickup' בעגלה + When אני ממשיך לצ'קאאוט ומנסה להזמין ללא הזנת כתובת מלאה + Then אין שגיאה על שדות כתובת + And מוצגת כתובת החנות/שעות איסוף + + @ui @rtl @shipping @sla @TC-FUNC-021 + Scenario Outline: עדכון זמן אספקה לפי עיר בישראל + Given יש מוצר בעגלה ואני בעמוד הצ'קאאוט + When אני מזין עיר '<עיר>' ובוחר 'Delivery Express' + Then זמן האספקה המוצג צריך להיות '<זמן_אספקה>' + + Examples: + | עיר | זמן_אספקה | + | תל אביב | 1-2 ימי עסקים | + | מטולה | 2-4 ימי עסקים | + + @ui @rtl @cart @sync @TC-FUNC-022 + Scenario: שמירת עגלה בין מכשירים וסשנים למשתמש רשום + Given אני מתחבר בדסקטופ ומוסיף פריט לעגלה + When אני מתנתק ומתחבר ממכשיר מובייל + Then העגלה אמורה להסתנכרן ולהציג את אותו הפריט + + @ui @rtl @shipping @pricing @TC-FUNC-023 + Scenario: הוספת מוצר נוסף והשפעה על עלות משלוח משוקללת + Given הוספתי 'Red Hoodie' לעגלה + When אני מוסיף מוצר נוסף 'Blue Sunglasses' ובוחר 'Delivery Express' + Then עלות המשלוח מתעדכנת לפי משקל/נפח בהתאם לכללי התעריפים + + @ui @rtl @address @TC-FUNC-025 + Scenario: תמיכה בעברית בשדות כתובת - תווים מיוחדים ושמות רחובות + Given יש מוצר בעגלה ואני בעמוד הצ'קאאוט + When אני מזין כתובת "הרב קוק 12/3 קומה 2-א'" + And אני לוחץ 'PLACE ORDER' + Then הכתובת מתקבלת ונרשמת ללא סינון שגוי של תווים חוקיים + + @ui @rtl @payments @visibility @TC-FUNC-026 + Scenario Outline: התאמת שיטת תשלום לפי סכום הזמנה + Given יש מוצר/ים בעגלה עם סכום כולל '<סכום_הזמנה>' + When אני מגיע לצ'קאאוט + Then שיטת 'תשלומים' אמורה להיות '<נראות_תשלומים>' + + Examples: + | סכום_הזמנה | נראות_תשלומים | + | ₪10 | מוסתרת | + | ₪1000 | זמינה | + + @ui @rtl @guidance @TC-NF-014 + Scenario: התאוששות משגיאת 'Invalid payment method' - הנחיה לפתרון + Given בצעתי ניסיון תשלום שהחזיר 'Invalid payment method' + When אני קורא את הודעת השגיאה על המסך + Then ההודעה צריכה להציע בחירה בשיטה אחרת או בדיקת פרטי התשלום + When אני בוחר שיטה אחרת ומנסה שוב + Then התשלום אמור להצליח או להיכשל באופן מבוקר עם הנחיה נוספת + + @ui @rtl @privacy @TC-NF-013 + Scenario: פרטיות - הסכמה לעיבוד נתונים ומינימיזציה של PII + Given אני בעמוד הצ'קאאוט + When אני בודק שקיימת תיבת סימון להסכמה ומדיניות פרטיות בעברית + Then ההזמנה לא מבקשת פרטים מיותרים מעבר לנדרש + And לוגים/מסכים אינם מציגים אימייל/טלפון גולמיים + + @ui @rtl @usability @errors @TC-NF-007 + Scenario: שימושיות - הודעות שגיאה בעברית ברורות ומנחות + Given אני גורם לשגיאות אימייל/טלפון/מיקוד בטפסים + When ההודעות מוצגות + Then ההודעות ברורות, לא טכניות מדי, ומציינות מה לתקן + And קישורי עזרה (אם קיימים) פועלים ומועילים + + @ui @rtl @accessibility @WCAG @TC-NF-008 + Scenario: נגישות - תאימות לתקן 5568/WCAG 2.1 AA + Given אני מריץ בדיקות axe ובודק עם NVDA/JAWS + When אני מנווט עם מקלדת בכל הרכיבים + Then לכל שדה יש aria-label תקין וניגודיות צבעים >= 4.5:1 + And לתמונות מוצרים יש טקסט אלטרנטיבי ומיקוד נראה (focus outline) + + @ui @rtl @compatibility @browsers @TC-NF-009 + Scenario Outline: תאימות דפדפנים ומכשירים נפוצים בישראל + Given אני מריץ תרחיש קניה מלא בדפדפן/מכשיר '<פלטפורמה>' + When אני בודק פריסת RTL וטקסטים בעברית + Then החוויה אחידה וללא שבירות RTL + + Examples: + | פלטפורמה | + | Chrome Desktop | + | Firefox Desktop | + | Edge Desktop | + | Safari Desktop | + | iOS Safari | + | Android Chrome | + + @ui @rtl @resume @TC-NF-015 + Scenario: אמינות - שמירת הזמנה לא גמורה והמשך מאוחר יותר + Given אני ממלא חלק משדות הצ'קאאוט כמשתמש רשום + When אני יוצא מהדף/מתנתק + And אני נכנס שוב וחוזר לצ'קאאוט + Then השדות שמורים וניתן להמשיך מהנקודה שהופסקה + + @ui @rtl @3DS @payments @TC-NF-017 + Scenario Outline: אבטחה - דרישת 3D Secure לפי סכום + Given יש בעגלה סכום '<סכום>' + When אני בוחר תשלום אשראי ומבצע תשלום + Then עבור סכום ברמת '<מדיניות_3DS>' אמורה להתבצע הפניית 3DS ואימות OTP בהתאם למדיניות + + Examples: + | סכום | מדיניות_3DS | + | ₪1500 | נדרש 3DS | + | ₪100 | לא נדרש 3DS | + + # API Tests - תרחישים פונקציונליים ותשתיתיים + @api @orders @idempotency @TC-FUNC-016 + Scenario: API - מניעת הזמנה כפולה עם Idempotency-Key + Given כתובת ה-API היא '${API_BASE_URL}' ויש טוקן הרשאה תקף + When אני שולח בקשת POST ל'/api/orders' עם כותרת 'Idempotency-Key: 123e4567' והמטען: + """ + { + "customer": { + "firstName": "דנה", + "lastName": "כהן", + "email": "dana@test.co.il", + "phone": "0541234567" + }, + "shipping": { + "method": "delivery_express", + "address": { + "street": "הרצל 10", + "city": "תל אביב", + "postcode": "6777655", + "country": "IL" + } + }, + "items": [ + {"sku": "RED-HOODIE", "qty": 1, "price": 199.00, "currency": "ILS"} + ], + "payment": {"method": "credit_card", "token": "tok_test_ok"} + } + """ + Then סטטוס התגובה צריך להיות 201 + And גוף התגובה צריך להכיל 'orderId' ו'currency'='ILS' + When אני שולח שוב את אותה בקשה עם אותו Idempotency-Key + Then סטטוס התגובה צריך להיות 201 + And יוחזר אותו 'orderId' (אין יצירת הזמנה כפולה) + + @api @inventory @TC-FUNC-017 + Scenario: API - עדכון מלאי לאחר הזמנה מוצלחת + Given כתובת ה-API היא '${API_BASE_URL}' ויש טוקן הרשאה תקף + When אני שולח GET ל'/api/inventory/products/RED-HOODIE' + Then סטטוס התגובה צריך להיות 200 + And אני שומר את 'onHand' ההתחלתי + When אני שולח POST ל'/api/orders' ליצירת הזמנה עם פריט RED-HOODIE (qty=1) והמָטען: + """ + { + "items": [{"sku": "RED-HOODIE", "qty": 1}], + "payment": {"method": "credit_card", "token": "tok_test_ok"}, + "currency": "ILS" + } + """ + Then סטטוס התגובה צריך להיות 201 + When אני שולח GET ל'/api/inventory/products/RED-HOODIE' + Then ערך 'onHand' החדש צריך להיות קטן ב-1 מהערך ההתחלתי + + @api @orders @refunds @TC-FUNC-018 + Scenario: API - ביטול הזמנה והחזר לפי מדיניות + Given יש הזמנה קיימת במצב 'pending' עם מזהה 'ORD-123' + When אני שולח POST ל'/api/orders/ORD-123/cancel' עם סיבת ביטול 'לקוח ביקש' + Then סטטוס התגובה צריך להיות 200 + And סטטוס ההזמנה צריך להיות 'canceled' + And ייווצר רישום החזר בהתאם לאמצעי התשלום + + @api @shipping @rates @TC-FUNC-021 + Scenario Outline: API - זמני אספקה ועלויות לפי עיר + Given כתובת ה-API היא '${API_BASE_URL}' + When אני שולח POST ל'/api/shipping/rates' עם: + """ + { + "city": "<עיר>", + "country": "IL", + "methods": ["delivery_express"], + "items": [{"sku": "RED-HOODIE", "qty": 1, "weight": 0.5}] + } + """ + Then סטטוס התגובה צריך להיות 200 + And התגובה צריכה להכיל method='delivery_express' עם 'eta'='' ו'price.currency'='ILS' + + Examples: + | עיר | ETA | + | תל אביב | 1-2 ימי עסקים | + | מטולה | 2-4 ימי עסקים | + + @api @concurrency @oversell @TC-FUNC-024 + Scenario: API - מניעת מכירה יתר (Race Condition) עם מלאי 1 + Given במוצר RED-HOODIE יש מלאי onHand=1 + When שני משתמשים A ו-B שולחים במקביל POST ל'/api/orders' עם פריט RED-HOODIE qty=1 + Then רק אחד צריך לקבל 201 עם orderId תקף + And השני צריך לקבל 409/422 עם הודעה 'המוצר אינו זמין' + + @api @email @TC-FUNC-014 + Scenario: API - אימות שליחת אימייל אישור הזמנה + Given יש הזמנה חדשה עם מזהה 'ORD-200' + When אני מחפש בתיבת הדואר הבדיקתית דרך '/api/test/mailbox/search?orderId=ORD-200&locale=he-IL' + Then סטטוס התגובה צריך להיות 200 + And גוף ההודעה צריך לכלול סכומים ב-₪, תאריך בפורמט dd/mm/yyyy ופירוט מע"מ + + @api @feature_flags @shipping @TC-NF-016 + Scenario: API - Feature Flags לשיטות משלוח + Given דגל 'registered_mail' פעיל + When אני מכבה את הדגל דרך POST '/api/flags/registered_mail/disable' + Then סטטוס צריך להיות 200 + When אני שולח GET ל'/api/shipping/methods?country=IL' + Then 'registered_mail' לא יופיע ברשימת השיטות + When אני מפעיל מחדש את הדגל דרך POST '/api/flags/registered_mail/enable' + Then 'registered_mail' יחזור להופיע ברשימה + + @api @compatibility @versioning @TC-NF-010 + Scenario Outline: API - תאימות חוזים בין גרסאות v1/v2 + Given כתובת ה-API היא '${API_BASE_URL}' + When אני שולח POST ל'/<גרסה>/orders' עם מטען בסיסי: + """ + { + "items": [{"sku": "RED-HOODIE", "qty": 1}], + "currency": "ILS", + "payment": {"method": "credit_card", "token": "tok_test_ok"} + } + """ + Then סטטוס התגובה צריך להיות 201 + And השדות הקריטיים קיימים: 'orderId', 'amount', 'currency', 'transactionId' + And טיפול בשדות חדשים/חסרים נעשה ללא כשל + + Examples: + | גרסה | + | v1 | + | v2 | + + @api @reliability @payments @retry @TC-NF-006 + Scenario: API - התאוששות מכשל זמני בשער תשלום (Retry) + Given כתובת ה-API היא '${API_BASE_URL}' + When אני שולח POST ל'/api/payments/charge' עם סימולציית כשל זמני: + """ + { + "amount": 299.00, + "currency": "ILS", + "method": "credit_card", + "token": "tok_simulate_temporary_failure" + } + """ + Then סטטוס התגובה צריך להיות 503 והודעה: 'תקלה זמנית בתשלום, נסה שוב או בחר אמצעי אחר' + When אני מנסה שוב עם אותו מטען לאחר 5 שניות + Then הסטטוס צריך להיות 200/201 בהתאם והעסקה תתקבל ללא יצירת הזמנה כפולה + + @api @privacy @logging @monitoring @TC-NF-011 + Scenario: API - לוגים, ניטור והתראות ללא חשיפת PII + Given מופעלת מערכת לוגים וניטור + When אני מבצע הזמנה מוצלחת ושגויה + Then בלוגים יופיעו: מזהה הזמנה, זמן, סטטוס ללא אימייל/טלפון גולמיים + When אני מסמלץ שגיאת שער תשלום + Then נשלחת התראה לצוות (Slack/Email) עם פרטים לא מזהים בלבד + + @api @reliability @shipping_outage @TC-NF-012 + Scenario: API - נפילת שירות משלוח ו-Fallback + Given אני משבית זמנית את 'delivery_express' דרך '/api/shipping/providers/delivery_express/disable' + When אני מבקש תעריפי משלוח לישראל + Then מתקבלת הודעה על אי זמינות ואלטרנטיבה 'registered_mail' מוצעת + When אני מפעיל מחדש את השירות דרך '/api/shipping/providers/delivery_express/enable' + Then הבקשות חוזרות לתפקד כרגיל + + @api @security @tls @hsts @pci @TC-NF-005 + Scenario: API - הצפנת תעבורה ועמידה ב-PCI DSS (TLS/HSTS) + Given אתר הבדיקה נגיש ב-HTTPS בלבד + When אני מריץ סריקת SSL על '${API_BASE_URL}' + Then יש תמיכה ב-TLS 1.2/1.3 ו-HSTS מופעל + And אין שמירת PAN מלא בלוגים/DB ונעשה Tokenization לפרטי כרטיס + + # Non-Functional UI/API - ביצועים, סקיילביליות, אבטחה, סשן + @performance @web @TC-NF-001 + Scenario: ביצועים - זמן טעינת דף הבית והקטגוריה (FCP/TTFB) + Given סביבת בדיקות יציבה וכלי Lighthouse/WPT זמינים + When אני מודד FCP לדף הבית 3 פעמים + Then ממוצע FCP קטן מ-2 שניות + When אני מודד FCP לעמוד קטגוריה 3 פעמים + Then ממוצע FCP קטן מ-2.5 שניות + When יש עומס של 200 משתמשים סימולטניים + Then הירידה בביצועים אינה עולה על 20% וה-95th percentile נשלט + + @load @scalability @checkout @TC-NF-002 + Scenario Outline: סקיילביליות - צ'קאאוט תחת עומס עולה + Given תרחיש צ'קאאוט מלא אוטומטי מוגדר + When אני מריץ את התרחיש ל-<משתמשים> משתמשים במקביל + Then אחוזי כשל < 1% וזמן תגובה ממוצע לצ'קאאוט < שניות (עד 500) + And ב-1000 משתמשים אין קריסה והירידה מבוקרת + + Examples: + | משתמשים | SLA | + | 100 | 3 | + | 500 | 3 | + | 1000 | 5 | + + @security @inputs @xss @sqli @TC-NF-003 + Scenario: אבטחה - ולידציית קלט, XSS ו-SQL Injection + Given אני בעמודי צ'קאאוט וחיפוש + When אני מזין "" בשדות טקסט + Then הקלט מסונן/מוסקר ואינו רץ בדפדפן + When אני מזין "' OR 1=1 --" בשדות רלוונטיים + Then אין הזרקת SQL והודעת שגיאה כללית ואינה חושפת פרטי מערכת + + @security @session @cookies @csrf @TC-NF-004 + Scenario: אבטחה - ניהול סשן, Cookies ו-CSRF + Given אני נכנס לחשבון משתמש בדמה + When אני בודק את ה-Cookies + Then ה-Cookies מסומנים HttpOnly ו-Secure + When אין פעילות במשך 30 דקות + Then הסשן פג תוקף ונדרש להתחבר מחדש + When אני מנסה פעולה רגישה ללא CSRF Token תקף + Then הפעולה נחסמת + diff --git a/functional_tests/roost_test_1766044895/roost_test_1766044895.json b/functional_tests/roost_test_1766044895/roost_test_1766044895.json new file mode 100644 index 0000000..5e67f37 --- /dev/null +++ b/functional_tests/roost_test_1766044895/roost_test_1766044895.json @@ -0,0 +1,434 @@ +{ + "scenarios": [ + { + "type": "functional", + "title": "מסע משתמש מלא: גלישה לקטגוריה, בחירת מוצר, עגלה ותשלום עם ולידציות שגיאה", + "description": "בדיקת תהליך קניה מקצה לקצה לפי התסריט: לחיצה על SHOP NOW בקטגוריית Latest Eyewear For You, מעבר לעמוד 2, בחירת Red Hoodie, הוספה לעגלה, צפייה בעגלה, בחירת שיטות משלוח, מעבר לצ'קאאוט, מילוי שדות, ניסיון הזמנה וקבלת שגיאות לפי השלבים.", + "testId": "TC-FUNC-001", + "testDescription": "כלקוח ישראלי (משלם בשקלים, שפה עברית, פריסה RTL) אני רוצה לבחור מוצר ולהשלים הזמנה כדי לקבל את ערך העסק: רכישה פשוטה ושקופה. התסריט כולל ולידציות שגיאה עבור חוסר בקוד דואר (מיקוד) ושיטת תשלום לא תקינה, בהתאם למסמך.", + "prerequisites": "גישה לאתר דרך הקישור המצוין; דפדפן Chrome/Firefox בשפה עברית, פריסה RTL; מערכת תשלום ושילוח פעילה בסביבת הבדיקה; מסד נתונים עם מוצר 'Red Hoodie' זמין במלאי ובקטגוריה הרלוונטית.", + "stepsToPerform": "1. גישה לדף הבית באמצעות הקישור: https://share.google/gX4PkITYxjSjISHwh.\n2. לאתר את הקטגוריה 'Latest Eyewear For You' ולחץ על הכפתור 'SHOP NOW'.\n3. בעמוד הקטגוריה, נווט לעמוד מספר 2 על ידי לחיצה על הספרה '2'.\n4. לחלופין, נווט לעמוד הבא על ידי לחיצה על חץ 'הבא' (Validate ששני המסלולים מגיעים לאותו עמוד).\n5. למצוא את המוצר 'Red Hoodie' ולהיכנס לעמוד המוצר באמצעות לחיצה על תמונת המוצר.\n6. חזור ותבצע כניסה באמצעות לחיצה על שם המוצר (Verify ששני המסלולים נכונים).\n7. בעמוד המוצר, לחץ על 'ADD TO CART'.\n8. לחץ על 'VIEW CART' למעבר לעמוד העגלה.\n9. בעמוד העגלה, לחץ על 'Local pickup' ובדוק שעודכן מחיר המשלוח ל-₪0 (או לפי ההגדרה) ושזמן אספקה מתעדכן.\n10. לחץ על 'Delivery Express' ובדוק שהמחיר מתעדכן (למשל ₪35-₪60) ושאומדן זמן האספקה מתעדכן.\n11. לחץ על 'Registered Mail' ובדוק שהמחיר מתעדכן (למשל ₪20-₪30) ושאומדן זמן האספקה מתעדכן.\n12. לחץ על 'PROCEED TO CHECKOUT' למעבר לצ'קאאוט.\n13. מלא את השדות המסומנים (SendKeys) מלבד Postcode/ZIP: שם פרטי: 'דנה', שם משפחה: 'כהן', כתובת: 'הרצל 10', עיר: 'תל אביב', טלפון: '0541234567', אימייל: 'dana@test.co.il'. אל תבחר שיטת תשלום עדיין.\n14. לחץ על 'PLACE ORDER'.\n15. ולידציה 1: בקבלת שגיאה עקב חוסר ב-Postcode/ZIP (מיקוד ישראלי 7 ספרות) – ודא שהודעת השגיאה בעברית, ברורה, ומדגישה שיש למלא מיקוד.\n16. הזן SendKeys לשדה Postcode/ZIP: '6777655'.\n17. לחץ שוב על 'PLACE ORDER'.\n18. ולידציה 2: קבלת שגיאה 'Invalid payment method' (שיטת תשלום לא תקינה/לא נבחרה) – ודא שההודעה בעברית, מונח סביר: 'שיטת תשלום לא תקינה' או 'יש לבחור שיטת תשלום'.", + "expectedResult": "המערכת מציגה את דף הקטגוריה הנכון, מאפשרת ניווט לעמוד 2 בשני מסלולים, מציגה את עמוד המוצר, מוסיפה לעגלה בהצלחה, מאפשרת צפייה בעגלה ובחירת שיטות משלוח; בצ'קאאוט מתקבלת שגיאה על מיקוד חסר; לאחר הזנת מיקוד מתקבלת שגיאה על שיטת תשלום לא תקינה; הודעות שגיאה הן בעברית, ברורות ומנחות לפעולה מתקנת." + }, + { + "type": "functional", + "title": "מסע משתמש מלא: הזמנה מוצלחת עם תשלום תקין", + "description": "בדיקת הזמנה מקצה לקצה עד להצלחה עם שיטת תשלום תקינה בהתאם לתקנות בנקאות ישראל ו-PCI DSS.", + "testId": "TC-FUNC-002", + "testDescription": "כלקוח בישראל אני רוצה להשלים רכישה עם אמצעי תשלום מקובל (כרטיס אשראי ישראלי) כדי לקבל אישור הזמנה ומספר הזמנה. כולל ולידציה של סכומים בשקלים, מיקוד 7 ספרות, וקבלת אימייל אישור.", + "prerequisites": "שיטת תשלום פעילה (Visa/MasterCard/Isracard), מוצר Red Hoodie במלאי, שרת אימייל בדיקות פעיל.", + "stepsToPerform": "1. כניסה לדף הבית ולחיצה על 'SHOP NOW' בקטגוריית Latest Eyewear For You.\n2. ניווט לעמוד 2 ולחיצה על 'Red Hoodie'.\n3. 'ADD TO CART' > 'VIEW CART'.\n4. בחר 'Delivery Express'. ודא שהעלות נראית בשקלים (₪).\n5. 'PROCEED TO CHECKOUT'.\n6. מלא: שם פרטי: 'יואב', שם משפחה: 'לוי', כתובת: 'בן גוריון 25', עיר: 'חיפה', טלפון: '0529876543', אימייל: 'yoav@example.com', Postcode/ZIP: '3276543'.\n7. בחר שיטת תשלום: 'Credit Card'.\n8. הזן פרטי אשראי בדמה: מספר: '4111111111111111', תוקף: '12/28', CVV: '123', ת.ז.: '123456789' (אם נדרש), שם בעל הכרטיס: 'יואב לוי'.\n9. לחץ 'PLACE ORDER'.\n10. אמת קבלת הודעת הצלחה, מספר הזמנה, וסיכום הזמנה עם פירוט מע\"מ (17%).\n11. אמת קבלת אימייל אישור בעברית עם פרטי ההזמנה ותאריך בפורמט ישראלי (dd/mm/yyyy) ושעה אזורית (Asia/Jerusalem).", + "expectedResult": "ההזמנה נקלטת בהצלחה, מופיע מספר הזמנה ייחודי, פרטי סכום כולל מע\"מ ב-₪, מתקבל אימייל אישור בעברית עם תאריך/שעה תקניים. אין הודעות שגיאה." + }, + { + "type": "functional", + "title": "ניווט חלופי לעמוד 2: מספר עמוד מול חץ 'הבא'", + "description": "בדיקת שני מסלולי ניווט לעמוד 2 של קטגוריה והבטחת עקביות בתוכן.", + "testId": "TC-FUNC-003", + "testDescription": "כמשתמש אני רוצה להגיע לעמוד 2 של רשימת מוצרים באמצעות שתי דרכים (מספר עמוד או חץ הבא) כדי להבטיח חוויית ניווט עקבית.", + "prerequisites": "קטגוריה עם יותר מעמוד אחד של מוצרים.", + "stepsToPerform": "1. היכנס לקטגוריה דרך 'SHOP NOW'.\n2. לחץ על '2' בניווט עמודים.\n3. רשום את רשימת המוצרים וה-URL.\n4. חזור לעמוד 1.\n5. לחץ על חץ 'הבא'.\n6. השווה את התוכן וה-URL לעומת שלב 3.", + "expectedResult": "שני המסלולים מציגים את אותו תוכן ורשימת מוצרים; ה-URL עקבי (למשל page=2) או תואם לסטנדרט האתר." + }, + { + "type": "functional", + "title": "בחירת מוצר באמצעות תמונה או שם", + "description": "אימות ששני אלמנטים אינטראקטיביים (תמונה ושם) מובילים לעמוד הפריט.", + "testId": "TC-FUNC-004", + "testDescription": "כמשתמש אני מצפה שלחיצה על תמונת מוצר או שמו תוביל לעמוד הפרטים של אותו מוצר.", + "prerequisites": "מוצר 'Red Hoodie' מוצג בקטגוריה.", + "stepsToPerform": "1. בעמוד הקטגוריה לחץ על תמונת 'Red Hoodie'.\n2. אמת מעבר לעמוד הפריט.\n3. חזור לקטגוריה.\n4. לחץ על שם 'Red Hoodie'.\n5. אמת מעבר לעמוד הפריט.", + "expectedResult": "שני מסלולי הלחיצה מובילים לעמוד המוצר הנכון ללא שגיאות." + }, + { + "type": "functional", + "title": "עדכון עגלה: הוספה, כמות, הסרה וחישוב סכומים בשקלים", + "description": "בדיקת ניהול עגלה ודיוק החישובים במטבע ₪, כולל מע\"מ.", + "testId": "TC-FUNC-005", + "testDescription": "כלקוח אני רוצה להוסיף מוצר, לשנות כמות, להסיר, ולראות חישובים נכונים בשקלים עם מע\"מ.", + "prerequisites": "מוצר זמין; מחיר מוגדר כולל/ללא מע\"מ לפי מדיניות.", + "stepsToPerform": "1. הוסף 'Red Hoodie' לעגלה.\n2. עבור ל'VIEW CART'.\n3. שנה כמות ל-2. לחץ 'Update Cart' אם קיים.\n4. אמת סכום ביניים (מחיר*כמות), מע\"מ (17%) אם מוצג, וסכום כולל.\n5. הסר את הפריט. אמת שעגלת הקניות ריקה ושאין עלות משלוח.", + "expectedResult": "חישובי הסכום מוצגים נכון בשקלים; שינוי הכמות והסרה פועלים כנדרש." + }, + { + "type": "functional", + "title": "בחירת שיטת משלוח והשפעתה על המחיר וזמן האספקה", + "description": "בדיקת השפעות של Local pickup, Delivery Express, Registered Mail על עלויות וזמנים.", + "testId": "TC-FUNC-006", + "testDescription": "כלקוח אני רוצה לבחור בין שיטות משלוח שונות כדי להבין עלויות וזמני אספקה מתאימים בישראל.", + "prerequisites": "תעריפי משלוח מוגדרים; מדיניות זמני אספקה מתועדת.", + "stepsToPerform": "1. הוסף מוצר לעגלה.\n2. בעמוד העגלה, בחר 'Local pickup'.\n3. אמת עלות משלוח ותצוגת זמני איסוף (למשל 'איסוף מיידי מהחנות').\n4. בחר 'Delivery Express'.\n5. אמת עלות משלוח (למשל ₪35-₪60) וזמן אספקה (1-2 ימי עסקים).\n6. בחר 'Registered Mail'.\n7. אמת עלות משלוח (למשל ₪20-₪30) וזמן אספקה (3-7 ימי עסקים).", + "expectedResult": "כל בחירה מעדכנת את המחיר באלגנטיות ואת אומדן זמן האספקה בהתאם למדיניות בישראל." + }, + { + "type": "functional", + "title": "ולידציות שדות בצ'קאאוט: אימייל, טלפון, מיקוד ישראלי", + "description": "בדיקת ולידציות שדות חובה ושדות פורמט לפי נוהג ישראלי.", + "testId": "TC-FUNC-007", + "testDescription": "כמשתמש אני רוצה לקבל הודעות ברורות על שדות חובה ופורמטים לא תקינים (אימייל, טלפון, מיקוד 7 ספרות) כדי להשלים הזמנה בלי טעויות.", + "prerequisites": "טופס צ'קאאוט עם ולידציות צד לקוח/שרת.", + "stepsToPerform": "1. 'PROCEED TO CHECKOUT' עם עגלה לא ריקה.\n2. השאר שם פרטי ריק. לחץ 'PLACE ORDER'.\n3. אמת הודעת חובה על 'שם פרטי'.\n4. הזן אימייל לא תקין: 'user@wrong'. לחץ 'PLACE ORDER'.\n5. אמת הודעת פורמט אימייל.\n6. הזן טלפון לא תקין: '1234'. לחץ 'PLACE ORDER'.\n7. אמת הודעת פורמט טלפון ישראלי.\n8. הזן מיקוד קצר: '12345'. לחץ 'PLACE ORDER'.\n9. אמת הודעה על מיקוד ישראלי 7 ספרות.", + "expectedResult": "מוצגות הודעות שגיאה בעברית, ברורות וממוקמות ליד השדות; אין ביצוע הזמנה עד תיקון הנתונים." + }, + { + "type": "functional", + "title": "קופון הנחה: החלה וביטול, קופון לא תקין", + "description": "בדיקת החלת קופון, חישוב הנחה וביטול, והודעות לקופון לא תקין/פג תוקף.", + "testId": "TC-FUNC-008", + "testDescription": "כלקוח אני רוצה להחיל קופון הנחה ולקבל חישוב מדויק בשקלים, וכן לקבל הודעות לקופון שגוי.", + "prerequisites": "קופון תקף: 'SALE10' (10% הנחה); קופון פג תוקף: 'OLD5'.", + "stepsToPerform": "1. הוסף מוצר לעגלה.\n2. הזן קופון 'SALE10'. לחץ 'Apply'.\n3. אמת ירידת המחיר ב-10%.\n4. בטל קופון. אמת חזרה למחיר מלא.\n5. הזן 'OLD5'. לחץ 'Apply'.\n6. אמת הודעה: 'קופון פג תוקף' או 'קופון לא תקין'.", + "expectedResult": "הנחה מיושמת ומחושבת נכון; הודעות לקופון לא תקין הן ברורות בעברית." + }, + { + "type": "functional", + "title": "תשלום באמצעי ישראלי: ישראכרט ודיינרס", + "description": "בדיקת תמיכה בכרטיסים מקומיים נפוצים וולידציות תוקף/CVV/ת\"ז.", + "testId": "TC-FUNC-009", + "testDescription": "כלקוח בישראל אני מצפה לתמיכה בכרטיסי ישראכרט ודיינרס, עם ולידציות תקינות ותצוגת שגיאות בעברית.", + "prerequisites": "שער תשלום תומך ישראכרט/דיינרס בסביבת בדיקות.", + "stepsToPerform": "1. בצ'קאאוט, בחר 'Credit Card'.\n2. הזן מספר ישראכרט בדמה: '4580000000000000', תוקף: '05/27', CVV: '123', ת\"ז: '123456782'.\n3. לחץ 'PLACE ORDER'.\n4. אמת תגובת הצלחה או שגיאה מבוקרת בהתאם להגדרות הסביבה.\n5. חזור והזמן עם דיינרס: '30000000000004', תוקף: '11/26', CVV: '123'.\n6. אמת התנהגות תקינה של השער.", + "expectedResult": "המערכת מקבלת/דוחה בהתאם להגדרות; הודעות בעברית, אין חשיפת פרטי כרטיס מלאים." + }, + { + "type": "functional", + "title": "תשלום ב-PayPal (אם קיים) וחזרה לאתר", + "description": "בדיקת אינטגרציה עם PayPal, הרשאה, וחזרה לסיכום הזמנה.", + "testId": "TC-FUNC-010", + "testDescription": "כמשתמש אני רוצה לשלם ב-PayPal ולהיות מנותב חזרה עם אישור הזמנה.", + "prerequisites": "אינטגרציית PayPal מופעלת בסביבת בדיקות.", + "stepsToPerform": "1. בצ'קאאוט, בחר 'PayPal'.\n2. אמת ניתוב לעמוד PayPal.\n3. בצע כניסה לחשבון בדמה ואשר תשלום.\n4. אמת חזרה לאתר עם סטטוס 'אישור' וסיכום הזמנה.", + "expectedResult": "תהליך PayPal מסתיים בהצלחה; הלקוח חוזר לאתר עם מספר הזמנה." + }, + { + "type": "functional", + "title": "אורח מול משתמש רשום: צ'קאאוט ושמירת פרטים", + "description": "בדיקת צ'קאאוט כאורח לעומת משתמש רשום ושמירת פרטי משלוח לתיעוד עתידי.", + "testId": "TC-FUNC-011", + "testDescription": "כלקוח רשום אני רוצה להשתמש בפרטים שמורים; כאורח אני רוצה להזמין ללא יצירת חשבון.", + "prerequisites": "חשבון בדמה: 'noa@example.com' עם כתובת שמורה.", + "stepsToPerform": "1. בצ'קאאוט כאורח: מלא כל הפרטים והזמן. אמת שאין צורך בחשבון.\n2. התנתק/נקה עוגיות.\n3. היכנס לחשבון 'noa@example.com'.\n4. בצ'קאאוט, אמת שהפרטים נטענים אוטומטית.\n5. עדכן כתובת ושמור. אמת שהכתובת החדשה נשמרה לפרופיל.", + "expectedResult": "אורח יכול להזמין בקלות; משתמש רשום מקבל פרטים שמורים ועדכון נשמר." + }, + { + "type": "functional", + "title": "רכישת מוצר ללא מלאי: מניעת הזמנה", + "description": "בדיקת התנהגות מוצר Out of Stock ומניעת הוספה לעגלה.", + "testId": "TC-FUNC-012", + "testDescription": "כמשתמש אני מצפה שלא ניתן להזמין מוצר שאינו במלאי ושאקבל הודעה ברורה.", + "prerequisites": "מוצר בדמה שאינו במלאי.", + "stepsToPerform": "1. פתח מוצר Out of Stock.\n2. נסה ללחוץ 'ADD TO CART'.\n3. אמת שהכפתור מושבת/הודעת 'אין במלאי'.", + "expectedResult": "אין הוספה לעגלה; הודעה בעברית, ברורה ומסבירה." + }, + { + "type": "functional", + "title": "מיקוד ישראלי: ולידציה 7 ספרות וסיוע למשתמש", + "description": "בדיקת דרישת 7 ספרות והצגת טיפ/קישור לחיפוש מיקוד.", + "testId": "TC-FUNC-013", + "testDescription": "כמשתמש בישראל אני מצפה לשליחת מיקוד 7 ספרות ולהכוונה במקרה חוסר ידע.", + "prerequisites": "טופס צ'קאאוט עם שדה Postcode/ZIP.", + "stepsToPerform": "1. הזן '123456' (6 ספרות).\n2. לחץ 'PLACE ORDER'.\n3. אמת הודעת שגיאה: 'יש להזין מיקוד בן 7 ספרות'.\n4. אמת קיום עזרה (למשל קישור לאתר דואר ישראל).", + "expectedResult": "ולידציה נכונה; עזרה למשתמש זמינה ומועילה." + }, + { + "type": "functional", + "title": "הודעות אימייל: אישור הזמנה ושחזור עגלה", + "description": "בדיקת משלוח אימיילים בעברית עם פרטי מע\"מ ותאריך ישראלי.", + "testId": "TC-FUNC-014", + "testDescription": "כלקוח אני רוצה לקבל אימייל אישור בעברית עם פרטי הזמנה וחשבונית מתאימה למע\"מ.", + "prerequisites": "שרת SMTP בדיקות; תבניות אימייל בעברית.", + "stepsToPerform": "1. בצע הזמנה מוצלחת.\n2. אמת קבלת אימייל אישור בעברית: תאריך dd/mm/yyyy, סכומים ב-₪, פירוט מע\"מ.\n3. אמת קישור לשחזור עגלה/הזמנה אם קיים.", + "expectedResult": "אימיילים נשלחים בזמן, בעברית, עם מידע מלא ומדויק." + }, + { + "type": "functional", + "title": "ממשק בעברית ו-RTL: יישור, סימון שדות, תוויות", + "description": "בדיקת חוויית משתמש בעברית: יישור לימין, טקסטים תקינים, תוויות ליד שדות.", + "testId": "TC-FUNC-015", + "testDescription": "כמשתמש דובר עברית אני מצפה לממשק RTL תקני בכל הדפים המרכזיים.", + "prerequisites": "ממשק בעברית פעיל.", + "stepsToPerform": "1. בדוק דף הבית: יישור לימין, כותרות בעברית, כפתורים.\n2. בדוק עמוד קטגוריה, מוצר, עגלה, צ'קאאוט.\n3. אמת שאין ערבוב כיוונים (LTR/RTL) שגורם לשבירה.\n4. אמת טקסטים בעברית ללא שגיאות כתיב.", + "expectedResult": "ממשק RTL עקבי, תוויות/מיקומי טקסטים נכונים בעברית." + }, + { + "type": "functional", + "title": "מניעת הזמנה כפולה על קליק כפול ב-'PLACE ORDER'", + "description": "בדיקת אידמפוטנטיות בהזמנה בעת לחיצה כפולה ומניעת חיוב כפול.", + "testId": "TC-FUNC-016", + "testDescription": "כלקוח אני רוצה להיות בטוח שלחיצה כפולה/רענון לא יוצרים הזמנה כפולה.", + "prerequisites": "שער תשלום תומך מזהה עסקה ייחודי; מנגנון Anti-duplicate.", + "stepsToPerform": "1. מלא צ'קאאוט.\n2. לחץ פעמיים במהירות על 'PLACE ORDER'.\n3. אמת שנוצרה רק הזמנה אחת.\n4. אמת שאין חיוב כפול.", + "expectedResult": "המערכת מונעת כפילות הזמנה וחיוב." + }, + { + "type": "functional", + "title": "עדכון מלאי לאחר הזמנה", + "description": "בדיקת הפחתת מלאי מוצר לאחר הזמנה מוצלחת.", + "testId": "TC-FUNC-017", + "testDescription": "כאחראי מלאי אני רוצה לראות שמלאי המוצר מצטמצם אחרי רכישה.", + "prerequisites": "מלאי התחלתי ידוע לדמה.", + "stepsToPerform": "1. בדוק מלאי התחלתי של 'Red Hoodie'.\n2. בצע הזמנה של יחידה אחת.\n3. בדוק מלאי חדש.\n4. אמת ירידה בהתאם.", + "expectedResult": "מלאי מתעדכן אוטומטית בהתאם להזמנה." + }, + { + "type": "functional", + "title": "מדיניות החזרות וביטול הזמנה", + "description": "בדיקת יכולת ביטול/החזר לפי תקנות הגנת הצרכן בישראל.", + "testId": "TC-FUNC-018", + "testDescription": "כלקוח אני רוצה לבטל הזמנה במסגרת הזמן ולראות החזר בהתאם למדיניות.", + "prerequisites": "מדיניות החזרות פעילה; הזמנה במצב 'ממתינה'.", + "stepsToPerform": "1. בצע הזמנה.\n2. פתח מסך הזמנה ובחר 'בטל הזמנה'.\n3. אמת סטטוס השתנה ל'בוטלה' ומייל נשלח.\n4. אמת יצירת החזר לפי אמצעי תשלום.", + "expectedResult": "ביטול מתועד, החזר מטופל לפי התקנות והמדיניות." + }, + { + "type": "functional", + "title": "סכום מע\"מ והצגה בסיכום הזמנה", + "description": "בדיקת חישוב והצגת מע\"מ 17% בסכום כולל ובחשבונית.", + "testId": "TC-FUNC-019", + "testDescription": "כמשתמש אני מצפה לראות פירוט מע\"מ בסיכום ההזמנה והחשבונית.", + "prerequisites": "מדיניות מחירים כוללת/לא כוללת מע\"מ מוגדרת.", + "stepsToPerform": "1. הוסף מוצר לעגלה.\n2. עבור לצ'קאאוט והזמן.\n3. אמת בסיכום/חשבונית את פירוט המע\"מ (סכום וסף).", + "expectedResult": "פירוט מע\"מ מוצג כנדרש; סכומים מדויקים." + }, + { + "type": "functional", + "title": "בחירת נקודת איסוף (Local pickup) והסרת שדות כתובת", + "description": "בדיקת התאמת הטופס כאשר נבחר איסוף מקומי – כתובת אינה חובה.", + "testId": "TC-FUNC-020", + "testDescription": "כלקוח שבוחר איסוף מקומי אני לא רוצה להיות חייב להזין כתובת מלאה.", + "prerequisites": "שיטת משלוח Local pickup זמינה.", + "stepsToPerform": "1. בחר בעגלה 'Local pickup'.\n2. בצ'קאאוט, נסה להזמין ללא הזנת כתובת.\n3. אמת שאין שגיאה על שדה כתובת.\n4. אמת הצגת כתובת החנות/שעות איסוף.", + "expectedResult": "הזמנה אפשרית ללא כתובת; מידע איסוף מוצג." + }, + { + "type": "functional", + "title": "עדכון מדיניות זמן אספקה לפי עיר בישראל", + "description": "בדיקת שונות זמן אספקה ועלות לפי עיר (מרכז/פריפריה).", + "testId": "TC-FUNC-021", + "testDescription": "כלקוח אני מצפה לזמן אספקה ריאלי בהתאם למיקום בישראל.", + "prerequisites": "טבלת שילוח לפי ערים/אזורים.", + "stepsToPerform": "1. הזן עיר: 'תל אביב' ובחר 'Delivery Express'.\n2. אמת זמן אספקה: 1-2 ימי עסקים.\n3. הזן עיר: 'מטולה'.\n4. אמת זמן אספקה: 2-4 ימי עסקים.", + "expectedResult": "זמני אספקה משתנים בהתאם לעיר; שקיפות מלאה ללקוח." + }, + { + "type": "functional", + "title": "שמירת עגלה בין מכשירים וסשנים", + "description": "בדיקת התמדה של עגלה עבור משתמש רשום בין דסקטופ ומובייל.", + "testId": "TC-FUNC-022", + "testDescription": "כמשתמש רשום אני רוצה שהעגלה שלי תישמר כשאני מתחבר ממכשיר אחר.", + "prerequisites": "משתמש רשום; סנכרון עגלה בצד שרת.", + "stepsToPerform": "1. התחבר בדסקטופ והוסף פריט לעגלה.\n2. התנתק.\n3. התחבר במובייל.\n4. אמת שהעגלה מסונכרנת עם הפריט.", + "expectedResult": "העגלה נשמרת ומסונכרנת בין מכשירים." + }, + { + "type": "non-functional", + "title": "ביצועים: זמן טעינת דף הבית והקטגוריה", + "description": "מדידת זמן טעינה תחת עומס רגיל ושיא.", + "testId": "TC-NF-001", + "testDescription": "כארגון אנו רוצים זמנים מהירים כדי לשפר חוויית משתמש. מדוד TTFB ו-FCP עבור דף הבית וקטגוריה.", + "prerequisites": "כלי ניטור ביצועים (Lighthouse/WebPageTest); סביבת בדיקות יציבה.", + "stepsToPerform": "1. מדוד זמן טעינה דף הבית ב-3 ריצות: יעד < 2 שניות ל-FCP.\n2. מדוד דף קטגוריה: יעד < 2.5 שניות.\n3. בעומס 200 משתמשים סימולטניים, מדוד ממוצע ומקסימום.\n4. תעד סטיות.", + "expectedResult": "עמידה ביעדים: FCP בית < 2s, קטגוריה < 2.5s; תחת עומס, לא יותר מ-20% ירידה בביצועים." + }, + { + "type": "non-functional", + "title": "סקיילביליות: צ'קאאוט תחת עומס עולה", + "description": "בדיקת יכולת טיפול ב-100, 500, 1000 משתמשים בו-זמנית.", + "testId": "TC-NF-002", + "testDescription": "כמערכת אנו רוצים סקיילביליות ללא כשלים בפיקי קניות (חגים בישראל).", + "prerequisites": "כלי בדיקות עומס (JMeter/K6); נתוני דמה.", + "stepsToPerform": "1. הרץ תרחיש צ'קאאוט מלא ל-100 משתמשים.\n2. העלה ל-500 ול-1000.\n3. מדוד אחוזי כשל, זמן תגובה ממוצע, קצבי עיבוד.\n4. בדוק תורי תשלום/מסד.", + "expectedResult": "אחוזי כשל < 1%; זמן תגובה לצ'קאאוט < 3s בממוצע עד 500; ירידה מבוקרת ב-1000 ללא קריסה." + }, + { + "type": "non-functional", + "title": "אבטחה: ולידציית קלט, XSS, SQL Injection", + "description": "בדיקת חסינות הטפסים מפני מתקפות שכיחות.", + "testId": "TC-NF-003", + "testDescription": "כמערכת אנו מחויבים לאבטחת מידע לפי חוק הגנת הפרטיות בישראל ו-PCI DSS.", + "prerequisites": "סביבת בדיקות מאובטחת; כלים לסריקות אבטחה.", + "stepsToPerform": "1. הזן בקלטי צ'קאאוט טקסט עם סקריפט: .\n2. הזן בקלטי חיפוש/כתובת מחרוזת SQL: ' OR 1=1 --.\n3. אמת סניטיזציה/הסקייפינג.\n4. בדוק שהודעת שגיאה כללית לא חושפת פרטי מערכת.", + "expectedResult": "אין הרצת קוד/דליפה; קלטים מנוקים; הודעות כלליות בטוחות." + }, + { + "type": "non-functional", + "title": "אבטחה: ניהול סשן וזמן תפוגה", + "description": "בדיקת ניתוק לאחר חוסר פעילות והגנה מפני חטיפת סשן.", + "testId": "TC-NF-004", + "testDescription": "כמערכת אנו דורשים ניהול סשן תקין, Cookies מאובטחים (HttpOnly/Secure), CSRF Tokens.", + "prerequisites": "משתמש רשום; בדיקת cookies headers.", + "stepsToPerform": "1. היכנס לחשבון.\n2. בדוק שה-cookies הם HttpOnly ו-Secure.\n3. השאר חוסר פעילות 30 דקות.\n4. אמת שהסשן פג תוקף ונדרש להתחבר מחדש.\n5. נסה פעולה רגישה ללא CSRF Token.\n6. אמת חסימה.", + "expectedResult": "ניהול סשן תקין; הגנה מפני CSRF; אין גישה ללא הרשאה." + }, + { + "type": "non-functional", + "title": "אבטחה: הצפנת תעבורה ועמידה ב-PCI DSS", + "description": "בדיקת TLS 1.2+, HSTS והפרדה בין נתוני כרטיס למערכת.", + "testId": "TC-NF-005", + "testDescription": "כמערכת תשלום אנו מחויבים ל-PCI DSS ולתקנות בנקאות ישראל.", + "prerequisites": "שרת בתצורת HTTPS; בדיקות SSL Labs.", + "stepsToPerform": "1. אמת שהאתר נגיש רק ב-HTTPS.\n2. בדוק תמיכת TLS 1.2/1.3.\n3. אמת HSTS מופעל.\n4. אמת שאין שמירת PAN מלא בלוגים/DB.\n5. בדוק Tokenization של פרטי כרטיס.", + "expectedResult": "תעבורה מוצפנת, HSTS פעיל, אין אחסון פרטי כרטיס בלתי מוצפן." + }, + { + "type": "non-functional", + "title": "אמינות: שחזור אחרי כשל בשער תשלום", + "description": "בדיקת יכולת retry והודעה ללקוח במקרה כשל זמני.", + "testId": "TC-NF-006", + "testDescription": "כמערכת אנו רוצים להציע ניסיון חוזר או מעבר לאמצעי תשלום חלופי.", + "prerequisites": "סימולציית כשל בשער תשלום.", + "stepsToPerform": "1. בצע צ'קאאוט עם תשלום שמדמה כשל זמני.\n2. אמת הודעה: 'תקלה זמנית בתשלום, נסה שוב או בחר אמצעי אחר'.\n3. לחץ 'Retry'.\n4. אמת הצלחה או המשך כשל מבוקר.", + "expectedResult": "המערכת מתאוששת; חוויית לקוח נשמרת; אין הזמנות כפולות." + }, + { + "type": "non-functional", + "title": "שימושיות: הודעות שגיאה בעברית ברורות ומנחות", + "description": "בדיקת איכות וניסוח הודעות שגיאה והנחיות לתיקון.", + "testId": "TC-NF-007", + "testDescription": "כמשתמש אני צריך לדעת מה לתקן ומה הפורמט הנדרש (למשל מיקוד 7 ספרות).", + "prerequisites": "ממשק בעברית מלא.", + "stepsToPerform": "1. גרום לשגיאות בטפסים (אמייל/טלפון/מיקוד).\n2. בדוק ניסוח, מיקום, והצגת ההודעות.\n3. בדוק קישורי עזרה אם קיימים.", + "expectedResult": "הודעות ברורות, מנחות, לא טכניות מדי; מקלות על תיקון." + }, + { + "type": "non-functional", + "title": "נגישות: תאימות לתקן ישראלי 5568 (WCAG 2.1 AA)", + "description": "בדיקת נגישות עבור קוראי מסך, ניווט מקלדת וניגודיות.", + "testId": "TC-NF-008", + "testDescription": "כאתר מסחרי בישראל אנו חייבים בנגישות לפי 5568/WCAG 2.1 AA.", + "prerequisites": "כלי נגישות (NVDA/JAWS, axe).", + "stepsToPerform": "1. בדוק תוויות aria לשדות.\n2. בדוק ניווט מקלדת מלא (Tab/Shift+Tab) לכל רכיב אינטראקטיבי.\n3. בדוק ניגודיות צבעים >= 4.5:1.\n4. בדוק טקסט אלטרנטיבי לתמונות מוצר.\n5. בדוק מיקוד נראה (focus).", + "expectedResult": "עמידה ב-WCAG 2.1 AA; כל הבדיקות עוברות ללא חסמי שימוש." + }, + { + "type": "non-functional", + "title": "תאימות: דפדפנים ומכשירים נפוצים בישראל", + "description": "בדיקת תמיכה ב-Chrome, Firefox, Safari, Edge; iOS/Android בעברית.", + "testId": "TC-NF-009", + "testDescription": "כאתר אנו רוצים חוויית שימוש עקבית בכל הדפדפנים והמכשירים.", + "prerequisites": "מכשירי בדיקה וטווח דפדפנים מעודכן.", + "stepsToPerform": "1. הרץ תרחיש קניה מלא ב-Chrome (RTL עברית).\n2. חזור ב-Firefox, Edge, Safari.\n3. בדוק במובייל: iOS Safari ו-Android Chrome.\n4. אמת RTL תקין בכל.", + "expectedResult": "חוויית שימוש אחידה; אין שבירות RTL; תפקוד מלא." + }, + { + "type": "non-functional", + "title": "אימות תאימות API לגרסאות עתידיות", + "description": "בדיקת תאימות לאחור/קדימה של שירותים (תשלום/משלוח).", + "testId": "TC-NF-010", + "testDescription": "כמערכת אנו דורשים חוזים יציבים מול שירותי צד ג'.", + "prerequisites": "סימולטורים לגרסאות API v1/v2.", + "stepsToPerform": "1. הרץ הזמנה מול API v1.\n2. הרץ מול API v2.\n3. אמת שהשדות הקריטיים (סכום, מטבע, מזהה עסקה) נשמרים.\n4. בדוק טיפול בשדות חדשים/חסרים.", + "expectedResult": "תאימות נשמרת; אין כשלים בגלל גרסאות שונות." + }, + { + "type": "non-functional", + "title": "ניהול ותפעול: לוגים, ניטור והתראות", + "description": "בדיקת לוגים מלאים ללא חשיפת PII והתראות על כשלים.", + "testId": "TC-NF-011", + "testDescription": "כצוות תפעול אנו רוצים לוגים מתועדים, ניטור וערוצי התראה.", + "prerequisites": "מערכת לוגים (ELK), ניטור (Prometheus), התראות (Slack/Email).", + "stepsToPerform": "1. בצע הזמנות מוצלחות ושגויות.\n2. בדוק לוגים: מזהה הזמנה, זמן, סטטוס; ללא אימייל/טלפון גלוי.\n3. גרום לשגיאת שער תשלום.\n4. אמת שנשלחת התראה לצוות.", + "expectedResult": "לוגים שימושיים, אנונימיים; התראות נשלחות על כשלים." + }, + { + "type": "non-functional", + "title": "אמינות: שחזור לאחר נפילת שירות משלוח", + "description": "בדיקת המשכיות עסקית כאשר שירות משלוח אינו זמין.", + "testId": "TC-NF-012", + "testDescription": "כמערכת אנו רוצים fallback לשיטת משלוח חלופית/מצב המתנה.", + "prerequisites": "יכולת סימולציית נפילה לשירות משלוח.", + "stepsToPerform": "1. השבת זמנית שירות 'Delivery Express'.\n2. בצע הזמנה.\n3. אמת שהמשתמש רואה הודעה על אי זמינות ויכול לבחור 'Registered Mail' או להמתין.\n4. השב את השירות ואמת חזרה לשגרה.", + "expectedResult": "המערכת מתמודדת עם נפילה; מציעה חלופות; אין קריסה." + }, + { + "type": "functional", + "title": "הוספת מוצר נוסף ובדיקת סך משלוח משוקלל", + "description": "בדיקת השפעת הוספת מוצר נוסף על עלות המשלוח (משקל/נפח).", + "testId": "TC-FUNC-023", + "testDescription": "כמשתמש אני מצפה שהמשלוח יתעדכן בהתאם לכמות/משקל.", + "prerequisites": "מוצרים עם מאפייני משקל/נפח בדמה.", + "stepsToPerform": "1. הוסף 'Red Hoodie' לעגלה.\n2. הוסף מוצר נוסף (למשל 'Blue Sunglasses').\n3. בחר 'Delivery Express'.\n4. אמת שהעלות מתעדכנת בהתאם לכללי התעריפים.", + "expectedResult": "עלות משלוח מחושבת נכון עבור מספר פריטים." + }, + { + "type": "functional", + "title": "הגנה מפני Race Condition בעדכון מלאי", + "description": "בדיקת שני משתמשים שמזמינים את אותו פריט יחד – מניעת מכירה יתר.", + "testId": "TC-FUNC-024", + "testDescription": "כמערכת אנו רוצים מנגנון נעילה/טרנזקציה למניעת oversell.", + "prerequisites": "מלאי מוצר: 1 יחידה; שני משתמשים בדמה.", + "stepsToPerform": "1. משתמש A ומשתמש B מוסיפים פריט לעגלה במקביל.\n2. שניהם מנסים להזמין בו-זמנית.\n3. אמת שרק אחד מצליח; השני מקבל הודעה 'המוצר אינו זמין'.", + "expectedResult": "אין מכירה יתר; הודעה ברורה למשתמש שלא הצליח." + }, + { + "type": "functional", + "title": "תמיכה בעברית בשדות כתובת: תווים מיוחדים ושמות רחובות", + "description": "בדיקת הזנת כתובת בעברית עם גרשיים, מקף, מספרי דירה.", + "testId": "TC-FUNC-025", + "testDescription": "כמשתמש בעברית אני מצפה לתמיכה בתווים כמו גרש ('), מקף (-), מספר/דירה.", + "prerequisites": "שדות כתובת ללא הגבלות מיותרות.", + "stepsToPerform": "1. הזן כתובת: \"הרב קוק 12/3 קומה 2-א'\".\n2. לחץ 'PLACE ORDER'.\n3. אמת שהמערכת מקבלת ומדפיסה सही בעברית.", + "expectedResult": "הכתובת מתקבלת; אין סינון שגוי של תווים חוקיים." + }, + { + "type": "functional", + "title": "התאמת שיטת תשלום לפי סכום הזמנה", + "description": "בדיקת חסימת שיטות תשלום מסוימות עבור סכומים נמוכים/גבוהים.", + "testId": "TC-FUNC-026", + "testDescription": "כמערכת אנו רוצים להציג רק שיטות רלוונטיות (למשל תשלומים מעל סכום מסוים).", + "prerequisites": "כללי תשלום לפי סכום.", + "stepsToPerform": "1. הזמנה בסכום קטן (₪10): אמת ששיטת 'תשלומים' מוסתרת.\n2. הזמנה בסכום גדול (₪1000): אמת ששיטת 'תשלומים' זמינה.", + "expectedResult": "נראות שיטות תשלום מותאמת לכללים העסקיים." + }, + { + "type": "non-functional", + "title": "הגנת פרטיות: תאימות לחוק הגנת הפרטיות בישראל", + "description": "בדיקת הסכמה לעיבוד נתונים, מדיניות פרטיות, ומינימיזציה של PII.", + "testId": "TC-NF-013", + "testDescription": "כמערכת אנו חייבים לבקש הסכמה ולצמצם איסוף פרטים אישיים.", + "prerequisites": "תיבת סימון הסכמה ומדיניות פרטיות מעודכנת.", + "stepsToPerform": "1. בצ'קאאוט, אמת תיבת סימון להסכמה לעיבוד נתונים.\n2. אמת קישור למדיניות פרטיות בעברית.\n3. בדוק שההזמנה לא דורשת פרטים מיותרים.\n4. בדוק אנונימיזציה בלוגים.", + "expectedResult": "עמידה בחוק; הסכמה מתועדת; איסוף PII מינימלי; לוגים אנונימיים." + }, + { + "type": "non-functional", + "title": "התאוששות משגיאות: הדרכה ברורה לתיקון", + "description": "בדיקת תהליך שחזור לאחר הודעות שגיאה ('Invalid payment method').", + "testId": "TC-NF-014", + "testDescription": "כמשתמש אני רוצה לדעת מה לעשות אחרי שגיאה בשיטת תשלום.", + "prerequisites": "ממשק הודעות שגיאה פעיל.", + "stepsToPerform": "1. גרום לשגיאת 'Invalid payment method' בתשלום.\n2. אמת שההודעה מציעה בחירה בשיטה אחרת/בדיקת פרטים.\n3. בחר שיטה אחרת והמשך.\n4. אמת הצלחה.", + "expectedResult": "ההודעה מנחה לפתרון; אפשר להמשיך בקלות." + }, + { + "type": "non-functional", + "title": "אמינות: שמירת הזמנה והמשך מאוחר יותר", + "description": "בדיקת שמירת פרטי הזמנה לא גמורה והמשך תהליך מאוחר יותר.", + "testId": "TC-NF-015", + "testDescription": "כמשתמש אני רוצה להמשיך הזמנה מהמקום שהפסקתי.", + "prerequisites": "מנגנון 'שמור צ'קאאוט' למשתמשים רשומים.", + "stepsToPerform": "1. מלא חלק מהשדות.\n2. צא מהדף/התנתק.\n3. חזור לחשבון.\n4. אמת שחזרה לטופס עם שדות שמורים.", + "expectedResult": "פרטים נשמרים; קל להמשיך את התהליך." + }, + { + "type": "non-functional", + "title": "פריסת תצורה ו-Feature Flags לשיטות משלוח", + "description": "בדיקת יכולת הפעלה/כיבוי שיטות משלוח ללא פריסה מלאה.", + "testId": "TC-NF-016", + "testDescription": "כצוות פיתוח אנו רוצים לנהל פיצ'רים דרך דגלים תצורתיים.", + "prerequisites": "מערכת Feature Flags פעילה.", + "stepsToPerform": "1. כבה 'Registered Mail' בדגל.\n2. רענן העגלה.\n3. אמת שהשיטה אינה מוצגת.\n4. הפעל מחדש.\n5. אמת שהיא מוצגת שוב.", + "expectedResult": "ניהול תצורה דינמי; אין צורך בפריסה מחדש." + }, + { + "type": "non-functional", + "title": "אבטחה: מניעת קליטת תשלומים ללא 3D Secure (אם נדרש)", + "description": "בדיקת דרישת 3DS עבור עסקאות מעל סף מסוים.", + "testId": "TC-NF-017", + "testDescription": "בהתאם לנוהלי בנקים בישראל, עסקאות מסוימות דורשות אימות 3DS.", + "prerequisites": "שער תשלום עם 3DS סימולציה.", + "stepsToPerform": "1. בצע הזמנה בסכום גבוה (₪1500).\n2. אמת הפניית 3DS ואימות OTP.\n3. סיים תשלום.\n4. בצע הזמנה בסכום נמוך (₪100).\n5. אמת שאפשר ללא 3DS (לפי מדיניות).", + "expectedResult": "3DS נדרש בהתאם לכללים; חוויית אימות תקינה." + } + ] +} \ No newline at end of file diff --git a/functional_tests/roost_test_1766044895/roost_test_1766044895.xlsx b/functional_tests/roost_test_1766044895/roost_test_1766044895.xlsx new file mode 100644 index 0000000..7e81213 Binary files /dev/null and b/functional_tests/roost_test_1766044895/roost_test_1766044895.xlsx differ diff --git a/functional_tests/roost_test_1766044895/roost_test_1766044895.yaml b/functional_tests/roost_test_1766044895/roost_test_1766044895.yaml new file mode 100644 index 0000000..d26e517 --- /dev/null +++ b/functional_tests/roost_test_1766044895/roost_test_1766044895.yaml @@ -0,0 +1,1058 @@ +openapi: 3.0.3 +info: + title: ממשק API לחנות אונליין - ישראל (ILS, RTL, אבטחה ועמידה בתקנים) + version: 1.0.0 + description: > + מפרט OpenAPI עבור תרחישי ה-API המתוארים (הזמנות, מלאי, משלוח, דגלי תכונה, תשלומים, אימיילים, תאימות בין גרסאות). + כל ההודעות למשתמש והדוגמאות מותאמות לשפה העברית, מטבע ILS (₪), ומדיניות מע"מ 17%. +servers: + - url: https://api.sandbox.example.com + description: סביבת סנדבוקס (מומלץ להגדיר API_BASE_URL בסביבה) + - url: https://{host} + description: שרת דינמי לפי סביבה (שימוש במשתנה API_BASE_URL) + variables: + host: + default: api.sandbox.example.com +tags: + - name: הזמנות + description: ניהול הזמנות, יצירה, ביטול ואידמפוטנטיות + - name: מלאי + description: קריאת מלאי ומניעת מכירה יתר + - name: משלוח + description: תעריפים, זמני אספקה וספקי משלוח + - name: דגלים + description: ניהול Feature Flags לשיטות משלוח ותכונות + - name: תשלומים + description: חיוב תשלומים, כשל זמני, 3DS + - name: מייל + description: תיבת דואר בדיקות לאימות מיילי אישור + - name: תאימות + description: תאימות חוזים בין גרסאות API (v1/v2) +security: + - bearerAuth: [] +paths: + /api/orders: + post: + tags: [הזמנות] + summary: יצירת הזמנה חדשה (תומך Idempotency-Key) + description: > + יוצר הזמנה עם פריטי סל, משלוח ותשלום. תומך אידמפוטנטיות באמצעות כותרת Idempotency-Key למניעת יצירת הזמנה כפולה. + הודעות שגיאה מוצגות בעברית בהתאם ל-Accept-Language (למשל he-IL). + operationId: createOrder + parameters: + - $ref: '#/components/parameters/IdempotencyKey' + - $ref: '#/components/parameters/AcceptLanguage' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/OrderCreateRequest' + examples: + successCreditCard: + summary: הזמנה ILS עם כרטיס אשראי (דמה) + value: + customer: + firstName: "דנה" + lastName: "כהן" + email: "dana@test.co.il" + phone: "0541234567" + shipping: + method: "delivery_express" + address: + street: "הרצל 10" + city: "תל אביב" + postcode: "6777655" + country: "IL" + items: + - sku: "RED-HOODIE" + qty: 1 + price: 199.00 + currency: "ILS" + currency: "ILS" + payment: + method: "credit_card" + token: "tok_test_ok" + responses: + '201': + description: הזמנה נוצרה בהצלחה (כולל פרטי עסקה, מע"מ 17% ומטבע ILS) + headers: + Idempotency-Key: + description: מוחזר כאשר נשלחה בקשה עם Idempotency-Key + schema: + type: string + Idempotent-Replayed: + description: אמת אם הוחזרה תשובה מאוחסנת בעקבות Idempotency-Key קיים + schema: + type: boolean + content: + application/json: + schema: + $ref: '#/components/schemas/Order' + examples: + created: + value: + orderId: "ORD-20250001" + number: "100045" + status: "paid" + currency: "ILS" + amount: 232.83 + totals: + subtotal: 199.00 + shipping: 29.00 + tax: + type: "VAT" + rate: 0.17 + amount: 33.83 + items: + - sku: "RED-HOODIE" + name: "Red Hoodie" + qty: 1 + unitPrice: + amount: 199.00 + currency: "ILS" + lineTotal: + amount: 199.00 + currency: "ILS" + shipping: + method: "delivery_express" + eta: "1-2 ימי עסקים" + address: + street: "הרצל 10" + city: "תל אביב" + postcode: "6777655" + country: "IL" + customer: + firstName: "דנה" + lastName: "כהן" + email: "dana@test.co.il" + phone: "0541234567" + payment: + method: "credit_card" + transactionId: "TRX-abc123" + last4: "1111" + createdAt: "2025-12-18T10:22:30Z" + locale: "he-IL" + '400': + description: בקשה שגויה או ולידציה נכשלה (למשל מיקוד לא תקין) + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + examples: + invalidPostcode: + value: + code: "validation_error" + message: "יש להזין מיקוד בן 7 ספרות" + fields: + shipping.address.postcode: "format: ^\\d{7}$" + '401': + description: טוקן הרשאה חסר/שגוי + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + '409': + description: קונפליקט מלאי / מניעת מכירה יתר + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + examples: + oversell: + value: + code: "inventory_conflict" + message: "המוצר אינו זמין" + '422': + description: שיטת תשלום לא תקינה או לא נבחרה + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + examples: + invalidPaymentMethod: + value: + code: "invalid_payment_method" + message: "שיטת תשלום לא תקינה או לא נבחרה" + /api/orders/{orderId}/cancel: + post: + tags: [הזמנות] + summary: ביטול הזמנה קיימת והחזר לפי מדיניות + operationId: cancelOrder + parameters: + - $ref: '#/components/parameters/AcceptLanguage' + - name: orderId + in: path + required: true + schema: + type: string + description: מזהה הזמנה (למשל ORD-123) + requestBody: + required: true + content: + application/json: + schema: + type: object + required: [reason] + properties: + reason: + type: string + description: סיבת ביטול (למשל "לקוח ביקש") + examples: + cancel: + value: + reason: "לקוח ביקש" + responses: + '200': + description: הזמנה בסטטוס canceled ונוצר רישום החזר + content: + application/json: + schema: + type: object + properties: + order: + $ref: '#/components/schemas/Order' + refund: + $ref: '#/components/schemas/Refund' + examples: + canceled: + value: + order: + orderId: "ORD-123" + status: "canceled" + currency: "ILS" + refund: + refundId: "RF-987" + method: "credit_card" + amount: + amount: 199.00 + currency: "ILS" + status: "initiated" + '404': + description: הזמנה לא נמצאה + '409': + description: לא ניתן לבטל הזמנה במצב נוכחי + /api/inventory/products/{sku}: + get: + tags: [מלאי] + summary: קריאת נתוני מלאי למוצר לפי SKU + operationId: getInventoryBySku + parameters: + - name: sku + in: path + required: true + schema: + type: string + example: RED-HOODIE + - $ref: '#/components/parameters/AcceptLanguage' + responses: + '200': + description: נתוני מלאי למוצר + content: + application/json: + schema: + $ref: '#/components/schemas/InventoryProduct' + examples: + stock: + value: + sku: "RED-HOODIE" + onHand: 12 + reserved: 1 + updatedAt: "2025-12-18T09:00:00Z" + '404': + description: מוצר לא נמצא + /api/shipping/rates: + post: + tags: [משלוח] + summary: חישוב עלויות משלוח ו-ETA לפי עיר, מדינה ותכולת הסל + operationId: getShippingRates + parameters: + - $ref: '#/components/parameters/AcceptLanguage' + requestBody: + required: true + content: + application/json: + schema: + type: object + required: [country, items] + properties: + city: + type: string + description: עיר בישראל לצורך ETA + country: + type: string + enum: [IL] + methods: + type: array + description: סינון לשיטות ספציפיות + items: + $ref: '#/components/schemas/ShippingMethodId' + items: + type: array + minItems: 1 + items: + type: object + required: [sku, qty] + properties: + sku: + type: string + qty: + type: integer + minimum: 1 + weight: + type: number + format: float + description: ק"ג + examples: + tel_aviv: + value: + city: "תל אביב" + country: "IL" + methods: ["delivery_express"] + items: + - sku: "RED-HOODIE" + qty: 1 + weight: 0.5 + responses: + '200': + description: רשימת תעריפי משלוח זמינים (ILS, ETA בעברית) + content: + application/json: + schema: + type: object + properties: + rates: + type: array + items: + $ref: '#/components/schemas/ShippingRate' + warnings: + type: array + items: + type: string + description: אזהרות/אלטרנטיבות (למשל כאשר ספק מושבת) + examples: + express_ta: + value: + rates: + - method: "delivery_express" + label: "שליח אקספרס" + eta: "1-2 ימי עסקים" + price: + amount: 45.00 + currency: "ILS" + express_disabled_with_fallback: + summary: ספק express מושבת, מוצעת חלופה + value: + rates: + - method: "registered_mail" + label: "דואר רשום" + eta: "3-7 ימי עסקים" + price: + amount: 25.00 + currency: "ILS" + warnings: + - "שירות delivery_express אינו זמין זמנית. מוצגת חלופה." + '400': + description: נתונים חסרים או לא תקינים + /api/shipping/methods: + get: + tags: [משלוח] + summary: רשימת שיטות משלוח זמינות למדינה + parameters: + - name: country + in: query + required: true + schema: + type: string + enum: [IL] + - $ref: '#/components/parameters/AcceptLanguage' + responses: + '200': + description: רשימת מזהי שיטות משלוח + content: + application/json: + schema: + type: object + properties: + methods: + type: array + items: + $ref: '#/components/schemas/ShippingMethodId' + examples: + il_default: + value: + methods: ["local_pickup", "delivery_express", "registered_mail"] + /api/flags/{flag}/disable: + post: + tags: [דגלים] + summary: כיבוי Feature Flag + parameters: + - name: flag + in: path + required: true + schema: + type: string + example: registered_mail + responses: + '200': + description: הדגל כובה + content: + application/json: + schema: + type: object + properties: + flag: + type: string + enabled: + type: boolean + examples: + disabled: + value: + flag: "registered_mail" + enabled: false + /api/flags/{flag}/enable: + post: + tags: [דגלים] + summary: הפעלת Feature Flag + parameters: + - name: flag + in: path + required: true + schema: + type: string + example: registered_mail + responses: + '200': + description: הדגל הופעל + content: + application/json: + schema: + type: object + properties: + flag: + type: string + enabled: + type: boolean + examples: + enabled: + value: + flag: "registered_mail" + enabled: true + /api/shipping/providers/{provider}/disable: + post: + tags: [משלוח] + summary: השבתה זמנית של ספק משלוח + parameters: + - name: provider + in: path + required: true + schema: + type: string + example: delivery_express + responses: + '200': + description: הספק הושבת + content: + application/json: + schema: + $ref: '#/components/schemas/ProviderStatus' + examples: + disabled: + value: + provider: "delivery_express" + enabled: false + message: "הספק הושבת זמנית" + /api/shipping/providers/{provider}/enable: + post: + tags: [משלוח] + summary: הפעלה מחדש של ספק משלוח + parameters: + - name: provider + in: path + required: true + schema: + type: string + example: delivery_express + responses: + '200': + description: הספק הופעל + content: + application/json: + schema: + $ref: '#/components/schemas/ProviderStatus' + examples: + enabled: + value: + provider: "delivery_express" + enabled: true + message: "הספק פעיל" + /api/payments/charge: + post: + tags: [תשלומים] + summary: חיוב תשלום (כרטיס אשראי/אחר), תמיכה ב-Retry ו-3DS + description: > + נקודת קצה לצורך חיוב ישיר. עבור סכומים/תנאים מסוימים ייתכן וידרש 3DS. עבור אסימוני סימולציה יוחזר כשל זמני לצורך בדיקות Retry. + operationId: chargePayment + parameters: + - $ref: '#/components/parameters/AcceptLanguage' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/ChargeRequest' + examples: + tempFailure: + summary: סימולציית כשל זמני + value: + amount: 299.00 + currency: "ILS" + method: "credit_card" + token: "tok_simulate_temporary_failure" + requires3ds: + summary: עסקה הדורשת 3DS + value: + amount: 1500.00 + currency: "ILS" + method: "credit_card" + token: "tok_requires_3ds" + responses: + '201': + description: חיוב נוצר בהצלחה + content: + application/json: + schema: + $ref: '#/components/schemas/Charge' + examples: + charged: + value: + chargeId: "CHG-001" + status: "succeeded" + amount: + amount: 299.00 + currency: "ILS" + transactionId: "TRX-xyz789" + '402': + description: נדרש 3D Secure (הפניה ל-ACS/OTP) + content: + application/json: + schema: + type: object + properties: + code: + type: string + example: requires_3ds + message: + type: string + example: "נדרש אימות 3D Secure" + redirectUrl: + type: string + format: uri + '503': + description: תקלה זמנית בשער תשלום (Retry-After) + headers: + Retry-After: + description: שניות להמתין לפני נסיון חוזר + schema: + type: integer + example: 5 + content: + application/json: + schema: + $ref: '#/components/schemas/Error' + examples: + tempFailure: + value: + code: "payment_temporary_failure" + message: "תקלה זמנית בתשלום, נסה שוב או בחר אמצעי אחר" + /api/test/mailbox/search: + get: + tags: [מייל] + summary: חיפוש מיילי אישור הזמנה בסביבת בדיקות + parameters: + - name: orderId + in: query + required: true + schema: + type: string + example: ORD-200 + - name: locale + in: query + required: false + schema: + type: string + example: he-IL + - $ref: '#/components/parameters/AcceptLanguage' + responses: + '200': + description: הודעות שנמצאו + content: + application/json: + schema: + type: object + properties: + messages: + type: array + items: + $ref: '#/components/schemas/EmailMessage' + examples: + approvalHe: + value: + messages: + - id: "MSG-1" + orderId: "ORD-200" + subject: "אישור הזמנה ORD-200" + date: "18/12/2025 12:35" + timezone: "Asia/Jerusalem" + locale: "he-IL" + bodyText: "תודה על הזמנתך. סכום: ₪232.83 כולל מע\"מ 17%." + totals: + currency: "ILS" + amount: 232.83 + vat: + rate: 0.17 + amount: 33.83 + /v1/orders: + post: + tags: [תאימות, הזמנות] + summary: יצירת הזמנה - v1 (חוזה תואם) + parameters: + - $ref: '#/components/parameters/IdempotencyKey' + - $ref: '#/components/parameters/AcceptLanguage' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/OrderCreateRequestV1' + examples: + v1Basic: + value: + items: + - sku: "RED-HOODIE" + qty: 1 + currency: "ILS" + payment: + method: "credit_card" + token: "tok_test_ok" + responses: + '201': + description: נוצר בהצלחה (שדות קריטיים קיימים) + content: + application/json: + schema: + $ref: '#/components/schemas/OrderMinimalResponse' + /v2/orders: + post: + tags: [תאימות, הזמנות] + summary: יצירת הזמנה - v2 (תוספות לא שוברות) + parameters: + - $ref: '#/components/parameters/IdempotencyKey' + - $ref: '#/components/parameters/AcceptLanguage' + requestBody: + required: true + content: + application/json: + schema: + $ref: '#/components/schemas/OrderCreateRequest' + examples: + v2Basic: + value: + items: + - sku: "RED-HOODIE" + qty: 1 + currency: "ILS" + payment: + method: "credit_card" + token: "tok_test_ok" + responses: + '201': + description: נוצר בהצלחה (שדות קריטיים קיימים + הרחבות) + content: + application/json: + schema: + allOf: + - $ref: '#/components/schemas/OrderMinimalResponse' + - type: object + properties: + locale: + type: string + example: he-IL + links: + type: object + properties: + self: + type: string + format: uri +components: + securitySchemes: + bearerAuth: + type: http + scheme: bearer + bearerFormat: JWT + parameters: + IdempotencyKey: + name: Idempotency-Key + in: header + required: false + description: מפתח אידמפוטנטיות למניעת יצירת הזמנה כפולה (UUID/טקסט ייחודי עד 255 תווים) + schema: + type: string + maxLength: 255 + example: "123e4567-e89b-12d3-a456-426614174000" + AcceptLanguage: + name: Accept-Language + in: header + required: false + description: קביעת שפת הודעות/תצוגה (למשל he-IL) + schema: + type: string + example: he-IL + schemas: + ShippingMethodId: + type: string + enum: [local_pickup, delivery_express, registered_mail] + Money: + type: object + required: [amount, currency] + properties: + amount: + type: number + format: float + currency: + type: string + example: ILS + Address: + type: object + required: [street, city, country] + properties: + street: + type: string + example: "הרב קוק 12/3 קומה 2-א'" + city: + type: string + example: "תל אביב" + postcode: + type: string + description: מיקוד ישראלי בן 7 ספרות + pattern: '^\d{7}$' + example: "6777655" + country: + type: string + enum: [IL] + Customer: + type: object + properties: + firstName: + type: string + example: "יואב" + lastName: + type: string + example: "לוי" + email: + type: string + format: email + example: "yoav@example.com" + phone: + type: string + description: מספר טלפון ישראלי + pattern: '^(?:\+972|0)(?:[23489]\d{7}|5\d{8})$' + example: "0529876543" + OrderItem: + type: object + required: [sku, qty] + properties: + sku: + type: string + example: RED-HOODIE + name: + type: string + readOnly: true + example: "Red Hoodie" + qty: + type: integer + minimum: 1 + example: 2 + price: + type: number + format: float + description: מחיר יחידה (כאשר מסופק בבקשה) + example: 199.0 + currency: + type: string + example: ILS + unitPrice: + $ref: '#/components/schemas/Money' + lineTotal: + $ref: '#/components/schemas/Money' + ShippingSelection: + type: object + required: [method] + properties: + method: + $ref: '#/components/schemas/ShippingMethodId' + address: + $ref: '#/components/schemas/Address' + Payment: + type: object + required: [method] + properties: + method: + type: string + enum: [credit_card, paypal] + token: + type: string + description: אסימון תשלום/דמה (Tokenization) + example: tok_test_ok + OrderCreateRequest: + type: object + required: [items, currency, payment] + properties: + customer: + $ref: '#/components/schemas/Customer' + shipping: + $ref: '#/components/schemas/ShippingSelection' + items: + type: array + minItems: 1 + items: + $ref: '#/components/schemas/OrderItem' + currency: + type: string + enum: [ILS] + payment: + $ref: '#/components/schemas/Payment' + OrderCreateRequestV1: + type: object + required: [items, currency, payment] + properties: + items: + type: array + minItems: 1 + items: + type: object + required: [sku, qty] + properties: + sku: + type: string + qty: + type: integer + currency: + type: string + enum: [ILS] + payment: + $ref: '#/components/schemas/Payment' + OrderMinimalResponse: + type: object + required: [orderId, amount, currency, transactionId] + properties: + orderId: + type: string + example: "ORD-555" + amount: + type: number + format: float + example: 199.0 + currency: + type: string + example: ILS + transactionId: + type: string + example: "TRX-123" + Order: + type: object + properties: + orderId: + type: string + example: ORD-20250001 + number: + type: string + example: "100045" + status: + type: string + enum: [pending, paid, canceled] + currency: + type: string + example: ILS + amount: + type: number + format: float + totals: + type: object + properties: + subtotal: + type: number + format: float + shipping: + type: number + format: float + tax: + type: object + properties: + type: + type: string + example: VAT + rate: + type: number + format: float + example: 0.17 + amount: + type: number + format: float + items: + type: array + items: + $ref: '#/components/schemas/OrderItem' + shipping: + type: object + properties: + method: + $ref: '#/components/schemas/ShippingMethodId' + eta: + type: string + example: "1-2 ימי עסקים" + address: + $ref: '#/components/schemas/Address' + customer: + $ref: '#/components/schemas/Customer' + payment: + type: object + properties: + method: + type: string + example: credit_card + transactionId: + type: string + last4: + type: string + createdAt: + type: string + format: date-time + locale: + type: string + example: he-IL + InventoryProduct: + type: object + properties: + sku: + type: string + onHand: + type: integer + reserved: + type: integer + updatedAt: + type: string + format: date-time + ShippingRate: + type: object + properties: + method: + $ref: '#/components/schemas/ShippingMethodId' + label: + type: string + example: "שליח אקספרס" + eta: + type: string + example: "1-2 ימי עסקים" + price: + $ref: '#/components/schemas/Money' + ProviderStatus: + type: object + properties: + provider: + type: string + enabled: + type: boolean + message: + type: string + Refund: + type: object + properties: + refundId: + type: string + method: + type: string + example: credit_card + amount: + $ref: '#/components/schemas/Money' + status: + type: string + enum: [initiated, succeeded, failed] + ChargeRequest: + type: object + required: [amount, currency, method, token] + properties: + amount: + type: number + format: float + currency: + type: string + enum: [ILS] + method: + type: string + enum: [credit_card, paypal] + token: + type: string + Charge: + type: object + properties: + chargeId: + type: string + status: + type: string + enum: [succeeded, failed, pending] + amount: + $ref: '#/components/schemas/Money' + transactionId: + type: string + EmailMessage: + type: object + properties: + id: + type: string + orderId: + type: string + subject: + type: string + date: + type: string + description: תאריך בפורמט dd/mm/yyyy HH:mm + example: "18/12/2025 12:35" + timezone: + type: string + example: Asia/Jerusalem + locale: + type: string + example: he-IL + bodyText: + type: string + totals: + type: object + properties: + currency: + type: string + example: ILS + amount: + type: number + format: float + vat: + type: object + properties: + rate: + type: number + format: float + example: 0.17 + amount: + type: number + format: float + Error: + type: object + properties: + code: + type: string + message: + type: string + fields: + type: object + additionalProperties: + type: string