[{"data":1,"prerenderedAt":36231},["ShallowReactive",2],{"navigation":3,"/microservices-with-django/testing-microservices":1016,"/microservices-with-django/testing-microservices-surround":36226},[4,54,89,123,165,211,253,331,389,439,462,488,514,540,578,624,650,672,702,736,774,800,850,856,862,868,874,928],{"title":5,"path":6,"stem":7,"children":8},"Introduction and Foundations","/introduction-and-foundations","01.introduction-and-foundations/01.index",[9,10,14,18,22,26,30,34,38,42,46,50],{"title":5,"path":6,"stem":7},{"title":11,"path":12,"stem":13},"What is Django","/introduction-and-foundations/what-is-django","01.introduction-and-foundations/02.what-is-django",{"title":15,"path":16,"stem":17},"Key Concepts and Philosophy","/introduction-and-foundations/key-concepts-and-philosophy","01.introduction-and-foundations/03.key-concepts-and-philosophy",{"title":19,"path":20,"stem":21},"MVC vs MVT: Understanding Django's Architecture","/introduction-and-foundations/mvc-vs-mvt","01.introduction-and-foundations/04.mvc-vs-mvt",{"title":23,"path":24,"stem":25},"Project Structure Overview","/introduction-and-foundations/project-structure-overview","01.introduction-and-foundations/05.project-structure-overview",{"title":27,"path":28,"stem":29},"Installing Django","/introduction-and-foundations/installing-django","01.introduction-and-foundations/06.installing-django",{"title":31,"path":32,"stem":33},"Creating Your First Django Project","/introduction-and-foundations/creating-first-project","01.introduction-and-foundations/07.creating-first-project",{"title":35,"path":36,"stem":37},"Creating Your First Django App","/introduction-and-foundations/creating-first-app","01.introduction-and-foundations/08.creating-first-app",{"title":39,"path":40,"stem":41},"Your First Django \"Hello World\"","/introduction-and-foundations/hello-world","01.introduction-and-foundations/09.hello-world",{"title":43,"path":44,"stem":45},"Django Quick Start Guide","/introduction-and-foundations/quick-start-guide","01.introduction-and-foundations/10.quick-start-guide",{"title":47,"path":48,"stem":49},"How Django Handles Requests","/introduction-and-foundations/how-django-handles-requests","01.introduction-and-foundations/11.how-django-handles-requests",{"title":51,"path":52,"stem":53},"Django Settings","/introduction-and-foundations/django-settings","01.introduction-and-foundations/12.django-settings",{"title":55,"path":56,"stem":57,"children":58},"The Development Environment","/development-environment","02.development-environment/1.index",[59,61,65,69,73,77,81,85],{"title":60,"path":56,"stem":57},"Development Environment",{"title":62,"path":63,"stem":64},"Recommended Tooling for Django Development","/development-environment/recommended-tooling","02.development-environment/2.recommended-tooling",{"title":66,"path":67,"stem":68},"Virtual Environments","/development-environment/virtual-environments","02.development-environment/3.virtual-environments",{"title":70,"path":71,"stem":72},"Django Admin and Management Commands","/development-environment/admin-and-management-commands","02.development-environment/4.admin-and-management-commands",{"title":74,"path":75,"stem":76},"Django Project Settings","/development-environment/project-settings","02.development-environment/5.project-settings",{"title":78,"path":79,"stem":80},"Managing Django Environments: Local, Staging, and Production","/development-environment/environments-local-staging-production","02.development-environment/6.environments-local-staging-production",{"title":82,"path":83,"stem":84},"Running Django Development Server","/development-environment/running-development-server","02.development-environment/7.running-development-server",{"title":86,"path":87,"stem":88},"Working with Django Shell","/development-environment/working-with-shell","02.development-environment/8.working-with-shell",{"title":90,"path":91,"stem":92,"children":93},"Templates and Presentation Layer","/templates-and-presentation","03.templates-and-presentation/1.index",[94,95,99,103,107,111,115,119],{"title":90,"path":91,"stem":92},{"title":96,"path":97,"stem":98},"Introduction to Django Templates","/templates-and-presentation/introduction-to-templates","03.templates-and-presentation/2.introduction-to-templates",{"title":100,"path":101,"stem":102},"The Django Template Language","/templates-and-presentation/django-template-language","03.templates-and-presentation/3.django-template-language",{"title":104,"path":105,"stem":106},"Template Inheritance","/templates-and-presentation/template-inheritance","03.templates-and-presentation/4.template-inheritance",{"title":108,"path":109,"stem":110},"Built-in Template Tags and Filters","/templates-and-presentation/built-in-template-tags-and-filters","03.templates-and-presentation/5.built-in-template-tags-and-filters",{"title":112,"path":113,"stem":114},"Including Static Files","/templates-and-presentation/including-static-files","03.templates-and-presentation/6.including-static-files",{"title":116,"path":117,"stem":118},"Working with Media Files","/templates-and-presentation/working-with-media-files","03.templates-and-presentation/7.working-with-media-files",{"title":120,"path":121,"stem":122},"Using Alternative Template Engines","/templates-and-presentation/using-alternative-template-engines","03.templates-and-presentation/8.using-alternative-template-engines",{"title":124,"path":125,"stem":126,"children":127},"URLs and Views","/urls-and-views","04.urls-and-views/01.index",[128,129,133,137,141,145,149,153,157,161],{"title":124,"path":125,"stem":126},{"title":130,"path":131,"stem":132},"The URL Dispatcher","/urls-and-views/the-url-dispatcher","04.urls-and-views/02.the-url-dispatcher",{"title":134,"path":135,"stem":136},"Writing Function-Based Views","/urls-and-views/writing-function-based-views","04.urls-and-views/03.writing-function-based-views",{"title":138,"path":139,"stem":140},"View Decorators","/urls-and-views/view-decorators","04.urls-and-views/04.view-decorators",{"title":142,"path":143,"stem":144},"Rendering Responses","/urls-and-views/rendering-responses","04.urls-and-views/05.rendering-responses",{"title":146,"path":147,"stem":148},"Redirects","/urls-and-views/redirects","04.urls-and-views/06.redirects",{"title":150,"path":151,"stem":152},"Handling HTTP Methods","/urls-and-views/handling-http-methods","04.urls-and-views/07.handling-http-methods",{"title":154,"path":155,"stem":156},"Conditional View Processing","/urls-and-views/conditional-view-processing","04.urls-and-views/08.conditional-view-processing",{"title":158,"path":159,"stem":160},"File Uploads","/urls-and-views/file-uploads","04.urls-and-views/09.file-uploads",{"title":162,"path":163,"stem":164},"Using Django Shortcut Functions","/urls-and-views/using-django-shortcut-functions","04.urls-and-views/10.using-django-shortcut-functions",{"title":166,"path":167,"stem":168,"children":169},"Class Based Views","/class-based-views","05.class-based-views/01.index",[170,171,175,179,183,187,191,195,199,203,207],{"title":166,"path":167,"stem":168},{"title":172,"path":173,"stem":174},"Introduction to Class-Based Views","/class-based-views/introduction-to-class-based-views","05.class-based-views/02.introduction-to-class-based-views",{"title":176,"path":177,"stem":178},"Common Base Classes","/class-based-views/common-base-classes","05.class-based-views/03.common-base-classes",{"title":180,"path":181,"stem":182},"Built-in Generic Views","/class-based-views/built-in-generic-views","05.class-based-views/04.built-in-generic-views",{"title":184,"path":185,"stem":186},"Views for CRUD Operations","/class-based-views/views-for-crud-operations","05.class-based-views/05.views-for-crud-operations",{"title":188,"path":189,"stem":190},"Handling Forms with Class-Based Views","/class-based-views/handling-forms-with-class-based-views","05.class-based-views/06.handling-forms-with-class-based-views",{"title":192,"path":193,"stem":194},"Using Mixins","/class-based-views/using-mixins","05.class-based-views/07.using-mixins",{"title":196,"path":197,"stem":198},"URL Configuration with Class-Based Views","/class-based-views/url-configuration-with-class-based-views","05.class-based-views/08.url-configuration-with-class-based-views",{"title":200,"path":201,"stem":202},"Subclassing Generic Views","/class-based-views/subclassing-generic-views","05.class-based-views/09.subclassing-generic-views",{"title":204,"path":205,"stem":206},"Asynchronous Class-Based Views","/class-based-views/asynchronous-class-based-views","05.class-based-views/10.asynchronous-class-based-views",{"title":208,"path":209,"stem":210},"Pagination","/class-based-views/pagination","05.class-based-views/11.pagination",{"title":212,"path":213,"stem":214,"children":215},"Forms and User Input","/forms-and-user-input","06.forms-and-user-input/01.index",[216,217,221,225,229,233,237,241,245,249],{"title":212,"path":213,"stem":214},{"title":218,"path":219,"stem":220},"Understanding HTML Forms","/forms-and-user-input/understanding-html-forms","06.forms-and-user-input/02.understanding-html-forms",{"title":222,"path":223,"stem":224},"Django's Role in Form Handling","/forms-and-user-input/djangos-role-in-form-handling","06.forms-and-user-input/03.djangos-role-in-form-handling",{"title":226,"path":227,"stem":228},"Creating Forms with Forms API","/forms-and-user-input/creating-forms-with-forms-api","06.forms-and-user-input/04.creating-forms-with-forms-api",{"title":230,"path":231,"stem":232},"Form Validation","/forms-and-user-input/form-validation","06.forms-and-user-input/05.form-validation",{"title":234,"path":235,"stem":236},"Built-in Fields and Widgets","/forms-and-user-input/built-in-fields-and-widgets","06.forms-and-user-input/06.built-in-fields-and-widgets",{"title":238,"path":239,"stem":240},"Form Rendering in Templates","/forms-and-user-input/form-rendering-in-templates","06.forms-and-user-input/07.form-rendering-in-templates",{"title":242,"path":243,"stem":244},"Model Forms","/forms-and-user-input/model-forms","06.forms-and-user-input/08.model-forms",{"title":246,"path":247,"stem":248},"Advanced Form Techniques","/forms-and-user-input/advanced-form-techniques","06.forms-and-user-input/09.advanced-form-techniques",{"title":250,"path":251,"stem":252},"Security Considerations for Forms","/forms-and-user-input/security-considerations-for-forms","06.forms-and-user-input/10.security-considerations-for-forms",{"title":254,"path":255,"stem":256,"children":257},"Models and Databases","/models-and-databases","07.models-and-databases/01.index",[258,259,263,267,271,275,279,283,287,291,295,299,303,307,311,315,319,323,327],{"title":254,"path":255,"stem":256},{"title":260,"path":261,"stem":262},"Understanding Django Models","/models-and-databases/understanding-django-models","07.models-and-databases/02.understanding-django-models",{"title":264,"path":265,"stem":266},"Defining Fields","/models-and-databases/defining-fields","07.models-and-databases/03.defining-fields",{"title":268,"path":269,"stem":270},"Relationships and Foreign Keys","/models-and-databases/relationships-and-foreign-keys","07.models-and-databases/04.relationships-and-foreign-keys",{"title":272,"path":273,"stem":274},"Examples of Relationship Patterns","/models-and-databases/examples-of-relationship-patterns","07.models-and-databases/05.examples-of-relationship-patterns",{"title":276,"path":277,"stem":278},"Making Queries","/models-and-databases/making-queries","07.models-and-databases/06.making-queries",{"title":280,"path":281,"stem":282},"Filtering, Ordering, and Slicing","/models-and-databases/filtering-ordering-slicing","07.models-and-databases/07.filtering-ordering-slicing",{"title":284,"path":285,"stem":286},"Managers and QuerySets","/models-and-databases/managers-and-querysets","07.models-and-databases/08.managers-and-querysets",{"title":288,"path":289,"stem":290},"Aggregation","/models-and-databases/aggregation","07.models-and-databases/09.aggregation",{"title":292,"path":293,"stem":294},"Search","/models-and-databases/search","07.models-and-databases/10.search",{"title":296,"path":297,"stem":298},"Raw SQL Queries","/models-and-databases/raw-sql-queries","07.models-and-databases/11.raw-sql-queries",{"title":300,"path":301,"stem":302},"Transactions","/models-and-databases/transactions","07.models-and-databases/12.transactions",{"title":304,"path":305,"stem":306},"Multiple Databases","/models-and-databases/multiple-databases","07.models-and-databases/13.multiple-databases",{"title":308,"path":309,"stem":310},"Tablespaces","/models-and-databases/tablespaces","07.models-and-databases/14.tablespaces",{"title":312,"path":313,"stem":314},"Composite Primary Keys","/models-and-databases/composite-primary-keys","07.models-and-databases/15.composite-primary-keys",{"title":316,"path":317,"stem":318},"Database Instrumentation","/models-and-databases/database-instrumentation","07.models-and-databases/16.database-instrumentation",{"title":320,"path":321,"stem":322},"Database Optimization","/models-and-databases/database-optimization","07.models-and-databases/17.database-optimization",{"title":324,"path":325,"stem":326},"Fixtures","/models-and-databases/fixtures","07.models-and-databases/18.fixtures",{"title":328,"path":329,"stem":330},"Signals","/models-and-databases/signals","07.models-and-databases/19.signals",{"title":332,"path":333,"stem":334,"children":335},"Migrations","/migrations","08.migrations/01.index",[336,337,341,345,349,353,357,361,365,369,373,377,381,385],{"title":332,"path":333,"stem":334},{"title":338,"path":339,"stem":340},"How Migrations Work","/migrations/how-migrations-work","08.migrations/02.how-migrations-work",{"title":342,"path":343,"stem":344},"Management Commands","/migrations/management-commands","08.migrations/03.management-commands",{"title":346,"path":347,"stem":348},"Dependencies and Workflow","/migrations/dependencies-and-workflow","08.migrations/04.dependencies-and-workflow",{"title":350,"path":351,"stem":352},"Transaction Handling","/migrations/transaction-handling","08.migrations/05.transaction-handling",{"title":354,"path":355,"stem":356},"Adding Migrations to Apps","/migrations/adding-migrations-to-apps","08.migrations/06.adding-migrations-to-apps",{"title":358,"path":359,"stem":360},"Reversing Migrations","/migrations/reversing-migrations","08.migrations/07.reversing-migrations",{"title":362,"path":363,"stem":364},"Historical Models","/migrations/historical-models","08.migrations/08.historical-models",{"title":366,"path":367,"stem":368},"Considerations When Removing Fields","/migrations/considerations-when-removing-fields","08.migrations/09.considerations-when-removing-fields",{"title":370,"path":371,"stem":372},"Data Migrations","/migrations/data-migrations","08.migrations/10.data-migrations",{"title":374,"path":375,"stem":376},"Squashing Migrations","/migrations/squashing-migrations","08.migrations/11.squashing-migrations",{"title":378,"path":379,"stem":380},"Serializing Values","/migrations/serializing-values","08.migrations/12.serializing-values",{"title":382,"path":383,"stem":384},"Supporting Multiple Django Versions","/migrations/supporting-multiple-django-versions","08.migrations/13.supporting-multiple-django-versions",{"title":386,"path":387,"stem":388},"Django Serialization Framework","/migrations/django-serialization-framework","08.migrations/14.django-serialization-framework",{"title":390,"path":391,"stem":392,"children":393},"Authentication and Authorization","/authentication-and-authorization","09.authentication-and-authorization/01.index",[394,395,399,403,407,411,415,419,423,427,431,435],{"title":390,"path":391,"stem":392},{"title":396,"path":397,"stem":398},"Overview of Django's Authentication System","/authentication-and-authorization/overview-of-django-authentication-system","09.authentication-and-authorization/02.overview-of-django-authentication-system",{"title":400,"path":401,"stem":402},"Users and Groups","/authentication-and-authorization/users-and-groups","09.authentication-and-authorization/03.users-and-groups",{"title":404,"path":405,"stem":406},"Permissions","/authentication-and-authorization/permissions","09.authentication-and-authorization/04.permissions",{"title":408,"path":409,"stem":410},"Password Management","/authentication-and-authorization/password-management","09.authentication-and-authorization/05.password-management",{"title":412,"path":413,"stem":414},"Authentication Views","/authentication-and-authorization/authentication-views","09.authentication-and-authorization/06.authentication-views",{"title":416,"path":417,"stem":418},"Login and Logout","/authentication-and-authorization/login-and-logout","09.authentication-and-authorization/07.login-and-logout",{"title":420,"path":421,"stem":422},"Custom User Models","/authentication-and-authorization/custom-user-models","09.authentication-and-authorization/08.custom-user-models",{"title":424,"path":425,"stem":426},"Middleware for Authentication","/authentication-and-authorization/middleware-for-authentication","09.authentication-and-authorization/09.middleware-for-authentication",{"title":428,"path":429,"stem":430},"Authorization in Views and Templates","/authentication-and-authorization/authorization-in-views-and-templates","09.authentication-and-authorization/10.authorization-in-views-and-templates",{"title":432,"path":433,"stem":434},"Integrating Social Authentication","/authentication-and-authorization/integrating-social-authentication","09.authentication-and-authorization/11.integrating-social-authentication",{"title":436,"path":437,"stem":438},"Security Best Practices","/authentication-and-authorization/security-best-practices","09.authentication-and-authorization/12.security-best-practices",{"title":440,"path":441,"stem":442,"children":443},"Sessions, Cookies, and State","/sessions-cookies-state","10.sessions-cookies-state/01.index",[444,446,450,454,458],{"title":445,"path":441,"stem":442},"Sessions, Cookies, and State Management",{"title":447,"path":448,"stem":449},"Introduction to Sessions","/sessions-cookies-state/introduction-to-sessions","10.sessions-cookies-state/02.introduction-to-sessions",{"title":451,"path":452,"stem":453},"Working with Cookies","/sessions-cookies-state/working-with-cookies","10.sessions-cookies-state/03.working-with-cookies",{"title":455,"path":456,"stem":457},"Server-Side Session Storage Options","/sessions-cookies-state/server-side-session-storage-options","10.sessions-cookies-state/04.server-side-session-storage-options",{"title":459,"path":460,"stem":461},"Session Security","/sessions-cookies-state/session-security","10.sessions-cookies-state/05.session-security",{"title":463,"path":464,"stem":465,"children":466},"Working with Files","/working-with-files","11.working-with-files/01.index",[467,468,472,476,480,484],{"title":463,"path":464,"stem":465},{"title":469,"path":470,"stem":471},"Files in Models","/working-with-files/files-in-models","11.working-with-files/02.files-in-models",{"title":473,"path":474,"stem":475},"The File Object","/working-with-files/the-file-object","11.working-with-files/03.the-file-object",{"title":477,"path":478,"stem":479},"Storage Backends","/working-with-files/storage-backends","11.working-with-files/04.storage-backends",{"title":481,"path":482,"stem":483},"Using Cloud Storage Providers","/working-with-files/using-cloud-storage-providers","11.working-with-files/05.using-cloud-storage-providers",{"title":485,"path":486,"stem":487},"Managing Media in Production","/working-with-files/managing-media-in-production","11.working-with-files/06.managing-media-in-production",{"title":489,"path":490,"stem":491,"children":492},"Admin Site","/admin-site","12.admin-site/01.index",[493,494,498,502,506,510],{"title":489,"path":490,"stem":491},{"title":495,"path":496,"stem":497},"Enabling the Admin","/admin-site/enabling-the-admin","12.admin-site/02.enabling-the-admin",{"title":499,"path":500,"stem":501},"Registering Models","/admin-site/registering-models","12.admin-site/03.registering-models",{"title":503,"path":504,"stem":505},"Customizing Admin Display","/admin-site/customizing-admin-display","12.admin-site/04.customizing-admin-display",{"title":507,"path":508,"stem":509},"Admin Actions","/admin-site/admin-actions","12.admin-site/05.admin-actions",{"title":511,"path":512,"stem":513},"Admin Security Best Practices","/admin-site/admin-security-best-practices","12.admin-site/06.admin-security-best-practices",{"title":515,"path":516,"stem":517,"children":518},"Middleware","/middleware","13.middleware/01.index",[519,520,524,528,532,536],{"title":515,"path":516,"stem":517},{"title":521,"path":522,"stem":523},"Middleware Overview","/middleware/middleware-overview","13.middleware/02.middleware-overview",{"title":525,"path":526,"stem":527},"Built-in Middleware","/middleware/built-in-middleware","13.middleware/03.built-in-middleware",{"title":529,"path":530,"stem":531},"Creating Custom Middleware","/middleware/creating-custom-middleware","13.middleware/04.creating-custom-middleware",{"title":533,"path":534,"stem":535},"Middleware Ordering","/middleware/middleware-ordering","13.middleware/05.middleware-ordering",{"title":537,"path":538,"stem":539},"Performance and Debugging","/middleware/performance-and-debugging","13.middleware/06.performance-and-debugging",{"title":541,"path":542,"stem":543,"children":544},"Security","/security","14.security/01.index",[545,546,550,554,558,562,566,570,574],{"title":541,"path":542,"stem":543},{"title":547,"path":548,"stem":549},"Django Security Philosophy","/security/django-security-philosophy","14.security/02.django-security-philosophy",{"title":551,"path":552,"stem":553},"Cross Site Request Forgery","/security/cross-site-request-forgery","14.security/03.cross-site-request-forgery",{"title":555,"path":556,"stem":557},"Cross Site Scripting","/security/cross-site-scripting","14.security/04.cross-site-scripting",{"title":559,"path":560,"stem":561},"SQL Injection Protection","/security/sql-injection-protection","14.security/05.sql-injection-protection",{"title":563,"path":564,"stem":565},"Clickjacking Protection","/security/clickjacking-protection","14.security/06.clickjacking-protection",{"title":567,"path":568,"stem":569},"HTTPS Setup and HSTS","/security/https-setup-and-hsts","14.security/07.https-setup-and-hsts",{"title":571,"path":572,"stem":573},"Password Storage and Cryptography","/security/password-storage-and-cryptography","14.security/08.password-storage-and-cryptography",{"title":575,"path":576,"stem":577},"Secure Deployment Checklist","/security/secure-deployment-checklist","14.security/09.secure-deployment-checklist",{"title":579,"path":580,"stem":581,"children":582},"Testing","/testing","15.testing/01.index",[583,584,588,592,596,600,604,608,612,616,620],{"title":579,"path":580,"stem":581},{"title":585,"path":586,"stem":587},"Introduction to Django Testing","/testing/introduction-to-django-testing","15.testing/02.introduction-to-django-testing",{"title":589,"path":590,"stem":591},"Writing and Running Tests","/testing/writing-and-running-tests","15.testing/03.writing-and-running-tests",{"title":593,"path":594,"stem":595},"Test Tools","/testing/test-tools","15.testing/04.test-tools",{"title":597,"path":598,"stem":599},"Testing Models","/testing/testing-models","15.testing/05.testing-models",{"title":601,"path":602,"stem":603},"Testing Views","/testing/testing-views","15.testing/06.testing-views",{"title":605,"path":606,"stem":607},"Testing Forms","/testing/testing-forms","15.testing/07.testing-forms",{"title":609,"path":610,"stem":611},"Testing Templates","/testing/testing-templates","15.testing/08.testing-templates",{"title":613,"path":614,"stem":615},"Testing Authentication","/testing/testing-authentication","15.testing/09.testing-authentication",{"title":617,"path":618,"stem":619},"Advanced Testing Topics","/testing/advanced-testing-topics","15.testing/10.advanced-testing-topics",{"title":621,"path":622,"stem":623},"Performance Testing","/testing/performance-testing","15.testing/11.performance-testing",{"title":625,"path":626,"stem":627,"children":628},"Static Assets and Frontend Integration","/static-assets-and-frontend-integration","16.static-assets-and-frontend-integration/01.index",[629,630,634,638,642,646],{"title":625,"path":626,"stem":627},{"title":631,"path":632,"stem":633},"Working with Static Files","/static-assets-and-frontend-integration/working-with-static-files","16.static-assets-and-frontend-integration/02.working-with-static-files",{"title":635,"path":636,"stem":637},"Integrating CSS and JavaScript","/static-assets-and-frontend-integration/integrating-css-and-javascript","16.static-assets-and-frontend-integration/03.integrating-css-and-javascript",{"title":639,"path":640,"stem":641},"Using Build Tools like Vite or Webpack","/static-assets-and-frontend-integration/using-build-tools-like-vite-or-webpack","16.static-assets-and-frontend-integration/04.using-build-tools-like-vite-or-webpack",{"title":643,"path":644,"stem":645},"Using React or Vue with Django","/static-assets-and-frontend-integration/using-react-or-vue-with-django","16.static-assets-and-frontend-integration/05.using-react-or-vue-with-django",{"title":647,"path":648,"stem":649},"Managing CORS","/static-assets-and-frontend-integration/managing-cors","16.static-assets-and-frontend-integration/06.managing-cors",{"title":651,"path":652,"stem":653,"children":654},"Internationalization and Localization","/internationalization-and-localization","17.internationalization-and-localization/01.index",[655,656,660,664,668],{"title":651,"path":652,"stem":653},{"title":657,"path":658,"stem":659},"Enabling Translation","/internationalization-and-localization/enabling-translation","17.internationalization-and-localization/02.enabling-translation",{"title":661,"path":662,"stem":663},"Translating Text in Code and Templates","/internationalization-and-localization/translating-text-in-code-and-templates","17.internationalization-and-localization/03.translating-text-in-code-and-templates",{"title":665,"path":666,"stem":667},"Timezone Support","/internationalization-and-localization/timezone-support","17.internationalization-and-localization/04.timezone-support",{"title":669,"path":670,"stem":671},"Locale Middleware","/internationalization-and-localization/locale-middleware","17.internationalization-and-localization/05.locale-middleware",{"title":673,"path":674,"stem":675,"children":676},"Caching","/caching","18.caching/01.index",[677,678,682,686,690,694,698],{"title":673,"path":674,"stem":675},{"title":679,"path":680,"stem":681},"Introduction to Caching","/caching/introduction-to-caching","18.caching/02.introduction-to-caching",{"title":683,"path":684,"stem":685},"Cache Backends","/caching/cache-backends","18.caching/03.cache-backends",{"title":687,"path":688,"stem":689},"Per View Caching","/caching/per-view-caching","18.caching/04.per-view-caching",{"title":691,"path":692,"stem":693},"Low Level Cache API","/caching/low-level-cache-api","18.caching/05.low-level-cache-api",{"title":695,"path":696,"stem":697},"Template Fragment Caching","/caching/template-fragment-caching","18.caching/06.template-fragment-caching",{"title":699,"path":700,"stem":701},"Deployment Level Caching Patterns","/caching/deployment-level-caching-patterns","18.caching/07.deployment-level-caching-patterns",{"title":703,"path":704,"stem":705,"children":706},"Asynchronous Django","/asynchronous-django","19.asynchronous-django/01.index",[707,708,712,716,720,724,728,732],{"title":703,"path":704,"stem":705},{"title":709,"path":710,"stem":711},"Introduction to ASGI","/asynchronous-django/introduction-to-asgi","19.asynchronous-django/02.introduction-to-asgi",{"title":713,"path":714,"stem":715},"Async Views","/asynchronous-django/async-views","19.asynchronous-django/03.async-views",{"title":717,"path":718,"stem":719},"Async ORM Status","/asynchronous-django/async-orm-status","19.asynchronous-django/04.async-orm-status",{"title":721,"path":722,"stem":723},"WebSockets with Channels","/asynchronous-django/websockets-with-channels","19.asynchronous-django/05.websockets-with-channels",{"title":725,"path":726,"stem":727},"Background Tasks with Celery or RQ","/asynchronous-django/background-tasks-with-celery-or-rq","19.asynchronous-django/06.background-tasks-with-celery-or-rq",{"title":729,"path":730,"stem":731},"Asynchronous Support","/asynchronous-django/asynchronous-support","19.asynchronous-django/07.asynchronous-support",{"title":733,"path":734,"stem":735},"Django's Tasks Framework","/asynchronous-django/django-tasks-framework","19.asynchronous-django/08.django-tasks-framework",{"title":737,"path":738,"stem":739,"children":740},"Deployment","/deployment","20.deployment/01.index",[741,742,746,750,754,758,762,766,770],{"title":737,"path":738,"stem":739},{"title":743,"path":744,"stem":745},"Preparing for Production","/deployment/preparing-for-production","20.deployment/02.preparing-for-production",{"title":747,"path":748,"stem":749},"Using WSGI and ASGI Servers","/deployment/using-wsgi-and-asgi-servers","20.deployment/03.using-wsgi-and-asgi-servers",{"title":751,"path":752,"stem":753},"Deploying on Linux Servers","/deployment/deploying-on-linux-servers","20.deployment/04.deploying-on-linux-servers",{"title":755,"path":756,"stem":757},"Using Docker","/deployment/using-docker","20.deployment/05.using-docker",{"title":759,"path":760,"stem":761},"Cloud Deployment Guides","/deployment/cloud-deployment-guides","20.deployment/06.cloud-deployment-guides",{"title":763,"path":764,"stem":765},"Scaling and Load Balancing","/deployment/scaling-and-load-balancing","20.deployment/07.scaling-and-load-balancing",{"title":767,"path":768,"stem":769},"Monitoring and Logging","/deployment/monitoring-and-logging","20.deployment/08.monitoring-and-logging",{"title":771,"path":772,"stem":773},"Backup Strategies","/deployment/backup-strategies","20.deployment/09.backup-strategies",{"title":775,"path":776,"stem":777,"children":778},"Performance and Optimization","/performance-and-optimization","21.performance-and-optimization/01.index",[779,780,784,788,792,796],{"title":775,"path":776,"stem":777},{"title":781,"path":782,"stem":783},"Query Optimization","/performance-and-optimization/query-optimization","21.performance-and-optimization/02.query-optimization",{"title":785,"path":786,"stem":787},"Template Rendering Optimization","/performance-and-optimization/template-rendering-optimization","21.performance-and-optimization/03.template-rendering-optimization",{"title":789,"path":790,"stem":791},"Using Select Related and Prefetch Related","/performance-and-optimization/using-select-related-and-prefetch-related","21.performance-and-optimization/04.using-select-related-and-prefetch-related",{"title":793,"path":794,"stem":795},"Caching Strategies","/performance-and-optimization/caching-strategies","21.performance-and-optimization/05.caching-strategies",{"title":797,"path":798,"stem":799},"Profiling Django Apps","/performance-and-optimization/profiling-django-apps","21.performance-and-optimization/06.profiling-django-apps",{"title":801,"path":802,"stem":803,"children":804},"Advanced and Expert Topics","/advanced-and-expert-topics","22.advanced-and-expert-topics/01.index",[805,806,810,814,818,822,826,830,834,838,842,846],{"title":801,"path":802,"stem":803},{"title":807,"path":808,"stem":809},"System Architecture Patterns","/advanced-and-expert-topics/system-architecture-patterns","22.advanced-and-expert-topics/02.system-architecture-patterns",{"title":811,"path":812,"stem":813},"Domain Driven Design with Django","/advanced-and-expert-topics/domain-driven-design-with-django","22.advanced-and-expert-topics/03.domain-driven-design-with-django",{"title":815,"path":816,"stem":817},"Building Large Scale Django Projects","/advanced-and-expert-topics/building-large-scale-django-projects","22.advanced-and-expert-topics/04.building-large-scale-django-projects",{"title":819,"path":820,"stem":821},"Plugin Architectures for Django Apps","/advanced-and-expert-topics/plugin-architectures-for-django-apps","22.advanced-and-expert-topics/05.plugin-architectures-for-django-apps",{"title":823,"path":824,"stem":825},"Extending Django's Core","/advanced-and-expert-topics/extending-djangos-core","22.advanced-and-expert-topics/06.extending-djangos-core",{"title":827,"path":828,"stem":829},"Custom ORM Expressions","/advanced-and-expert-topics/custom-orm-expressions","22.advanced-and-expert-topics/07.custom-orm-expressions",{"title":831,"path":832,"stem":833},"Custom Management Commands","/advanced-and-expert-topics/custom-management-commands","22.advanced-and-expert-topics/08.custom-management-commands",{"title":835,"path":836,"stem":837},"Working with Signals","/advanced-and-expert-topics/working-with-signals","22.advanced-and-expert-topics/09.working-with-signals",{"title":839,"path":840,"stem":841},"Building Reusable Django Packages","/advanced-and-expert-topics/building-reusable-django-packages","22.advanced-and-expert-topics/10.building-reusable-django-packages",{"title":843,"path":844,"stem":845},"Integrating Microservices","/advanced-and-expert-topics/integrating-microservices","22.advanced-and-expert-topics/11.integrating-microservices",{"title":847,"path":848,"stem":849},"Advanced Security Hardening","/advanced-and-expert-topics/advanced-security-hardening","22.advanced-and-expert-topics/12.advanced-security-hardening",{"title":851,"path":852,"stem":853,"children":854},"Logging in Django","/logging-in-django","23.logging-in-django/01.index",[855],{"title":851,"path":852,"stem":853},{"title":857,"path":858,"stem":859,"children":860},"FAQ and Troubleshooting","/faq-and-troubleshooting","24.faq-and-troubleshooting/01.index",[861],{"title":857,"path":858,"stem":859},{"title":863,"path":864,"stem":865,"children":866},"External Packages and Ecosystem","/external-packages-and-ecosystem","25.external-packages-and-ecosystem/01.index",[867],{"title":863,"path":864,"stem":865},{"title":869,"path":870,"stem":871,"children":872},"Django Internals and Contributing","/django-internals-and-contributing","26.django-internals-and-contributing/01.index",[873],{"title":869,"path":870,"stem":871},{"title":875,"path":876,"stem":877,"children":878},"Microservices with Django","/microservices-with-django","27.microservices-with-django/01.index",[879,880,884,888,892,896,900,904,908,912,916,920,924],{"title":875,"path":876,"stem":877},{"title":881,"path":882,"stem":883},"What Is a Microservice?","/microservices-with-django/what-is-a-microservice","27.microservices-with-django/02.what-is-a-microservice",{"title":885,"path":886,"stem":887},"Introducing the Django Microservices Architecture","/microservices-with-django/django-microservices-architecture","27.microservices-with-django/03.django-microservices-architecture",{"title":889,"path":890,"stem":891},"Setting Up the Development and Runtime Environment","/microservices-with-django/development-environment","27.microservices-with-django/04.development-environment",{"title":893,"path":894,"stem":895},"Cloud-native Data Processing with MongoDB","/microservices-with-django/cloud-native-data-processing","27.microservices-with-django/05.cloud-native-data-processing",{"title":897,"path":898,"stem":899},"Creating RESTful APIs for Microservices","/microservices-with-django/restful-apis","27.microservices-with-django/06.restful-apis",{"title":901,"path":902,"stem":903},"Orchestrating Microservices with Celery and RabbitMQ","/microservices-with-django/orchestrating-celery-rabbitmq","27.microservices-with-django/07.orchestrating-celery-rabbitmq",{"title":905,"path":906,"stem":907},"Testing Microservices","/microservices-with-django/testing-microservices","27.microservices-with-django/08.testing-microservices",{"title":909,"path":910,"stem":911},"Deploying Microservices","/microservices-with-django/deploying-microservices","27.microservices-with-django/09.deploying-microservices",{"title":913,"path":914,"stem":915},"Securing Microservices","/microservices-with-django/securing-microservices","27.microservices-with-django/10.securing-microservices",{"title":917,"path":918,"stem":919},"Improving Microservices Performance with Caching","/microservices-with-django/performance-caching","27.microservices-with-django/11.performance-caching",{"title":921,"path":922,"stem":923},"Best Practices","/microservices-with-django/best-practices","27.microservices-with-django/12.best-practices",{"title":925,"path":926,"stem":927},"Transforming a Monolithic Web App into a Microservice version","/microservices-with-django/monolith-to-microservices","27.microservices-with-django/13.monolith-to-microservices",{"title":929,"path":930,"stem":931,"children":932},"Releases","/releases","releases",[933,936,940,944,948,952,956,960,964,968,972,976,980,984,988,992,996,1000,1004,1008,1012],{"title":934,"path":930,"stem":935},"Django Releases","releases/index",{"title":937,"path":938,"stem":939},"Django 5.1.10 release notes","/releases/5.1.10","releases/5.1.10",{"title":941,"path":942,"stem":943},"Django 5.1.11 release notes","/releases/5.1.11","releases/5.1.11",{"title":945,"path":946,"stem":947},"Django 5.1.12 release notes","/releases/5.1.12","releases/5.1.12",{"title":949,"path":950,"stem":951},"Django 5.1.13 release notes","/releases/5.1.13","releases/5.1.13",{"title":953,"path":954,"stem":955},"Django 5.1.14 release notes","/releases/5.1.14","releases/5.1.14",{"title":957,"path":958,"stem":959},"Django 5.1.15 release notes","/releases/5.1.15","releases/5.1.15",{"title":961,"path":962,"stem":963},"Django 5.2 release notes","/releases/5.2","releases/5.2",{"title":965,"path":966,"stem":967},"Django 5.2.1 release notes","/releases/5.2.1","releases/5.2.1",{"title":969,"path":970,"stem":971},"Django 5.2.10 release notes","/releases/5.2.10","releases/5.2.10",{"title":973,"path":974,"stem":975},"Django 5.2.2 release notes","/releases/5.2.2","releases/5.2.2",{"title":977,"path":978,"stem":979},"Django 5.2.3 release notes","/releases/5.2.3","releases/5.2.3",{"title":981,"path":982,"stem":983},"Django 5.2.4 release notes","/releases/5.2.4","releases/5.2.4",{"title":985,"path":986,"stem":987},"Django 5.2.5 release notes","/releases/5.2.5","releases/5.2.5",{"title":989,"path":990,"stem":991},"Django 5.2.6 release notes","/releases/5.2.6","releases/5.2.6",{"title":993,"path":994,"stem":995},"Django 5.2.7 release notes","/releases/5.2.7","releases/5.2.7",{"title":997,"path":998,"stem":999},"Django 5.2.8 release notes","/releases/5.2.8","releases/5.2.8",{"title":1001,"path":1002,"stem":1003},"Django 5.2.9 release notes","/releases/5.2.9","releases/5.2.9",{"title":1005,"path":1006,"stem":1007},"Django 6.0 release notes","/releases/6.0","releases/6.0",{"title":1009,"path":1010,"stem":1011},"Django 6.0.1 release notes","/releases/6.0.1","releases/6.0.1",{"title":1013,"path":1014,"stem":1015},"Django 6.1 release notes - UNDER DEVELOPMENT","/releases/6.1","releases/6.1",{"id":1017,"title":905,"body":1018,"description":1028,"extension":36221,"links":36222,"meta":36223,"navigation":1526,"path":906,"seo":36224,"stem":907,"__hash__":36225},"docs/27.microservices-with-django/08.testing-microservices.md",{"type":1019,"value":1020,"toc":36168},"minimark",[1021,1025,1029,1034,1037,1042,1049,1055,1061,1067,1073,1077,1080,1111,1115,1118,1122,1155,1159,1185,1189,1192,1196,1284,1290,1304,1308,1363,1369,1393,1397,1422,1428,1432,1472,1478,1482,1549,1555,1559,1562,1566,1569,1593,1597,1600,3051,3056,3101,3105,3108,3635,3638,4425,4430,4462,4467,4627,4631,4634,4638,4648,4651,4655,4658,6508,6513,6545,6549,6552,9307,9312,9361,9364,9367,9371,9374,9379,9390,9396,9400,9426,9430,9433,11701,11706,11738,11742,11745,13329,13334,13442,13447,13479,13484,13516,13520,13523,13527,13535,13538,13552,13556,16826,16831,16862,16866,16869,16874,16899,20150,20155,20371,20376,20451,20456,20494,20498,20501,20505,20510,20524,20529,20555,20559,20573,20577,26398,26403,26508,26513,26769,26774,26824,26828,26831,26835,26838,26864,26868,26873,26905,26909,26912,31130,31135,31336,31341,31348,31353,31403,31408,31465,31468,31472,31475,31479,31482,31748,31752,31755,32845,32849,32852,35206,35210,35213,36012,36085,36161,36164],[1022,1023,905],"h1",{"id":1024},"testing-microservices",[1026,1027,1028],"p",{},"Testing microservices presents unique challenges compared to monolithic applications. This chapter covers comprehensive testing strategies, tools, and best practices for ensuring reliability and quality in your Django microservices architecture.",[1030,1031,1033],"h2",{"id":1032},"understanding-microservices-testing-challenges","Understanding Microservices Testing Challenges",[1026,1035,1036],{},"Testing microservices is fundamentally different from testing monolithic applications. While a monolith has all its components in one place, microservices are distributed across multiple services, each with its own database, API, and business logic. This distribution creates unique testing challenges that require specialized approaches.",[1038,1039,1041],"h3",{"id":1040},"why-microservices-testing-is-complex","Why Microservices Testing is Complex",[1026,1043,1044,1048],{},[1045,1046,1047],"strong",{},"Service Dependencies",": In a monolith, if you need user data for an order test, you simply query the user table. In microservices, the order service might need to call the user service over HTTP, which introduces network latency, potential failures, and the need for the user service to be running during tests.",[1026,1050,1051,1054],{},[1045,1052,1053],{},"Data Consistency",": Each service typically has its own database. Testing scenarios that involve multiple services means dealing with eventual consistency - data might not be immediately available across all services after an operation.",[1026,1056,1057,1060],{},[1045,1058,1059],{},"Network Reliability",": Services communicate over the network, which can fail, timeout, or be slow. Your tests need to account for these real-world conditions.",[1026,1062,1063,1066],{},[1045,1064,1065],{},"Environment Complexity",": Running tests might require spinning up multiple services, databases, message queues, and other infrastructure components.",[1026,1068,1069,1072],{},[1045,1070,1071],{},"Integration Points",": The interfaces between services (APIs, message queues, shared databases) become critical points that need thorough testing.",[1038,1074,1076],{"id":1075},"the-microservices-testing-strategy","The Microservices Testing Strategy",[1026,1078,1079],{},"To address these challenges, we use a layered testing approach:",[1081,1082,1083,1090,1096,1101,1106],"ul",{},[1084,1085,1086,1089],"li",{},[1045,1087,1088],{},"Service Isolation",": Each service must be testable independently",[1084,1091,1092,1095],{},[1045,1093,1094],{},"Inter-service Communication",": Testing API contracts and message passing",[1084,1097,1098,1100],{},[1045,1099,1053],{},": Ensuring data integrity across distributed systems",[1084,1102,1103,1105],{},[1045,1104,1059],{},": Handling network failures and timeouts",[1084,1107,1108,1110],{},[1045,1109,1065],{},": Managing multiple services and dependencies",[1030,1112,1114],{"id":1113},"testing-pyramid-for-microservices","Testing Pyramid for Microservices",[1026,1116,1117],{},"The testing pyramid for microservices is a strategy that helps you balance test coverage, execution speed, and maintenance effort. Think of it as a pyramid where the base (unit tests) is wide and the top (end-to-end tests) is narrow.",[1038,1119,1121],{"id":1120},"understanding-the-test-pyramid-layers","Understanding the Test Pyramid Layers",[1123,1124,1125,1131,1137,1143,1149],"ol",{},[1084,1126,1127,1130],{},[1045,1128,1129],{},"Unit Tests (70% of your tests)",": These test individual functions, classes, or methods in isolation. They're fast, reliable, and easy to debug. In microservices, unit tests focus on the business logic within a single service.",[1084,1132,1133,1136],{},[1045,1134,1135],{},"Integration Tests (20% of your tests)",": These test how different components within a service work together - for example, how your Django views interact with your database models, or how your service layer calls external APIs.",[1084,1138,1139,1142],{},[1045,1140,1141],{},"Contract Tests (5% of your tests)",": These verify that services can communicate correctly by testing the \"contracts\" (API specifications) between services. They ensure that when Service A calls Service B, both sides understand the request and response format.",[1084,1144,1145,1148],{},[1045,1146,1147],{},"Component Tests (3% of your tests)",": These test an entire service in isolation, with all external dependencies mocked or stubbed. They verify that your service works correctly as a black box.",[1084,1150,1151,1154],{},[1045,1152,1153],{},"End-to-End Tests (2% of your tests)",": These test complete user journeys across multiple services. They're slow and brittle but provide confidence that your entire system works together.",[1038,1156,1158],{"id":1157},"why-this-distribution-matters","Why This Distribution Matters",[1081,1160,1161,1167,1173,1179],{},[1084,1162,1163,1166],{},[1045,1164,1165],{},"Speed",": Unit tests run in milliseconds, while end-to-end tests might take minutes",[1084,1168,1169,1172],{},[1045,1170,1171],{},"Reliability",": Unit tests rarely fail due to environmental issues, while end-to-end tests can fail due to network problems, timing issues, or infrastructure problems",[1084,1174,1175,1178],{},[1045,1176,1177],{},"Debugging",": When a unit test fails, you know exactly where the problem is. When an end-to-end test fails, the problem could be anywhere in the system",[1084,1180,1181,1184],{},[1045,1182,1183],{},"Maintenance",": Unit tests are easy to maintain, while end-to-end tests require constant updates as the system evolves",[1030,1186,1188],{"id":1187},"technical-requirements","Technical Requirements",[1026,1190,1191],{},"Setting up a comprehensive testing environment for microservices requires several specialized tools. Let's understand what each tool does and why you need it:",[1038,1193,1195],{"id":1194},"core-testing-framework","Core Testing Framework",[1197,1198,1203],"pre",{"className":1199,"code":1200,"language":1201,"meta":1202,"style":1202},"language-bash shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# Core testing frameworks\npip install pytest==7.4.0           # Modern Python testing framework\npip install pytest-django==4.5.2    # Django integration for pytest\npip install pytest-asyncio==0.21.1  # Support for async/await tests\npip install pytest-mock==3.11.1     # Mocking utilities for pytest\n","bash","",[1204,1205,1206,1215,1236,1252,1268],"code",{"__ignoreMap":1202},[1207,1208,1211],"span",{"class":1209,"line":1210},"line",1,[1207,1212,1214],{"class":1213},"s9Tkl","# Core testing frameworks\n",[1207,1216,1218,1222,1226,1229,1233],{"class":1209,"line":1217},2,[1207,1219,1221],{"class":1220},"sYn-s","pip",[1207,1223,1225],{"class":1224},"sTbE_"," install",[1207,1227,1228],{"class":1224}," pytest==",[1207,1230,1232],{"class":1231},"s7CZa","7.4.0",[1207,1234,1235],{"class":1213},"           # Modern Python testing framework\n",[1207,1237,1239,1241,1243,1246,1249],{"class":1209,"line":1238},3,[1207,1240,1221],{"class":1220},[1207,1242,1225],{"class":1224},[1207,1244,1245],{"class":1224}," pytest-django==",[1207,1247,1248],{"class":1231},"4.5.2",[1207,1250,1251],{"class":1213},"    # Django integration for pytest\n",[1207,1253,1255,1257,1259,1262,1265],{"class":1209,"line":1254},4,[1207,1256,1221],{"class":1220},[1207,1258,1225],{"class":1224},[1207,1260,1261],{"class":1224}," pytest-asyncio==",[1207,1263,1264],{"class":1231},"0.21.1",[1207,1266,1267],{"class":1213},"  # Support for async/await tests\n",[1207,1269,1271,1273,1275,1278,1281],{"class":1209,"line":1270},5,[1207,1272,1221],{"class":1220},[1207,1274,1225],{"class":1224},[1207,1276,1277],{"class":1224}," pytest-mock==",[1207,1279,1280],{"class":1231},"3.11.1",[1207,1282,1283],{"class":1213},"     # Mocking utilities for pytest\n",[1026,1285,1286,1289],{},[1045,1287,1288],{},"Why pytest?"," Unlike Django's built-in unittest framework, pytest offers:",[1081,1291,1292,1295,1298,1301],{},[1084,1293,1294],{},"More readable test syntax (no need for classes)",[1084,1296,1297],{},"Better error messages and debugging",[1084,1299,1300],{},"Powerful fixture system for test setup",[1084,1302,1303],{},"Extensive plugin ecosystem",[1038,1305,1307],{"id":1306},"api-testing-tools","API Testing Tools",[1197,1309,1311],{"className":1199,"code":1310,"language":1201,"meta":1202,"style":1202},"# API testing\npip install requests-mock==1.11.0    # Mock HTTP requests in tests\npip install responses==0.23.1        # Alternative HTTP mocking library\npip install httpx==0.24.1           # Modern HTTP client with async support\n",[1204,1312,1313,1318,1333,1348],{"__ignoreMap":1202},[1207,1314,1315],{"class":1209,"line":1210},[1207,1316,1317],{"class":1213},"# API testing\n",[1207,1319,1320,1322,1324,1327,1330],{"class":1209,"line":1217},[1207,1321,1221],{"class":1220},[1207,1323,1225],{"class":1224},[1207,1325,1326],{"class":1224}," requests-mock==",[1207,1328,1329],{"class":1231},"1.11.0",[1207,1331,1332],{"class":1213},"    # Mock HTTP requests in tests\n",[1207,1334,1335,1337,1339,1342,1345],{"class":1209,"line":1238},[1207,1336,1221],{"class":1220},[1207,1338,1225],{"class":1224},[1207,1340,1341],{"class":1224}," responses==",[1207,1343,1344],{"class":1231},"0.23.1",[1207,1346,1347],{"class":1213},"        # Alternative HTTP mocking library\n",[1207,1349,1350,1352,1354,1357,1360],{"class":1209,"line":1254},[1207,1351,1221],{"class":1220},[1207,1353,1225],{"class":1224},[1207,1355,1356],{"class":1224}," httpx==",[1207,1358,1359],{"class":1231},"0.24.1",[1207,1361,1362],{"class":1213},"           # Modern HTTP client with async support\n",[1026,1364,1365,1368],{},[1045,1366,1367],{},"Why these tools?"," In microservices, you'll frequently test HTTP API calls:",[1081,1370,1371,1381,1387],{},[1084,1372,1373,1376,1377,1380],{},[1204,1374,1375],{},"requests-mock",": Intercepts HTTP calls made by the ",[1204,1378,1379],{},"requests"," library",[1084,1382,1383,1386],{},[1204,1384,1385],{},"responses",": Similar to requests-mock but with different API",[1084,1388,1389,1392],{},[1204,1390,1391],{},"httpx",": Modern HTTP client that supports both sync and async operations",[1038,1394,1396],{"id":1395},"contract-testing","Contract Testing",[1197,1398,1400],{"className":1199,"code":1399,"language":1201,"meta":1202,"style":1202},"# Contract testing\npip install pact-python==1.6.0      # Consumer-driven contract testing\n",[1204,1401,1402,1407],{"__ignoreMap":1202},[1207,1403,1404],{"class":1209,"line":1210},[1207,1405,1406],{"class":1213},"# Contract testing\n",[1207,1408,1409,1411,1413,1416,1419],{"class":1209,"line":1217},[1207,1410,1221],{"class":1220},[1207,1412,1225],{"class":1224},[1207,1414,1415],{"class":1224}," pact-python==",[1207,1417,1418],{"class":1231},"1.6.0",[1207,1420,1421],{"class":1213},"      # Consumer-driven contract testing\n",[1026,1423,1424,1427],{},[1045,1425,1426],{},"What is contract testing?"," When Service A calls Service B, both services need to agree on the API format. Contract testing ensures this agreement is maintained even as services evolve independently.",[1038,1429,1431],{"id":1430},"test-data-generation","Test Data Generation",[1197,1433,1435],{"className":1199,"code":1434,"language":1201,"meta":1202,"style":1202},"# Test data and factories\npip install factory-boy==3.3.0      # Generate test data objects\npip install faker==19.3.0           # Generate realistic fake data\n",[1204,1436,1437,1442,1457],{"__ignoreMap":1202},[1207,1438,1439],{"class":1209,"line":1210},[1207,1440,1441],{"class":1213},"# Test data and factories\n",[1207,1443,1444,1446,1448,1451,1454],{"class":1209,"line":1217},[1207,1445,1221],{"class":1220},[1207,1447,1225],{"class":1224},[1207,1449,1450],{"class":1224}," factory-boy==",[1207,1452,1453],{"class":1231},"3.3.0",[1207,1455,1456],{"class":1213},"      # Generate test data objects\n",[1207,1458,1459,1461,1463,1466,1469],{"class":1209,"line":1238},[1207,1460,1221],{"class":1220},[1207,1462,1225],{"class":1224},[1207,1464,1465],{"class":1224}," faker==",[1207,1467,1468],{"class":1231},"19.3.0",[1207,1470,1471],{"class":1213},"           # Generate realistic fake data\n",[1026,1473,1474,1477],{},[1045,1475,1476],{},"Why factories?"," Instead of manually creating test data, factories generate realistic test objects automatically. This makes tests more maintainable and realistic.",[1038,1479,1481],{"id":1480},"coverage-and-reporting","Coverage and Reporting",[1197,1483,1485],{"className":1199,"code":1484,"language":1201,"meta":1202,"style":1202},"# Coverage and reporting\npip install pytest-cov==4.1.0       # Code coverage for pytest\npip install coverage==7.2.7         # Core coverage measurement tool\n\n# Load testing\npip install locust==2.15.1          # Performance and load testing\n",[1204,1486,1487,1492,1507,1522,1528,1533],{"__ignoreMap":1202},[1207,1488,1489],{"class":1209,"line":1210},[1207,1490,1491],{"class":1213},"# Coverage and reporting\n",[1207,1493,1494,1496,1498,1501,1504],{"class":1209,"line":1217},[1207,1495,1221],{"class":1220},[1207,1497,1225],{"class":1224},[1207,1499,1500],{"class":1224}," pytest-cov==",[1207,1502,1503],{"class":1231},"4.1.0",[1207,1505,1506],{"class":1213},"       # Code coverage for pytest\n",[1207,1508,1509,1511,1513,1516,1519],{"class":1209,"line":1238},[1207,1510,1221],{"class":1220},[1207,1512,1225],{"class":1224},[1207,1514,1515],{"class":1224}," coverage==",[1207,1517,1518],{"class":1231},"7.2.7",[1207,1520,1521],{"class":1213},"         # Core coverage measurement tool\n",[1207,1523,1524],{"class":1209,"line":1254},[1207,1525,1527],{"emptyLinePlaceholder":1526},true,"\n",[1207,1529,1530],{"class":1209,"line":1270},[1207,1531,1532],{"class":1213},"# Load testing\n",[1207,1534,1536,1538,1540,1543,1546],{"class":1209,"line":1535},6,[1207,1537,1221],{"class":1220},[1207,1539,1225],{"class":1224},[1207,1541,1542],{"class":1224}," locust==",[1207,1544,1545],{"class":1231},"2.15.1",[1207,1547,1548],{"class":1213},"          # Performance and load testing\n",[1026,1550,1551,1554],{},[1045,1552,1553],{},"Code coverage"," tells you which parts of your code are tested. While 100% coverage doesn't guarantee bug-free code, it helps identify untested areas.",[1030,1556,1558],{"id":1557},"unit-testing-django-services","Unit Testing Django Services",[1026,1560,1561],{},"Unit tests are the foundation of your testing strategy. They test individual pieces of code in isolation, without dependencies on databases, external services, or complex setup. Think of unit tests as testing individual LEGO blocks before you build a castle.",[1038,1563,1565],{"id":1564},"why-unit-tests-matter-in-microservices","Why Unit Tests Matter in Microservices",[1026,1567,1568],{},"In microservices, unit tests are even more critical because:",[1081,1570,1571,1577,1583,1588],{},[1084,1572,1573,1576],{},[1045,1574,1575],{},"Fast Feedback",": They run in milliseconds, giving you immediate feedback",[1084,1578,1579,1582],{},[1045,1580,1581],{},"Isolation",": They don't require other services to be running",[1084,1584,1585,1587],{},[1045,1586,1171],{},": They rarely fail due to environmental issues",[1084,1589,1590,1592],{},[1045,1591,1177],{},": When they fail, you know exactly where the problem is",[1038,1594,1596],{"id":1595},"service-layer-testing","Service Layer Testing",[1026,1598,1599],{},"The service layer contains your business logic - the core rules and operations of your application. Testing this layer ensures your business rules work correctly regardless of how they're accessed (via API, CLI, or other interfaces).",[1197,1601,1605],{"className":1602,"code":1603,"language":1604,"meta":1202,"style":1202},"language-python shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# user_service/tests/test_services.py\nimport pytest\nfrom unittest.mock import Mock, patch\nfrom django.test import TestCase\nfrom django.contrib.auth.models import User\nfrom user_service.services import UserService\nfrom user_service.exceptions import UserNotFoundError\n\nclass TestUserService:\n    \"\"\"\n    Test class for UserService business logic\n    \n    We use pytest-style classes instead of Django's TestCase for unit tests\n    because they're faster and don't require database setup.\n    \"\"\"\n    \n    @pytest.fixture\n    def user_service(self):\n        \"\"\"\n        Fixture that provides a UserService instance for each test\n        \n        Fixtures are pytest's way of providing test setup. This fixture\n        runs before each test method and provides a fresh UserService instance.\n        \"\"\"\n        return UserService()\n    \n    @pytest.fixture\n    def sample_user(self):\n        \"\"\"\n        Fixture that creates a test user in the database\n        \n        The @pytest.mark.django_db decorator (used on test methods) tells pytest\n        that this test needs database access. Without it, database operations fail.\n        \"\"\"\n        return User.objects.create_user(\n            username='testuser',\n            email='test@example.com',\n            password='testpass123'\n        )\n    \n    @pytest.mark.django_db\n    def test_get_user_by_id_success(self, user_service, sample_user):\n        \"\"\"\n        Test successful user retrieval by ID\n        \n        This test verifies the happy path - when everything works correctly.\n        We test that:\n        1. The method returns a user object\n        2. The returned user has the correct attributes\n        \"\"\"\n        # Act: Call the method we're testing\n        result = user_service.get_user_by_id(sample_user.id)\n        \n        # Assert: Verify the results are what we expect\n        assert result.id == sample_user.id\n        assert result.username == 'testuser'\n        assert result.email == 'test@example.com'\n    \n    @pytest.mark.django_db\n    def test_get_user_by_id_not_found(self, user_service):\n        \"\"\"\n        Test user retrieval with non-existent ID\n        \n        This test verifies error handling - what happens when things go wrong.\n        We expect a specific exception to be raised.\n        \"\"\"\n        # Act & Assert: We expect this to raise an exception\n        with pytest.raises(UserNotFoundError):\n            user_service.get_user_by_id(99999)  # ID that doesn't exist\n    \n    @patch('user_service.tasks.send_welcome_email.delay')\n    def test_create_user_triggers_welcome_email(self, mock_email_task, user_service):\n        \"\"\"\n        Test that user creation triggers welcome email task\n        \n        This test uses mocking to verify that our service calls external dependencies\n        (in this case, a Celery task) without actually executing them.\n        \n        The @patch decorator replaces the real send_welcome_email.delay function\n        with a mock object that we can inspect.\n        \"\"\"\n        # Arrange: Set up test data\n        user_data = {\n            'username': 'newuser',\n            'email': 'new@example.com',\n            'password': 'newpass123',\n            'first_name': 'New',\n            'last_name': 'User'\n        }\n        \n        # Act: Call the method we're testing\n        user = user_service.create_user(user_data)\n        \n        # Assert: Verify the user was created correctly\n        assert user.username == 'newuser'\n        \n        # Assert: Verify the welcome email task was called\n        mock_email_task.assert_called_once_with(user.id)\n    \n    @patch('user_service.services.requests.post')\n    def test_notify_other_services(self, mock_post, user_service, sample_user):\n        \"\"\"\n        Test notification to other services\n        \n        This test mocks HTTP requests to external services. We don't want our\n        unit tests to make real HTTP calls because:\n        1. They would be slow\n        2. They would require other services to be running\n        3. They could fail due to network issues\n        \"\"\"\n        # Arrange: Set up the mock to return a successful response\n        mock_post.return_value.status_code = 200\n        mock_post.return_value.json.return_value = {'success': True}\n        \n        # Act: Call the method we're testing\n        result = user_service.notify_profile_update(\n            sample_user.id, \n            {'first_name': 'Updated'}\n        )\n        \n        # Assert: Verify the method returned success\n        assert result is True\n        \n        # Assert: Verify HTTP requests were made to both services\n        assert mock_post.call_count == 2  # Called for each service\n        \n        # You can also verify the exact calls that were made:\n        calls = mock_post.call_args_list\n        assert 'order-service' in calls[0][1]['url']  # First call to order service\n        assert 'notification-service' in calls[1][1]['url']  # Second call to notification service\n","python",[1204,1606,1607,1612,1622,1648,1665,1691,1708,1725,1730,1744,1751,1758,1764,1770,1776,1781,1786,1801,1819,1825,1831,1837,1843,1849,1854,1867,1872,1883,1897,1902,1908,1913,1919,1925,1930,1952,1974,1991,2007,2013,2018,2035,2058,2063,2069,2074,2080,2086,2092,2098,2103,2109,2137,2142,2148,2172,2193,2213,2218,2233,2251,2256,2262,2267,2273,2279,2284,2290,2311,2332,2337,2356,2379,2384,2390,2395,2401,2407,2412,2418,2424,2429,2435,2446,2468,2488,2509,2530,2549,2555,2560,2565,2586,2591,2597,2617,2622,2628,2650,2655,2673,2700,2705,2711,2716,2722,2728,2734,2740,2746,2751,2757,2779,2818,2823,2828,2844,2859,2882,2887,2892,2898,2912,2917,2923,2943,2948,2954,2969,3014],{"__ignoreMap":1202},[1207,1608,1609],{"class":1209,"line":1210},[1207,1610,1611],{"class":1213},"# user_service/tests/test_services.py\n",[1207,1613,1614,1618],{"class":1209,"line":1217},[1207,1615,1617],{"class":1616},"siDh9","import",[1207,1619,1621],{"class":1620},"sftqT"," pytest\n",[1207,1623,1624,1627,1630,1634,1637,1639,1642,1645],{"class":1209,"line":1238},[1207,1625,1626],{"class":1616},"from",[1207,1628,1629],{"class":1620}," unittest",[1207,1631,1633],{"class":1632},"soVBu",".",[1207,1635,1636],{"class":1620},"mock ",[1207,1638,1617],{"class":1616},[1207,1640,1641],{"class":1620}," Mock",[1207,1643,1644],{"class":1632},",",[1207,1646,1647],{"class":1620}," patch\n",[1207,1649,1650,1652,1655,1657,1660,1662],{"class":1209,"line":1254},[1207,1651,1626],{"class":1616},[1207,1653,1654],{"class":1620}," django",[1207,1656,1633],{"class":1632},[1207,1658,1659],{"class":1620},"test ",[1207,1661,1617],{"class":1616},[1207,1663,1664],{"class":1620}," TestCase\n",[1207,1666,1667,1669,1671,1673,1676,1678,1681,1683,1686,1688],{"class":1209,"line":1270},[1207,1668,1626],{"class":1616},[1207,1670,1654],{"class":1620},[1207,1672,1633],{"class":1632},[1207,1674,1675],{"class":1620},"contrib",[1207,1677,1633],{"class":1632},[1207,1679,1680],{"class":1620},"auth",[1207,1682,1633],{"class":1632},[1207,1684,1685],{"class":1620},"models ",[1207,1687,1617],{"class":1616},[1207,1689,1690],{"class":1620}," User\n",[1207,1692,1693,1695,1698,1700,1703,1705],{"class":1209,"line":1535},[1207,1694,1626],{"class":1616},[1207,1696,1697],{"class":1620}," user_service",[1207,1699,1633],{"class":1632},[1207,1701,1702],{"class":1620},"services ",[1207,1704,1617],{"class":1616},[1207,1706,1707],{"class":1620}," UserService\n",[1207,1709,1711,1713,1715,1717,1720,1722],{"class":1209,"line":1710},7,[1207,1712,1626],{"class":1616},[1207,1714,1697],{"class":1620},[1207,1716,1633],{"class":1632},[1207,1718,1719],{"class":1620},"exceptions ",[1207,1721,1617],{"class":1616},[1207,1723,1724],{"class":1620}," UserNotFoundError\n",[1207,1726,1728],{"class":1209,"line":1727},8,[1207,1729,1527],{"emptyLinePlaceholder":1526},[1207,1731,1733,1737,1741],{"class":1209,"line":1732},9,[1207,1734,1736],{"class":1735},"s5Kfy","class",[1207,1738,1740],{"class":1739},"sD-vU"," TestUserService",[1207,1742,1743],{"class":1632},":\n",[1207,1745,1747],{"class":1209,"line":1746},10,[1207,1748,1750],{"class":1749},"sm7ve","    \"\"\"\n",[1207,1752,1754],{"class":1209,"line":1753},11,[1207,1755,1757],{"class":1756},"sVyVU","    Test class for UserService business logic\n",[1207,1759,1761],{"class":1209,"line":1760},12,[1207,1762,1763],{"class":1756},"    \n",[1207,1765,1767],{"class":1209,"line":1766},13,[1207,1768,1769],{"class":1756},"    We use pytest-style classes instead of Django's TestCase for unit tests\n",[1207,1771,1773],{"class":1209,"line":1772},14,[1207,1774,1775],{"class":1756},"    because they're faster and don't require database setup.\n",[1207,1777,1779],{"class":1209,"line":1778},15,[1207,1780,1750],{"class":1749},[1207,1782,1784],{"class":1209,"line":1783},16,[1207,1785,1763],{"class":1620},[1207,1787,1789,1792,1796,1798],{"class":1209,"line":1788},17,[1207,1790,1791],{"class":1632},"    @",[1207,1793,1795],{"class":1794},"sljsM","pytest",[1207,1797,1633],{"class":1632},[1207,1799,1800],{"class":1794},"fixture\n",[1207,1802,1804,1807,1809,1812,1816],{"class":1209,"line":1803},18,[1207,1805,1806],{"class":1735},"    def",[1207,1808,1697],{"class":1794},[1207,1810,1811],{"class":1632},"(",[1207,1813,1815],{"class":1814},"sRjD_","self",[1207,1817,1818],{"class":1632},"):\n",[1207,1820,1822],{"class":1209,"line":1821},19,[1207,1823,1824],{"class":1749},"        \"\"\"\n",[1207,1826,1828],{"class":1209,"line":1827},20,[1207,1829,1830],{"class":1756},"        Fixture that provides a UserService instance for each test\n",[1207,1832,1834],{"class":1209,"line":1833},21,[1207,1835,1836],{"class":1756},"        \n",[1207,1838,1840],{"class":1209,"line":1839},22,[1207,1841,1842],{"class":1756},"        Fixtures are pytest's way of providing test setup. This fixture\n",[1207,1844,1846],{"class":1209,"line":1845},23,[1207,1847,1848],{"class":1756},"        runs before each test method and provides a fresh UserService instance.\n",[1207,1850,1852],{"class":1209,"line":1851},24,[1207,1853,1824],{"class":1749},[1207,1855,1857,1860,1864],{"class":1209,"line":1856},25,[1207,1858,1859],{"class":1616},"        return",[1207,1861,1863],{"class":1862},"siWMO"," UserService",[1207,1865,1866],{"class":1632},"()\n",[1207,1868,1870],{"class":1209,"line":1869},26,[1207,1871,1763],{"class":1620},[1207,1873,1875,1877,1879,1881],{"class":1209,"line":1874},27,[1207,1876,1791],{"class":1632},[1207,1878,1795],{"class":1794},[1207,1880,1633],{"class":1632},[1207,1882,1800],{"class":1794},[1207,1884,1886,1888,1891,1893,1895],{"class":1209,"line":1885},28,[1207,1887,1806],{"class":1735},[1207,1889,1890],{"class":1794}," sample_user",[1207,1892,1811],{"class":1632},[1207,1894,1815],{"class":1814},[1207,1896,1818],{"class":1632},[1207,1898,1900],{"class":1209,"line":1899},29,[1207,1901,1824],{"class":1749},[1207,1903,1905],{"class":1209,"line":1904},30,[1207,1906,1907],{"class":1756},"        Fixture that creates a test user in the database\n",[1207,1909,1911],{"class":1209,"line":1910},31,[1207,1912,1836],{"class":1756},[1207,1914,1916],{"class":1209,"line":1915},32,[1207,1917,1918],{"class":1756},"        The @pytest.mark.django_db decorator (used on test methods) tells pytest\n",[1207,1920,1922],{"class":1209,"line":1921},33,[1207,1923,1924],{"class":1756},"        that this test needs database access. Without it, database operations fail.\n",[1207,1926,1928],{"class":1209,"line":1927},34,[1207,1929,1824],{"class":1749},[1207,1931,1933,1935,1938,1940,1944,1946,1949],{"class":1209,"line":1932},35,[1207,1934,1859],{"class":1616},[1207,1936,1937],{"class":1620}," User",[1207,1939,1633],{"class":1632},[1207,1941,1943],{"class":1942},"sBPpx","objects",[1207,1945,1633],{"class":1632},[1207,1947,1948],{"class":1862},"create_user",[1207,1950,1951],{"class":1632},"(\n",[1207,1953,1955,1959,1962,1966,1969,1971],{"class":1209,"line":1954},36,[1207,1956,1958],{"class":1957},"sqOPj","            username",[1207,1960,1961],{"class":1632},"=",[1207,1963,1965],{"class":1964},"sbYkP","'",[1207,1967,1968],{"class":1224},"testuser",[1207,1970,1965],{"class":1964},[1207,1972,1973],{"class":1632},",\n",[1207,1975,1977,1980,1982,1984,1987,1989],{"class":1209,"line":1976},37,[1207,1978,1979],{"class":1957},"            email",[1207,1981,1961],{"class":1632},[1207,1983,1965],{"class":1964},[1207,1985,1986],{"class":1224},"test@example.com",[1207,1988,1965],{"class":1964},[1207,1990,1973],{"class":1632},[1207,1992,1994,1997,1999,2001,2004],{"class":1209,"line":1993},38,[1207,1995,1996],{"class":1957},"            password",[1207,1998,1961],{"class":1632},[1207,2000,1965],{"class":1964},[1207,2002,2003],{"class":1224},"testpass123",[1207,2005,2006],{"class":1964},"'\n",[1207,2008,2010],{"class":1209,"line":2009},39,[1207,2011,2012],{"class":1632},"        )\n",[1207,2014,2016],{"class":1209,"line":2015},40,[1207,2017,1763],{"class":1620},[1207,2019,2021,2023,2025,2027,2030,2032],{"class":1209,"line":2020},41,[1207,2022,1791],{"class":1632},[1207,2024,1795],{"class":1794},[1207,2026,1633],{"class":1632},[1207,2028,2029],{"class":1794},"mark",[1207,2031,1633],{"class":1632},[1207,2033,2034],{"class":1794},"django_db\n",[1207,2036,2038,2040,2043,2045,2047,2049,2052,2054,2056],{"class":1209,"line":2037},42,[1207,2039,1806],{"class":1735},[1207,2041,2042],{"class":1794}," test_get_user_by_id_success",[1207,2044,1811],{"class":1632},[1207,2046,1815],{"class":1814},[1207,2048,1644],{"class":1632},[1207,2050,1697],{"class":2051},"sCyAa",[1207,2053,1644],{"class":1632},[1207,2055,1890],{"class":2051},[1207,2057,1818],{"class":1632},[1207,2059,2061],{"class":1209,"line":2060},43,[1207,2062,1824],{"class":1749},[1207,2064,2066],{"class":1209,"line":2065},44,[1207,2067,2068],{"class":1756},"        Test successful user retrieval by ID\n",[1207,2070,2072],{"class":1209,"line":2071},45,[1207,2073,1836],{"class":1756},[1207,2075,2077],{"class":1209,"line":2076},46,[1207,2078,2079],{"class":1756},"        This test verifies the happy path - when everything works correctly.\n",[1207,2081,2083],{"class":1209,"line":2082},47,[1207,2084,2085],{"class":1756},"        We test that:\n",[1207,2087,2089],{"class":1209,"line":2088},48,[1207,2090,2091],{"class":1756},"        1. The method returns a user object\n",[1207,2093,2095],{"class":1209,"line":2094},49,[1207,2096,2097],{"class":1756},"        2. The returned user has the correct attributes\n",[1207,2099,2101],{"class":1209,"line":2100},50,[1207,2102,1824],{"class":1749},[1207,2104,2106],{"class":1209,"line":2105},51,[1207,2107,2108],{"class":1213},"        # Act: Call the method we're testing\n",[1207,2110,2112,2115,2117,2119,2121,2124,2126,2129,2131,2134],{"class":1209,"line":2111},52,[1207,2113,2114],{"class":1620},"        result ",[1207,2116,1961],{"class":1632},[1207,2118,1697],{"class":1620},[1207,2120,1633],{"class":1632},[1207,2122,2123],{"class":1862},"get_user_by_id",[1207,2125,1811],{"class":1632},[1207,2127,2128],{"class":1862},"sample_user",[1207,2130,1633],{"class":1632},[1207,2132,2133],{"class":1942},"id",[1207,2135,2136],{"class":1632},")\n",[1207,2138,2140],{"class":1209,"line":2139},53,[1207,2141,1836],{"class":1620},[1207,2143,2145],{"class":1209,"line":2144},54,[1207,2146,2147],{"class":1213},"        # Assert: Verify the results are what we expect\n",[1207,2149,2151,2154,2157,2159,2161,2165,2167,2169],{"class":1209,"line":2150},55,[1207,2152,2153],{"class":1616},"        assert",[1207,2155,2156],{"class":1620}," result",[1207,2158,1633],{"class":1632},[1207,2160,2133],{"class":1942},[1207,2162,2164],{"class":2163},"sVsLi"," ==",[1207,2166,1890],{"class":1620},[1207,2168,1633],{"class":1632},[1207,2170,2171],{"class":1942},"id\n",[1207,2173,2175,2177,2179,2181,2184,2186,2189,2191],{"class":1209,"line":2174},56,[1207,2176,2153],{"class":1616},[1207,2178,2156],{"class":1620},[1207,2180,1633],{"class":1632},[1207,2182,2183],{"class":1942},"username",[1207,2185,2164],{"class":2163},[1207,2187,2188],{"class":1964}," '",[1207,2190,1968],{"class":1224},[1207,2192,2006],{"class":1964},[1207,2194,2196,2198,2200,2202,2205,2207,2209,2211],{"class":1209,"line":2195},57,[1207,2197,2153],{"class":1616},[1207,2199,2156],{"class":1620},[1207,2201,1633],{"class":1632},[1207,2203,2204],{"class":1942},"email",[1207,2206,2164],{"class":2163},[1207,2208,2188],{"class":1964},[1207,2210,1986],{"class":1224},[1207,2212,2006],{"class":1964},[1207,2214,2216],{"class":1209,"line":2215},58,[1207,2217,1763],{"class":1620},[1207,2219,2221,2223,2225,2227,2229,2231],{"class":1209,"line":2220},59,[1207,2222,1791],{"class":1632},[1207,2224,1795],{"class":1794},[1207,2226,1633],{"class":1632},[1207,2228,2029],{"class":1794},[1207,2230,1633],{"class":1632},[1207,2232,2034],{"class":1794},[1207,2234,2236,2238,2241,2243,2245,2247,2249],{"class":1209,"line":2235},60,[1207,2237,1806],{"class":1735},[1207,2239,2240],{"class":1794}," test_get_user_by_id_not_found",[1207,2242,1811],{"class":1632},[1207,2244,1815],{"class":1814},[1207,2246,1644],{"class":1632},[1207,2248,1697],{"class":2051},[1207,2250,1818],{"class":1632},[1207,2252,2254],{"class":1209,"line":2253},61,[1207,2255,1824],{"class":1749},[1207,2257,2259],{"class":1209,"line":2258},62,[1207,2260,2261],{"class":1756},"        Test user retrieval with non-existent ID\n",[1207,2263,2265],{"class":1209,"line":2264},63,[1207,2266,1836],{"class":1756},[1207,2268,2270],{"class":1209,"line":2269},64,[1207,2271,2272],{"class":1756},"        This test verifies error handling - what happens when things go wrong.\n",[1207,2274,2276],{"class":1209,"line":2275},65,[1207,2277,2278],{"class":1756},"        We expect a specific exception to be raised.\n",[1207,2280,2282],{"class":1209,"line":2281},66,[1207,2283,1824],{"class":1749},[1207,2285,2287],{"class":1209,"line":2286},67,[1207,2288,2289],{"class":1213},"        # Act & Assert: We expect this to raise an exception\n",[1207,2291,2293,2296,2299,2301,2304,2306,2309],{"class":1209,"line":2292},68,[1207,2294,2295],{"class":1616},"        with",[1207,2297,2298],{"class":1620}," pytest",[1207,2300,1633],{"class":1632},[1207,2302,2303],{"class":1862},"raises",[1207,2305,1811],{"class":1632},[1207,2307,2308],{"class":1862},"UserNotFoundError",[1207,2310,1818],{"class":1632},[1207,2312,2314,2317,2319,2321,2323,2326,2329],{"class":1209,"line":2313},69,[1207,2315,2316],{"class":1620},"            user_service",[1207,2318,1633],{"class":1632},[1207,2320,2123],{"class":1862},[1207,2322,1811],{"class":1632},[1207,2324,2325],{"class":1231},"99999",[1207,2327,2328],{"class":1632},")",[1207,2330,2331],{"class":1213},"  # ID that doesn't exist\n",[1207,2333,2335],{"class":1209,"line":2334},70,[1207,2336,1763],{"class":1620},[1207,2338,2340,2342,2345,2347,2349,2352,2354],{"class":1209,"line":2339},71,[1207,2341,1791],{"class":1632},[1207,2343,2344],{"class":1794},"patch",[1207,2346,1811],{"class":1632},[1207,2348,1965],{"class":1964},[1207,2350,2351],{"class":1224},"user_service.tasks.send_welcome_email.delay",[1207,2353,1965],{"class":1964},[1207,2355,2136],{"class":1632},[1207,2357,2359,2361,2364,2366,2368,2370,2373,2375,2377],{"class":1209,"line":2358},72,[1207,2360,1806],{"class":1735},[1207,2362,2363],{"class":1794}," test_create_user_triggers_welcome_email",[1207,2365,1811],{"class":1632},[1207,2367,1815],{"class":1814},[1207,2369,1644],{"class":1632},[1207,2371,2372],{"class":2051}," mock_email_task",[1207,2374,1644],{"class":1632},[1207,2376,1697],{"class":2051},[1207,2378,1818],{"class":1632},[1207,2380,2382],{"class":1209,"line":2381},73,[1207,2383,1824],{"class":1749},[1207,2385,2387],{"class":1209,"line":2386},74,[1207,2388,2389],{"class":1756},"        Test that user creation triggers welcome email task\n",[1207,2391,2393],{"class":1209,"line":2392},75,[1207,2394,1836],{"class":1756},[1207,2396,2398],{"class":1209,"line":2397},76,[1207,2399,2400],{"class":1756},"        This test uses mocking to verify that our service calls external dependencies\n",[1207,2402,2404],{"class":1209,"line":2403},77,[1207,2405,2406],{"class":1756},"        (in this case, a Celery task) without actually executing them.\n",[1207,2408,2410],{"class":1209,"line":2409},78,[1207,2411,1836],{"class":1756},[1207,2413,2415],{"class":1209,"line":2414},79,[1207,2416,2417],{"class":1756},"        The @patch decorator replaces the real send_welcome_email.delay function\n",[1207,2419,2421],{"class":1209,"line":2420},80,[1207,2422,2423],{"class":1756},"        with a mock object that we can inspect.\n",[1207,2425,2427],{"class":1209,"line":2426},81,[1207,2428,1824],{"class":1749},[1207,2430,2432],{"class":1209,"line":2431},82,[1207,2433,2434],{"class":1213},"        # Arrange: Set up test data\n",[1207,2436,2438,2441,2443],{"class":1209,"line":2437},83,[1207,2439,2440],{"class":1620},"        user_data ",[1207,2442,1961],{"class":1632},[1207,2444,2445],{"class":1632}," {\n",[1207,2447,2449,2452,2454,2456,2459,2461,2464,2466],{"class":1209,"line":2448},84,[1207,2450,2451],{"class":1964},"            '",[1207,2453,2183],{"class":1224},[1207,2455,1965],{"class":1964},[1207,2457,2458],{"class":1632},":",[1207,2460,2188],{"class":1964},[1207,2462,2463],{"class":1224},"newuser",[1207,2465,1965],{"class":1964},[1207,2467,1973],{"class":1632},[1207,2469,2471,2473,2475,2477,2479,2481,2484,2486],{"class":1209,"line":2470},85,[1207,2472,2451],{"class":1964},[1207,2474,2204],{"class":1224},[1207,2476,1965],{"class":1964},[1207,2478,2458],{"class":1632},[1207,2480,2188],{"class":1964},[1207,2482,2483],{"class":1224},"new@example.com",[1207,2485,1965],{"class":1964},[1207,2487,1973],{"class":1632},[1207,2489,2491,2493,2496,2498,2500,2502,2505,2507],{"class":1209,"line":2490},86,[1207,2492,2451],{"class":1964},[1207,2494,2495],{"class":1224},"password",[1207,2497,1965],{"class":1964},[1207,2499,2458],{"class":1632},[1207,2501,2188],{"class":1964},[1207,2503,2504],{"class":1224},"newpass123",[1207,2506,1965],{"class":1964},[1207,2508,1973],{"class":1632},[1207,2510,2512,2514,2517,2519,2521,2523,2526,2528],{"class":1209,"line":2511},87,[1207,2513,2451],{"class":1964},[1207,2515,2516],{"class":1224},"first_name",[1207,2518,1965],{"class":1964},[1207,2520,2458],{"class":1632},[1207,2522,2188],{"class":1964},[1207,2524,2525],{"class":1224},"New",[1207,2527,1965],{"class":1964},[1207,2529,1973],{"class":1632},[1207,2531,2533,2535,2538,2540,2542,2544,2547],{"class":1209,"line":2532},88,[1207,2534,2451],{"class":1964},[1207,2536,2537],{"class":1224},"last_name",[1207,2539,1965],{"class":1964},[1207,2541,2458],{"class":1632},[1207,2543,2188],{"class":1964},[1207,2545,2546],{"class":1224},"User",[1207,2548,2006],{"class":1964},[1207,2550,2552],{"class":1209,"line":2551},89,[1207,2553,2554],{"class":1632},"        }\n",[1207,2556,2558],{"class":1209,"line":2557},90,[1207,2559,1836],{"class":1620},[1207,2561,2563],{"class":1209,"line":2562},91,[1207,2564,2108],{"class":1213},[1207,2566,2568,2571,2573,2575,2577,2579,2581,2584],{"class":1209,"line":2567},92,[1207,2569,2570],{"class":1620},"        user ",[1207,2572,1961],{"class":1632},[1207,2574,1697],{"class":1620},[1207,2576,1633],{"class":1632},[1207,2578,1948],{"class":1862},[1207,2580,1811],{"class":1632},[1207,2582,2583],{"class":1862},"user_data",[1207,2585,2136],{"class":1632},[1207,2587,2589],{"class":1209,"line":2588},93,[1207,2590,1836],{"class":1620},[1207,2592,2594],{"class":1209,"line":2593},94,[1207,2595,2596],{"class":1213},"        # Assert: Verify the user was created correctly\n",[1207,2598,2600,2602,2605,2607,2609,2611,2613,2615],{"class":1209,"line":2599},95,[1207,2601,2153],{"class":1616},[1207,2603,2604],{"class":1620}," user",[1207,2606,1633],{"class":1632},[1207,2608,2183],{"class":1942},[1207,2610,2164],{"class":2163},[1207,2612,2188],{"class":1964},[1207,2614,2463],{"class":1224},[1207,2616,2006],{"class":1964},[1207,2618,2620],{"class":1209,"line":2619},96,[1207,2621,1836],{"class":1620},[1207,2623,2625],{"class":1209,"line":2624},97,[1207,2626,2627],{"class":1213},"        # Assert: Verify the welcome email task was called\n",[1207,2629,2631,2634,2636,2639,2641,2644,2646,2648],{"class":1209,"line":2630},98,[1207,2632,2633],{"class":1620},"        mock_email_task",[1207,2635,1633],{"class":1632},[1207,2637,2638],{"class":1862},"assert_called_once_with",[1207,2640,1811],{"class":1632},[1207,2642,2643],{"class":1862},"user",[1207,2645,1633],{"class":1632},[1207,2647,2133],{"class":1942},[1207,2649,2136],{"class":1632},[1207,2651,2653],{"class":1209,"line":2652},99,[1207,2654,1763],{"class":1620},[1207,2656,2658,2660,2662,2664,2666,2669,2671],{"class":1209,"line":2657},100,[1207,2659,1791],{"class":1632},[1207,2661,2344],{"class":1794},[1207,2663,1811],{"class":1632},[1207,2665,1965],{"class":1964},[1207,2667,2668],{"class":1224},"user_service.services.requests.post",[1207,2670,1965],{"class":1964},[1207,2672,2136],{"class":1632},[1207,2674,2676,2678,2681,2683,2685,2687,2690,2692,2694,2696,2698],{"class":1209,"line":2675},101,[1207,2677,1806],{"class":1735},[1207,2679,2680],{"class":1794}," test_notify_other_services",[1207,2682,1811],{"class":1632},[1207,2684,1815],{"class":1814},[1207,2686,1644],{"class":1632},[1207,2688,2689],{"class":2051}," mock_post",[1207,2691,1644],{"class":1632},[1207,2693,1697],{"class":2051},[1207,2695,1644],{"class":1632},[1207,2697,1890],{"class":2051},[1207,2699,1818],{"class":1632},[1207,2701,2703],{"class":1209,"line":2702},102,[1207,2704,1824],{"class":1749},[1207,2706,2708],{"class":1209,"line":2707},103,[1207,2709,2710],{"class":1756},"        Test notification to other services\n",[1207,2712,2714],{"class":1209,"line":2713},104,[1207,2715,1836],{"class":1756},[1207,2717,2719],{"class":1209,"line":2718},105,[1207,2720,2721],{"class":1756},"        This test mocks HTTP requests to external services. We don't want our\n",[1207,2723,2725],{"class":1209,"line":2724},106,[1207,2726,2727],{"class":1756},"        unit tests to make real HTTP calls because:\n",[1207,2729,2731],{"class":1209,"line":2730},107,[1207,2732,2733],{"class":1756},"        1. They would be slow\n",[1207,2735,2737],{"class":1209,"line":2736},108,[1207,2738,2739],{"class":1756},"        2. They would require other services to be running\n",[1207,2741,2743],{"class":1209,"line":2742},109,[1207,2744,2745],{"class":1756},"        3. They could fail due to network issues\n",[1207,2747,2749],{"class":1209,"line":2748},110,[1207,2750,1824],{"class":1749},[1207,2752,2754],{"class":1209,"line":2753},111,[1207,2755,2756],{"class":1213},"        # Arrange: Set up the mock to return a successful response\n",[1207,2758,2760,2763,2765,2768,2770,2773,2776],{"class":1209,"line":2759},112,[1207,2761,2762],{"class":1620},"        mock_post",[1207,2764,1633],{"class":1632},[1207,2766,2767],{"class":1942},"return_value",[1207,2769,1633],{"class":1632},[1207,2771,2772],{"class":1942},"status_code",[1207,2774,2775],{"class":1632}," =",[1207,2777,2778],{"class":1231}," 200\n",[1207,2780,2782,2784,2786,2788,2790,2793,2795,2797,2799,2802,2804,2807,2809,2811,2815],{"class":1209,"line":2781},113,[1207,2783,2762],{"class":1620},[1207,2785,1633],{"class":1632},[1207,2787,2767],{"class":1942},[1207,2789,1633],{"class":1632},[1207,2791,2792],{"class":1942},"json",[1207,2794,1633],{"class":1632},[1207,2796,2767],{"class":1942},[1207,2798,2775],{"class":1632},[1207,2800,2801],{"class":1632}," {",[1207,2803,1965],{"class":1964},[1207,2805,2806],{"class":1224},"success",[1207,2808,1965],{"class":1964},[1207,2810,2458],{"class":1632},[1207,2812,2814],{"class":2813},"s8XtY"," True",[1207,2816,2817],{"class":1632},"}\n",[1207,2819,2821],{"class":1209,"line":2820},114,[1207,2822,1836],{"class":1620},[1207,2824,2826],{"class":1209,"line":2825},115,[1207,2827,2108],{"class":1213},[1207,2829,2831,2833,2835,2837,2839,2842],{"class":1209,"line":2830},116,[1207,2832,2114],{"class":1620},[1207,2834,1961],{"class":1632},[1207,2836,1697],{"class":1620},[1207,2838,1633],{"class":1632},[1207,2840,2841],{"class":1862},"notify_profile_update",[1207,2843,1951],{"class":1632},[1207,2845,2847,2850,2852,2854,2856],{"class":1209,"line":2846},117,[1207,2848,2849],{"class":1862},"            sample_user",[1207,2851,1633],{"class":1632},[1207,2853,2133],{"class":1942},[1207,2855,1644],{"class":1632},[1207,2857,2858],{"class":1862}," \n",[1207,2860,2862,2865,2867,2869,2871,2873,2875,2878,2880],{"class":1209,"line":2861},118,[1207,2863,2864],{"class":1632},"            {",[1207,2866,1965],{"class":1964},[1207,2868,2516],{"class":1224},[1207,2870,1965],{"class":1964},[1207,2872,2458],{"class":1632},[1207,2874,2188],{"class":1964},[1207,2876,2877],{"class":1224},"Updated",[1207,2879,1965],{"class":1964},[1207,2881,2817],{"class":1632},[1207,2883,2885],{"class":1209,"line":2884},119,[1207,2886,2012],{"class":1632},[1207,2888,2890],{"class":1209,"line":2889},120,[1207,2891,1836],{"class":1620},[1207,2893,2895],{"class":1209,"line":2894},121,[1207,2896,2897],{"class":1213},"        # Assert: Verify the method returned success\n",[1207,2899,2901,2903,2906,2909],{"class":1209,"line":2900},122,[1207,2902,2153],{"class":1616},[1207,2904,2905],{"class":1620}," result ",[1207,2907,2908],{"class":2163},"is",[1207,2910,2911],{"class":2813}," True\n",[1207,2913,2915],{"class":1209,"line":2914},123,[1207,2916,1836],{"class":1620},[1207,2918,2920],{"class":1209,"line":2919},124,[1207,2921,2922],{"class":1213},"        # Assert: Verify HTTP requests were made to both services\n",[1207,2924,2926,2928,2930,2932,2935,2937,2940],{"class":1209,"line":2925},125,[1207,2927,2153],{"class":1616},[1207,2929,2689],{"class":1620},[1207,2931,1633],{"class":1632},[1207,2933,2934],{"class":1942},"call_count",[1207,2936,2164],{"class":2163},[1207,2938,2939],{"class":1231}," 2",[1207,2941,2942],{"class":1213},"  # Called for each service\n",[1207,2944,2946],{"class":1209,"line":2945},126,[1207,2947,1836],{"class":1620},[1207,2949,2951],{"class":1209,"line":2950},127,[1207,2952,2953],{"class":1213},"        # You can also verify the exact calls that were made:\n",[1207,2955,2957,2960,2962,2964,2966],{"class":1209,"line":2956},128,[1207,2958,2959],{"class":1620},"        calls ",[1207,2961,1961],{"class":1632},[1207,2963,2689],{"class":1620},[1207,2965,1633],{"class":1632},[1207,2967,2968],{"class":1942},"call_args_list\n",[1207,2970,2972,2974,2976,2979,2981,2984,2987,2990,2993,2996,2999,3001,3003,3006,3008,3011],{"class":1209,"line":2971},129,[1207,2973,2153],{"class":1616},[1207,2975,2188],{"class":1964},[1207,2977,2978],{"class":1224},"order-service",[1207,2980,1965],{"class":1964},[1207,2982,2983],{"class":2163}," in",[1207,2985,2986],{"class":1620}," calls",[1207,2988,2989],{"class":1632},"[",[1207,2991,2992],{"class":1231},"0",[1207,2994,2995],{"class":1632},"][",[1207,2997,2998],{"class":1231},"1",[1207,3000,2995],{"class":1632},[1207,3002,1965],{"class":1964},[1207,3004,3005],{"class":1224},"url",[1207,3007,1965],{"class":1964},[1207,3009,3010],{"class":1632},"]",[1207,3012,3013],{"class":1213},"  # First call to order service\n",[1207,3015,3017,3019,3021,3024,3026,3028,3030,3032,3034,3036,3038,3040,3042,3044,3046,3048],{"class":1209,"line":3016},130,[1207,3018,2153],{"class":1616},[1207,3020,2188],{"class":1964},[1207,3022,3023],{"class":1224},"notification-service",[1207,3025,1965],{"class":1964},[1207,3027,2983],{"class":2163},[1207,3029,2986],{"class":1620},[1207,3031,2989],{"class":1632},[1207,3033,2998],{"class":1231},[1207,3035,2995],{"class":1632},[1207,3037,2998],{"class":1231},[1207,3039,2995],{"class":1632},[1207,3041,1965],{"class":1964},[1207,3043,3005],{"class":1224},[1207,3045,1965],{"class":1964},[1207,3047,3010],{"class":1632},[1207,3049,3050],{"class":1213},"  # Second call to notification service\n",[1026,3052,3053],{},[1045,3054,3055],{},"Key testing concepts explained:",[1123,3057,3058,3063,3069,3095],{},[1084,3059,3060,3062],{},[1045,3061,324],{},": Reusable setup code that runs before each test. They help keep tests clean and avoid repetition.",[1084,3064,3065,3068],{},[1045,3066,3067],{},"Mocking",": Replacing real dependencies with fake objects that you can control and inspect. This keeps tests fast and isolated.",[1084,3070,3071,3074,3075],{},[1045,3072,3073],{},"Arrange-Act-Assert",": A common testing pattern:",[1081,3076,3077,3083,3089],{},[1084,3078,3079,3082],{},[1045,3080,3081],{},"Arrange",": Set up test data and conditions",[1084,3084,3085,3088],{},[1045,3086,3087],{},"Act",": Call the method you're testing",[1084,3090,3091,3094],{},[1045,3092,3093],{},"Assert",": Verify the results are correct",[1084,3096,3097,3100],{},[1045,3098,3099],{},"Happy Path vs Error Cases",": Test both when things work correctly and when they don't.",[1038,3102,3104],{"id":3103},"model-testing-with-factories","Model Testing with Factories",[1026,3106,3107],{},"Testing Django models can be tedious if you create test data manually for each test. Factory Boy solves this by generating realistic test data automatically. Think of factories as assembly lines that produce test objects with sensible defaults.",[1197,3109,3111],{"className":1602,"code":3110,"language":1604,"meta":1202,"style":1202},"# user_service/tests/factories.py\nimport factory\nfrom django.contrib.auth.models import User\nfrom user_service.models import UserProfile\n\nclass UserFactory(factory.django.DjangoModelFactory):\n    \"\"\"\n    Factory for creating User objects in tests\n    \n    This factory automatically generates realistic user data.\n    Each time you call UserFactory(), you get a new user with\n    unique username, email, etc.\n    \"\"\"\n    class Meta:\n        model = User  # Tell factory which model to create\n    \n    # Generate sequential usernames: user1, user2, user3, etc.\n    username = factory.Sequence(lambda n: f\"user{n}\")\n    \n    # Generate email based on username\n    email = factory.LazyAttribute(lambda obj: f\"{obj.username}@example.com\")\n    \n    # Generate realistic fake names\n    first_name = factory.Faker('first_name')\n    last_name = factory.Faker('last_name')\n    \n    # Set reasonable defaults\n    is_active = True\n\nclass UserProfileFactory(factory.django.DjangoModelFactory):\n    \"\"\"\n    Factory for creating UserProfile objects\n    \n    This factory demonstrates how to create related objects.\n    Each profile is automatically linked to a user.\n    \"\"\"\n    class Meta:\n        model = UserProfile\n    \n    # Create a related User object using the UserFactory\n    user = factory.SubFactory(UserFactory)\n    \n    # Generate realistic fake data\n    bio = factory.Faker('text', max_nb_chars=200)\n    birth_date = factory.Faker('date_of_birth', minimum_age=18, maximum_age=80)\n    phone_number = factory.Faker('phone_number')\n",[1204,3112,3113,3118,3125,3147,3162,3166,3190,3194,3199,3203,3208,3213,3218,3222,3232,3245,3249,3254,3300,3304,3309,3352,3356,3361,3385,3408,3412,3417,3426,3430,3451,3455,3460,3464,3469,3474,3478,3486,3494,3498,3503,3524,3528,3533,3567,3611],{"__ignoreMap":1202},[1207,3114,3115],{"class":1209,"line":1210},[1207,3116,3117],{"class":1213},"# user_service/tests/factories.py\n",[1207,3119,3120,3122],{"class":1209,"line":1217},[1207,3121,1617],{"class":1616},[1207,3123,3124],{"class":1620}," factory\n",[1207,3126,3127,3129,3131,3133,3135,3137,3139,3141,3143,3145],{"class":1209,"line":1238},[1207,3128,1626],{"class":1616},[1207,3130,1654],{"class":1620},[1207,3132,1633],{"class":1632},[1207,3134,1675],{"class":1620},[1207,3136,1633],{"class":1632},[1207,3138,1680],{"class":1620},[1207,3140,1633],{"class":1632},[1207,3142,1685],{"class":1620},[1207,3144,1617],{"class":1616},[1207,3146,1690],{"class":1620},[1207,3148,3149,3151,3153,3155,3157,3159],{"class":1209,"line":1254},[1207,3150,1626],{"class":1616},[1207,3152,1697],{"class":1620},[1207,3154,1633],{"class":1632},[1207,3156,1685],{"class":1620},[1207,3158,1617],{"class":1616},[1207,3160,3161],{"class":1620}," UserProfile\n",[1207,3163,3164],{"class":1209,"line":1270},[1207,3165,1527],{"emptyLinePlaceholder":1526},[1207,3167,3168,3170,3173,3175,3178,3180,3183,3185,3188],{"class":1209,"line":1535},[1207,3169,1736],{"class":1735},[1207,3171,3172],{"class":1739}," UserFactory",[1207,3174,1811],{"class":1632},[1207,3176,3177],{"class":1220},"factory",[1207,3179,1633],{"class":1632},[1207,3181,3182],{"class":1220},"django",[1207,3184,1633],{"class":1632},[1207,3186,3187],{"class":1220},"DjangoModelFactory",[1207,3189,1818],{"class":1632},[1207,3191,3192],{"class":1209,"line":1710},[1207,3193,1750],{"class":1749},[1207,3195,3196],{"class":1209,"line":1727},[1207,3197,3198],{"class":1756},"    Factory for creating User objects in tests\n",[1207,3200,3201],{"class":1209,"line":1732},[1207,3202,1763],{"class":1756},[1207,3204,3205],{"class":1209,"line":1746},[1207,3206,3207],{"class":1756},"    This factory automatically generates realistic user data.\n",[1207,3209,3210],{"class":1209,"line":1753},[1207,3211,3212],{"class":1756},"    Each time you call UserFactory(), you get a new user with\n",[1207,3214,3215],{"class":1209,"line":1760},[1207,3216,3217],{"class":1756},"    unique username, email, etc.\n",[1207,3219,3220],{"class":1209,"line":1766},[1207,3221,1750],{"class":1749},[1207,3223,3224,3227,3230],{"class":1209,"line":1772},[1207,3225,3226],{"class":1735},"    class",[1207,3228,3229],{"class":1739}," Meta",[1207,3231,1743],{"class":1632},[1207,3233,3234,3237,3239,3242],{"class":1209,"line":1778},[1207,3235,3236],{"class":1620},"        model ",[1207,3238,1961],{"class":1632},[1207,3240,3241],{"class":1620}," User  ",[1207,3243,3244],{"class":1213},"# Tell factory which model to create\n",[1207,3246,3247],{"class":1209,"line":1783},[1207,3248,1763],{"class":1620},[1207,3250,3251],{"class":1209,"line":1788},[1207,3252,3253],{"class":1213},"    # Generate sequential usernames: user1, user2, user3, etc.\n",[1207,3255,3256,3259,3261,3264,3266,3269,3271,3274,3277,3279,3282,3285,3289,3292,3295,3298],{"class":1209,"line":1803},[1207,3257,3258],{"class":1620},"    username ",[1207,3260,1961],{"class":1632},[1207,3262,3263],{"class":1620}," factory",[1207,3265,1633],{"class":1632},[1207,3267,3268],{"class":1862},"Sequence",[1207,3270,1811],{"class":1632},[1207,3272,3273],{"class":1735},"lambda",[1207,3275,3276],{"class":2051}," n",[1207,3278,2458],{"class":1632},[1207,3280,3281],{"class":1735}," f",[1207,3283,3284],{"class":1224},"\"user",[1207,3286,3288],{"class":3287},"s3h35","{",[1207,3290,3291],{"class":1862},"n",[1207,3293,3294],{"class":3287},"}",[1207,3296,3297],{"class":1224},"\"",[1207,3299,2136],{"class":1632},[1207,3301,3302],{"class":1209,"line":1821},[1207,3303,1763],{"class":1620},[1207,3305,3306],{"class":1209,"line":1827},[1207,3307,3308],{"class":1213},"    # Generate email based on username\n",[1207,3310,3311,3314,3316,3318,3320,3323,3325,3327,3330,3332,3334,3336,3338,3341,3343,3345,3347,3350],{"class":1209,"line":1833},[1207,3312,3313],{"class":1620},"    email ",[1207,3315,1961],{"class":1632},[1207,3317,3263],{"class":1620},[1207,3319,1633],{"class":1632},[1207,3321,3322],{"class":1862},"LazyAttribute",[1207,3324,1811],{"class":1632},[1207,3326,3273],{"class":1735},[1207,3328,3329],{"class":2051}," obj",[1207,3331,2458],{"class":1632},[1207,3333,3281],{"class":1735},[1207,3335,3297],{"class":1224},[1207,3337,3288],{"class":3287},[1207,3339,3340],{"class":1862},"obj",[1207,3342,1633],{"class":1632},[1207,3344,2183],{"class":1942},[1207,3346,3294],{"class":3287},[1207,3348,3349],{"class":1224},"@example.com\"",[1207,3351,2136],{"class":1632},[1207,3353,3354],{"class":1209,"line":1839},[1207,3355,1763],{"class":1620},[1207,3357,3358],{"class":1209,"line":1845},[1207,3359,3360],{"class":1213},"    # Generate realistic fake names\n",[1207,3362,3363,3366,3368,3370,3372,3375,3377,3379,3381,3383],{"class":1209,"line":1851},[1207,3364,3365],{"class":1620},"    first_name ",[1207,3367,1961],{"class":1632},[1207,3369,3263],{"class":1620},[1207,3371,1633],{"class":1632},[1207,3373,3374],{"class":1862},"Faker",[1207,3376,1811],{"class":1632},[1207,3378,1965],{"class":1964},[1207,3380,2516],{"class":1224},[1207,3382,1965],{"class":1964},[1207,3384,2136],{"class":1632},[1207,3386,3387,3390,3392,3394,3396,3398,3400,3402,3404,3406],{"class":1209,"line":1856},[1207,3388,3389],{"class":1620},"    last_name ",[1207,3391,1961],{"class":1632},[1207,3393,3263],{"class":1620},[1207,3395,1633],{"class":1632},[1207,3397,3374],{"class":1862},[1207,3399,1811],{"class":1632},[1207,3401,1965],{"class":1964},[1207,3403,2537],{"class":1224},[1207,3405,1965],{"class":1964},[1207,3407,2136],{"class":1632},[1207,3409,3410],{"class":1209,"line":1869},[1207,3411,1763],{"class":1620},[1207,3413,3414],{"class":1209,"line":1874},[1207,3415,3416],{"class":1213},"    # Set reasonable defaults\n",[1207,3418,3419,3422,3424],{"class":1209,"line":1885},[1207,3420,3421],{"class":1620},"    is_active ",[1207,3423,1961],{"class":1632},[1207,3425,2911],{"class":2813},[1207,3427,3428],{"class":1209,"line":1899},[1207,3429,1527],{"emptyLinePlaceholder":1526},[1207,3431,3432,3434,3437,3439,3441,3443,3445,3447,3449],{"class":1209,"line":1904},[1207,3433,1736],{"class":1735},[1207,3435,3436],{"class":1739}," UserProfileFactory",[1207,3438,1811],{"class":1632},[1207,3440,3177],{"class":1220},[1207,3442,1633],{"class":1632},[1207,3444,3182],{"class":1220},[1207,3446,1633],{"class":1632},[1207,3448,3187],{"class":1220},[1207,3450,1818],{"class":1632},[1207,3452,3453],{"class":1209,"line":1910},[1207,3454,1750],{"class":1749},[1207,3456,3457],{"class":1209,"line":1915},[1207,3458,3459],{"class":1756},"    Factory for creating UserProfile objects\n",[1207,3461,3462],{"class":1209,"line":1921},[1207,3463,1763],{"class":1756},[1207,3465,3466],{"class":1209,"line":1927},[1207,3467,3468],{"class":1756},"    This factory demonstrates how to create related objects.\n",[1207,3470,3471],{"class":1209,"line":1932},[1207,3472,3473],{"class":1756},"    Each profile is automatically linked to a user.\n",[1207,3475,3476],{"class":1209,"line":1954},[1207,3477,1750],{"class":1749},[1207,3479,3480,3482,3484],{"class":1209,"line":1976},[1207,3481,3226],{"class":1735},[1207,3483,3229],{"class":1739},[1207,3485,1743],{"class":1632},[1207,3487,3488,3490,3492],{"class":1209,"line":1993},[1207,3489,3236],{"class":1620},[1207,3491,1961],{"class":1632},[1207,3493,3161],{"class":1620},[1207,3495,3496],{"class":1209,"line":2009},[1207,3497,1763],{"class":1620},[1207,3499,3500],{"class":1209,"line":2015},[1207,3501,3502],{"class":1213},"    # Create a related User object using the UserFactory\n",[1207,3504,3505,3508,3510,3512,3514,3517,3519,3522],{"class":1209,"line":2020},[1207,3506,3507],{"class":1620},"    user ",[1207,3509,1961],{"class":1632},[1207,3511,3263],{"class":1620},[1207,3513,1633],{"class":1632},[1207,3515,3516],{"class":1862},"SubFactory",[1207,3518,1811],{"class":1632},[1207,3520,3521],{"class":1862},"UserFactory",[1207,3523,2136],{"class":1632},[1207,3525,3526],{"class":1209,"line":2037},[1207,3527,1763],{"class":1620},[1207,3529,3530],{"class":1209,"line":2060},[1207,3531,3532],{"class":1213},"    # Generate realistic fake data\n",[1207,3534,3535,3538,3540,3542,3544,3546,3548,3550,3553,3555,3557,3560,3562,3565],{"class":1209,"line":2065},[1207,3536,3537],{"class":1620},"    bio ",[1207,3539,1961],{"class":1632},[1207,3541,3263],{"class":1620},[1207,3543,1633],{"class":1632},[1207,3545,3374],{"class":1862},[1207,3547,1811],{"class":1632},[1207,3549,1965],{"class":1964},[1207,3551,3552],{"class":1224},"text",[1207,3554,1965],{"class":1964},[1207,3556,1644],{"class":1632},[1207,3558,3559],{"class":1957}," max_nb_chars",[1207,3561,1961],{"class":1632},[1207,3563,3564],{"class":1231},"200",[1207,3566,2136],{"class":1632},[1207,3568,3569,3572,3574,3576,3578,3580,3582,3584,3587,3589,3591,3594,3596,3599,3601,3604,3606,3609],{"class":1209,"line":2071},[1207,3570,3571],{"class":1620},"    birth_date ",[1207,3573,1961],{"class":1632},[1207,3575,3263],{"class":1620},[1207,3577,1633],{"class":1632},[1207,3579,3374],{"class":1862},[1207,3581,1811],{"class":1632},[1207,3583,1965],{"class":1964},[1207,3585,3586],{"class":1224},"date_of_birth",[1207,3588,1965],{"class":1964},[1207,3590,1644],{"class":1632},[1207,3592,3593],{"class":1957}," minimum_age",[1207,3595,1961],{"class":1632},[1207,3597,3598],{"class":1231},"18",[1207,3600,1644],{"class":1632},[1207,3602,3603],{"class":1957}," maximum_age",[1207,3605,1961],{"class":1632},[1207,3607,3608],{"class":1231},"80",[1207,3610,2136],{"class":1632},[1207,3612,3613,3616,3618,3620,3622,3624,3626,3628,3631,3633],{"class":1209,"line":2076},[1207,3614,3615],{"class":1620},"    phone_number ",[1207,3617,1961],{"class":1632},[1207,3619,3263],{"class":1620},[1207,3621,1633],{"class":1632},[1207,3623,3374],{"class":1862},[1207,3625,1811],{"class":1632},[1207,3627,1965],{"class":1964},[1207,3629,3630],{"class":1224},"phone_number",[1207,3632,1965],{"class":1964},[1207,3634,2136],{"class":1632},[1026,3636,3637],{},"Now let's see how to use these factories in tests:",[1197,3639,3641],{"className":1602,"code":3640,"language":1604,"meta":1202,"style":1202},"# user_service/tests/test_models.py\nimport pytest\nfrom django.core.exceptions import ValidationError\nfrom user_service.tests.factories import UserFactory, UserProfileFactory\n\n@pytest.mark.django_db\nclass TestUserProfile:\n    \"\"\"\n    Test class for UserProfile model\n    \n    Model tests verify that your Django models work correctly:\n    - Validation rules are enforced\n    - Relationships work properly\n    - Custom methods return expected values\n    \"\"\"\n    \n    def test_user_profile_creation(self):\n        \"\"\"\n        Test user profile creation with factory\n        \n        This test verifies that our factory creates valid objects\n        and that the model's basic functionality works.\n        \"\"\"\n        # Act: Create a profile using the factory\n        profile = UserProfileFactory()\n        \n        # Assert: Verify the profile was created with expected data\n        assert profile.user.username is not None\n        assert profile.bio is not None\n        assert profile.birth_date is not None\n        \n        # Verify the profile was saved to the database\n        assert profile.id is not None\n    \n    def test_user_profile_str_representation(self):\n        \"\"\"\n        Test string representation of user profile\n        \n        This tests the __str__ method of your model, which is used\n        in Django admin and other places where the object is displayed.\n        \"\"\"\n        # Arrange: Create a user with a specific username\n        user = UserFactory(username='testuser')\n        profile = UserProfileFactory(user=user)\n        \n        # Act & Assert: Test the string representation\n        assert str(profile) == f\"Profile for testuser\"\n    \n    def test_phone_number_validation(self):\n        \"\"\"\n        Test phone number validation\n        \n        This test verifies that model validation works correctly.\n        We create an invalid object and expect validation to fail.\n        \"\"\"\n        # Arrange: Create a profile with invalid phone number\n        # Using .build() creates the object but doesn't save it to database\n        profile = UserProfileFactory.build(phone_number='invalid-phone')\n        \n        # Act & Assert: Expect validation to fail\n        with pytest.raises(ValidationError):\n            profile.full_clean()  # This runs model validation\n    \n    def test_user_profile_relationship(self):\n        \"\"\"\n        Test the relationship between User and UserProfile\n        \n        This verifies that Django's foreign key relationships work correctly.\n        \"\"\"\n        # Arrange: Create a profile (which automatically creates a user)\n        profile = UserProfileFactory()\n        \n        # Act: Access the related user\n        user = profile.user\n        \n        # Assert: Verify the relationship works both ways\n        assert user.profile == profile\n        assert profile.user == user\n    \n    def test_multiple_profiles_different_users(self):\n        \"\"\"\n        Test that multiple profiles create different users\n        \n        This verifies that our factory creates unique objects each time.\n        \"\"\"\n        # Act: Create multiple profiles\n        profile1 = UserProfileFactory()\n        profile2 = UserProfileFactory()\n        \n        # Assert: Verify they have different users\n        assert profile1.user != profile2.user\n        assert profile1.user.username != profile2.user.username\n        assert profile1.user.email != profile2.user.email\n",[1204,3642,3643,3648,3654,3674,3699,3703,3718,3727,3731,3736,3740,3745,3750,3755,3760,3764,3768,3781,3785,3790,3794,3799,3804,3808,3813,3824,3828,3833,3857,3874,3891,3895,3900,3916,3920,3933,3937,3942,3946,3951,3956,3960,3965,3987,4005,4009,4014,4036,4040,4053,4057,4062,4066,4071,4076,4080,4085,4090,4118,4122,4127,4144,4160,4164,4177,4181,4186,4190,4195,4199,4204,4214,4218,4223,4236,4240,4245,4260,4275,4279,4292,4296,4301,4305,4310,4314,4319,4330,4341,4345,4350,4371,4398],{"__ignoreMap":1202},[1207,3644,3645],{"class":1209,"line":1210},[1207,3646,3647],{"class":1213},"# user_service/tests/test_models.py\n",[1207,3649,3650,3652],{"class":1209,"line":1217},[1207,3651,1617],{"class":1616},[1207,3653,1621],{"class":1620},[1207,3655,3656,3658,3660,3662,3665,3667,3669,3671],{"class":1209,"line":1238},[1207,3657,1626],{"class":1616},[1207,3659,1654],{"class":1620},[1207,3661,1633],{"class":1632},[1207,3663,3664],{"class":1620},"core",[1207,3666,1633],{"class":1632},[1207,3668,1719],{"class":1620},[1207,3670,1617],{"class":1616},[1207,3672,3673],{"class":1620}," ValidationError\n",[1207,3675,3676,3678,3680,3682,3685,3687,3690,3692,3694,3696],{"class":1209,"line":1254},[1207,3677,1626],{"class":1616},[1207,3679,1697],{"class":1620},[1207,3681,1633],{"class":1632},[1207,3683,3684],{"class":1620},"tests",[1207,3686,1633],{"class":1632},[1207,3688,3689],{"class":1620},"factories ",[1207,3691,1617],{"class":1616},[1207,3693,3172],{"class":1620},[1207,3695,1644],{"class":1632},[1207,3697,3698],{"class":1620}," UserProfileFactory\n",[1207,3700,3701],{"class":1209,"line":1270},[1207,3702,1527],{"emptyLinePlaceholder":1526},[1207,3704,3705,3708,3710,3712,3714,3716],{"class":1209,"line":1535},[1207,3706,3707],{"class":1632},"@",[1207,3709,1795],{"class":1794},[1207,3711,1633],{"class":1632},[1207,3713,2029],{"class":1794},[1207,3715,1633],{"class":1632},[1207,3717,2034],{"class":1794},[1207,3719,3720,3722,3725],{"class":1209,"line":1710},[1207,3721,1736],{"class":1735},[1207,3723,3724],{"class":1739}," TestUserProfile",[1207,3726,1743],{"class":1632},[1207,3728,3729],{"class":1209,"line":1727},[1207,3730,1750],{"class":1749},[1207,3732,3733],{"class":1209,"line":1732},[1207,3734,3735],{"class":1756},"    Test class for UserProfile model\n",[1207,3737,3738],{"class":1209,"line":1746},[1207,3739,1763],{"class":1756},[1207,3741,3742],{"class":1209,"line":1753},[1207,3743,3744],{"class":1756},"    Model tests verify that your Django models work correctly:\n",[1207,3746,3747],{"class":1209,"line":1760},[1207,3748,3749],{"class":1756},"    - Validation rules are enforced\n",[1207,3751,3752],{"class":1209,"line":1766},[1207,3753,3754],{"class":1756},"    - Relationships work properly\n",[1207,3756,3757],{"class":1209,"line":1772},[1207,3758,3759],{"class":1756},"    - Custom methods return expected values\n",[1207,3761,3762],{"class":1209,"line":1778},[1207,3763,1750],{"class":1749},[1207,3765,3766],{"class":1209,"line":1783},[1207,3767,1763],{"class":1620},[1207,3769,3770,3772,3775,3777,3779],{"class":1209,"line":1788},[1207,3771,1806],{"class":1735},[1207,3773,3774],{"class":1794}," test_user_profile_creation",[1207,3776,1811],{"class":1632},[1207,3778,1815],{"class":1814},[1207,3780,1818],{"class":1632},[1207,3782,3783],{"class":1209,"line":1803},[1207,3784,1824],{"class":1749},[1207,3786,3787],{"class":1209,"line":1821},[1207,3788,3789],{"class":1756},"        Test user profile creation with factory\n",[1207,3791,3792],{"class":1209,"line":1827},[1207,3793,1836],{"class":1756},[1207,3795,3796],{"class":1209,"line":1833},[1207,3797,3798],{"class":1756},"        This test verifies that our factory creates valid objects\n",[1207,3800,3801],{"class":1209,"line":1839},[1207,3802,3803],{"class":1756},"        and that the model's basic functionality works.\n",[1207,3805,3806],{"class":1209,"line":1845},[1207,3807,1824],{"class":1749},[1207,3809,3810],{"class":1209,"line":1851},[1207,3811,3812],{"class":1213},"        # Act: Create a profile using the factory\n",[1207,3814,3815,3818,3820,3822],{"class":1209,"line":1856},[1207,3816,3817],{"class":1620},"        profile ",[1207,3819,1961],{"class":1632},[1207,3821,3436],{"class":1862},[1207,3823,1866],{"class":1632},[1207,3825,3826],{"class":1209,"line":1869},[1207,3827,1836],{"class":1620},[1207,3829,3830],{"class":1209,"line":1874},[1207,3831,3832],{"class":1213},"        # Assert: Verify the profile was created with expected data\n",[1207,3834,3835,3837,3840,3842,3844,3846,3848,3851,3854],{"class":1209,"line":1885},[1207,3836,2153],{"class":1616},[1207,3838,3839],{"class":1620}," profile",[1207,3841,1633],{"class":1632},[1207,3843,2643],{"class":1942},[1207,3845,1633],{"class":1632},[1207,3847,2183],{"class":1942},[1207,3849,3850],{"class":2163}," is",[1207,3852,3853],{"class":2163}," not",[1207,3855,3856],{"class":2813}," None\n",[1207,3858,3859,3861,3863,3865,3868,3870,3872],{"class":1209,"line":1899},[1207,3860,2153],{"class":1616},[1207,3862,3839],{"class":1620},[1207,3864,1633],{"class":1632},[1207,3866,3867],{"class":1942},"bio",[1207,3869,3850],{"class":2163},[1207,3871,3853],{"class":2163},[1207,3873,3856],{"class":2813},[1207,3875,3876,3878,3880,3882,3885,3887,3889],{"class":1209,"line":1904},[1207,3877,2153],{"class":1616},[1207,3879,3839],{"class":1620},[1207,3881,1633],{"class":1632},[1207,3883,3884],{"class":1942},"birth_date",[1207,3886,3850],{"class":2163},[1207,3888,3853],{"class":2163},[1207,3890,3856],{"class":2813},[1207,3892,3893],{"class":1209,"line":1910},[1207,3894,1836],{"class":1620},[1207,3896,3897],{"class":1209,"line":1915},[1207,3898,3899],{"class":1213},"        # Verify the profile was saved to the database\n",[1207,3901,3902,3904,3906,3908,3910,3912,3914],{"class":1209,"line":1921},[1207,3903,2153],{"class":1616},[1207,3905,3839],{"class":1620},[1207,3907,1633],{"class":1632},[1207,3909,2133],{"class":1942},[1207,3911,3850],{"class":2163},[1207,3913,3853],{"class":2163},[1207,3915,3856],{"class":2813},[1207,3917,3918],{"class":1209,"line":1927},[1207,3919,1763],{"class":1620},[1207,3921,3922,3924,3927,3929,3931],{"class":1209,"line":1932},[1207,3923,1806],{"class":1735},[1207,3925,3926],{"class":1794}," test_user_profile_str_representation",[1207,3928,1811],{"class":1632},[1207,3930,1815],{"class":1814},[1207,3932,1818],{"class":1632},[1207,3934,3935],{"class":1209,"line":1954},[1207,3936,1824],{"class":1749},[1207,3938,3939],{"class":1209,"line":1976},[1207,3940,3941],{"class":1756},"        Test string representation of user profile\n",[1207,3943,3944],{"class":1209,"line":1993},[1207,3945,1836],{"class":1756},[1207,3947,3948],{"class":1209,"line":2009},[1207,3949,3950],{"class":1756},"        This tests the __str__ method of your model, which is used\n",[1207,3952,3953],{"class":1209,"line":2015},[1207,3954,3955],{"class":1756},"        in Django admin and other places where the object is displayed.\n",[1207,3957,3958],{"class":1209,"line":2020},[1207,3959,1824],{"class":1749},[1207,3961,3962],{"class":1209,"line":2037},[1207,3963,3964],{"class":1213},"        # Arrange: Create a user with a specific username\n",[1207,3966,3967,3969,3971,3973,3975,3977,3979,3981,3983,3985],{"class":1209,"line":2060},[1207,3968,2570],{"class":1620},[1207,3970,1961],{"class":1632},[1207,3972,3172],{"class":1862},[1207,3974,1811],{"class":1632},[1207,3976,2183],{"class":1957},[1207,3978,1961],{"class":1632},[1207,3980,1965],{"class":1964},[1207,3982,1968],{"class":1224},[1207,3984,1965],{"class":1964},[1207,3986,2136],{"class":1632},[1207,3988,3989,3991,3993,3995,3997,3999,4001,4003],{"class":1209,"line":2065},[1207,3990,3817],{"class":1620},[1207,3992,1961],{"class":1632},[1207,3994,3436],{"class":1862},[1207,3996,1811],{"class":1632},[1207,3998,2643],{"class":1957},[1207,4000,1961],{"class":1632},[1207,4002,2643],{"class":1862},[1207,4004,2136],{"class":1632},[1207,4006,4007],{"class":1209,"line":2071},[1207,4008,1836],{"class":1620},[1207,4010,4011],{"class":1209,"line":2076},[1207,4012,4013],{"class":1213},"        # Act & Assert: Test the string representation\n",[1207,4015,4016,4018,4022,4024,4027,4029,4031,4033],{"class":1209,"line":2082},[1207,4017,2153],{"class":1616},[1207,4019,4021],{"class":4020},"sa2tF"," str",[1207,4023,1811],{"class":1632},[1207,4025,4026],{"class":1862},"profile",[1207,4028,2328],{"class":1632},[1207,4030,2164],{"class":2163},[1207,4032,3281],{"class":1735},[1207,4034,4035],{"class":1224},"\"Profile for testuser\"\n",[1207,4037,4038],{"class":1209,"line":2088},[1207,4039,1763],{"class":1620},[1207,4041,4042,4044,4047,4049,4051],{"class":1209,"line":2094},[1207,4043,1806],{"class":1735},[1207,4045,4046],{"class":1794}," test_phone_number_validation",[1207,4048,1811],{"class":1632},[1207,4050,1815],{"class":1814},[1207,4052,1818],{"class":1632},[1207,4054,4055],{"class":1209,"line":2100},[1207,4056,1824],{"class":1749},[1207,4058,4059],{"class":1209,"line":2105},[1207,4060,4061],{"class":1756},"        Test phone number validation\n",[1207,4063,4064],{"class":1209,"line":2111},[1207,4065,1836],{"class":1756},[1207,4067,4068],{"class":1209,"line":2139},[1207,4069,4070],{"class":1756},"        This test verifies that model validation works correctly.\n",[1207,4072,4073],{"class":1209,"line":2144},[1207,4074,4075],{"class":1756},"        We create an invalid object and expect validation to fail.\n",[1207,4077,4078],{"class":1209,"line":2150},[1207,4079,1824],{"class":1749},[1207,4081,4082],{"class":1209,"line":2174},[1207,4083,4084],{"class":1213},"        # Arrange: Create a profile with invalid phone number\n",[1207,4086,4087],{"class":1209,"line":2195},[1207,4088,4089],{"class":1213},"        # Using .build() creates the object but doesn't save it to database\n",[1207,4091,4092,4094,4096,4098,4100,4103,4105,4107,4109,4111,4114,4116],{"class":1209,"line":2215},[1207,4093,3817],{"class":1620},[1207,4095,1961],{"class":1632},[1207,4097,3436],{"class":1620},[1207,4099,1633],{"class":1632},[1207,4101,4102],{"class":1862},"build",[1207,4104,1811],{"class":1632},[1207,4106,3630],{"class":1957},[1207,4108,1961],{"class":1632},[1207,4110,1965],{"class":1964},[1207,4112,4113],{"class":1224},"invalid-phone",[1207,4115,1965],{"class":1964},[1207,4117,2136],{"class":1632},[1207,4119,4120],{"class":1209,"line":2220},[1207,4121,1836],{"class":1620},[1207,4123,4124],{"class":1209,"line":2235},[1207,4125,4126],{"class":1213},"        # Act & Assert: Expect validation to fail\n",[1207,4128,4129,4131,4133,4135,4137,4139,4142],{"class":1209,"line":2253},[1207,4130,2295],{"class":1616},[1207,4132,2298],{"class":1620},[1207,4134,1633],{"class":1632},[1207,4136,2303],{"class":1862},[1207,4138,1811],{"class":1632},[1207,4140,4141],{"class":1862},"ValidationError",[1207,4143,1818],{"class":1632},[1207,4145,4146,4149,4151,4154,4157],{"class":1209,"line":2258},[1207,4147,4148],{"class":1620},"            profile",[1207,4150,1633],{"class":1632},[1207,4152,4153],{"class":1862},"full_clean",[1207,4155,4156],{"class":1632},"()",[1207,4158,4159],{"class":1213},"  # This runs model validation\n",[1207,4161,4162],{"class":1209,"line":2264},[1207,4163,1763],{"class":1620},[1207,4165,4166,4168,4171,4173,4175],{"class":1209,"line":2269},[1207,4167,1806],{"class":1735},[1207,4169,4170],{"class":1794}," test_user_profile_relationship",[1207,4172,1811],{"class":1632},[1207,4174,1815],{"class":1814},[1207,4176,1818],{"class":1632},[1207,4178,4179],{"class":1209,"line":2275},[1207,4180,1824],{"class":1749},[1207,4182,4183],{"class":1209,"line":2281},[1207,4184,4185],{"class":1756},"        Test the relationship between User and UserProfile\n",[1207,4187,4188],{"class":1209,"line":2286},[1207,4189,1836],{"class":1756},[1207,4191,4192],{"class":1209,"line":2292},[1207,4193,4194],{"class":1756},"        This verifies that Django's foreign key relationships work correctly.\n",[1207,4196,4197],{"class":1209,"line":2313},[1207,4198,1824],{"class":1749},[1207,4200,4201],{"class":1209,"line":2334},[1207,4202,4203],{"class":1213},"        # Arrange: Create a profile (which automatically creates a user)\n",[1207,4205,4206,4208,4210,4212],{"class":1209,"line":2339},[1207,4207,3817],{"class":1620},[1207,4209,1961],{"class":1632},[1207,4211,3436],{"class":1862},[1207,4213,1866],{"class":1632},[1207,4215,4216],{"class":1209,"line":2358},[1207,4217,1836],{"class":1620},[1207,4219,4220],{"class":1209,"line":2381},[1207,4221,4222],{"class":1213},"        # Act: Access the related user\n",[1207,4224,4225,4227,4229,4231,4233],{"class":1209,"line":2386},[1207,4226,2570],{"class":1620},[1207,4228,1961],{"class":1632},[1207,4230,3839],{"class":1620},[1207,4232,1633],{"class":1632},[1207,4234,4235],{"class":1942},"user\n",[1207,4237,4238],{"class":1209,"line":2392},[1207,4239,1836],{"class":1620},[1207,4241,4242],{"class":1209,"line":2397},[1207,4243,4244],{"class":1213},"        # Assert: Verify the relationship works both ways\n",[1207,4246,4247,4249,4251,4253,4255,4257],{"class":1209,"line":2403},[1207,4248,2153],{"class":1616},[1207,4250,2604],{"class":1620},[1207,4252,1633],{"class":1632},[1207,4254,4026],{"class":1942},[1207,4256,2164],{"class":2163},[1207,4258,4259],{"class":1620}," profile\n",[1207,4261,4262,4264,4266,4268,4270,4272],{"class":1209,"line":2409},[1207,4263,2153],{"class":1616},[1207,4265,3839],{"class":1620},[1207,4267,1633],{"class":1632},[1207,4269,2643],{"class":1942},[1207,4271,2164],{"class":2163},[1207,4273,4274],{"class":1620}," user\n",[1207,4276,4277],{"class":1209,"line":2414},[1207,4278,1763],{"class":1620},[1207,4280,4281,4283,4286,4288,4290],{"class":1209,"line":2420},[1207,4282,1806],{"class":1735},[1207,4284,4285],{"class":1794}," test_multiple_profiles_different_users",[1207,4287,1811],{"class":1632},[1207,4289,1815],{"class":1814},[1207,4291,1818],{"class":1632},[1207,4293,4294],{"class":1209,"line":2426},[1207,4295,1824],{"class":1749},[1207,4297,4298],{"class":1209,"line":2431},[1207,4299,4300],{"class":1756},"        Test that multiple profiles create different users\n",[1207,4302,4303],{"class":1209,"line":2437},[1207,4304,1836],{"class":1756},[1207,4306,4307],{"class":1209,"line":2448},[1207,4308,4309],{"class":1756},"        This verifies that our factory creates unique objects each time.\n",[1207,4311,4312],{"class":1209,"line":2470},[1207,4313,1824],{"class":1749},[1207,4315,4316],{"class":1209,"line":2490},[1207,4317,4318],{"class":1213},"        # Act: Create multiple profiles\n",[1207,4320,4321,4324,4326,4328],{"class":1209,"line":2511},[1207,4322,4323],{"class":1620},"        profile1 ",[1207,4325,1961],{"class":1632},[1207,4327,3436],{"class":1862},[1207,4329,1866],{"class":1632},[1207,4331,4332,4335,4337,4339],{"class":1209,"line":2532},[1207,4333,4334],{"class":1620},"        profile2 ",[1207,4336,1961],{"class":1632},[1207,4338,3436],{"class":1862},[1207,4340,1866],{"class":1632},[1207,4342,4343],{"class":1209,"line":2551},[1207,4344,1836],{"class":1620},[1207,4346,4347],{"class":1209,"line":2557},[1207,4348,4349],{"class":1213},"        # Assert: Verify they have different users\n",[1207,4351,4352,4354,4357,4359,4361,4364,4367,4369],{"class":1209,"line":2562},[1207,4353,2153],{"class":1616},[1207,4355,4356],{"class":1620}," profile1",[1207,4358,1633],{"class":1632},[1207,4360,2643],{"class":1942},[1207,4362,4363],{"class":2163}," !=",[1207,4365,4366],{"class":1620}," profile2",[1207,4368,1633],{"class":1632},[1207,4370,4235],{"class":1942},[1207,4372,4373,4375,4377,4379,4381,4383,4385,4387,4389,4391,4393,4395],{"class":1209,"line":2567},[1207,4374,2153],{"class":1616},[1207,4376,4356],{"class":1620},[1207,4378,1633],{"class":1632},[1207,4380,2643],{"class":1942},[1207,4382,1633],{"class":1632},[1207,4384,2183],{"class":1942},[1207,4386,4363],{"class":2163},[1207,4388,4366],{"class":1620},[1207,4390,1633],{"class":1632},[1207,4392,2643],{"class":1942},[1207,4394,1633],{"class":1632},[1207,4396,4397],{"class":1942},"username\n",[1207,4399,4400,4402,4404,4406,4408,4410,4412,4414,4416,4418,4420,4422],{"class":1209,"line":2588},[1207,4401,2153],{"class":1616},[1207,4403,4356],{"class":1620},[1207,4405,1633],{"class":1632},[1207,4407,2643],{"class":1942},[1207,4409,1633],{"class":1632},[1207,4411,2204],{"class":1942},[1207,4413,4363],{"class":2163},[1207,4415,4366],{"class":1620},[1207,4417,1633],{"class":1632},[1207,4419,2643],{"class":1942},[1207,4421,1633],{"class":1632},[1207,4423,4424],{"class":1942},"email\n",[1026,4426,4427],{},[1045,4428,4429],{},"Benefits of using factories:",[1123,4431,4432,4438,4444,4450,4456],{},[1084,4433,4434,4437],{},[1045,4435,4436],{},"Realistic Data",": Faker generates realistic names, emails, addresses, etc.",[1084,4439,4440,4443],{},[1045,4441,4442],{},"Unique Values",": Sequential fields ensure no duplicate key errors",[1084,4445,4446,4449],{},[1045,4447,4448],{},"Relationships",": SubFactory automatically creates related objects",[1084,4451,4452,4455],{},[1045,4453,4454],{},"Customization",": You can override any field when creating objects",[1084,4457,4458,4461],{},[1045,4459,4460],{},"Maintainability",": When your model changes, you only update the factory",[1026,4463,4464],{},[1045,4465,4466],{},"Factory usage patterns:",[1197,4468,4470],{"className":1602,"code":4469,"language":1604,"meta":1202,"style":1202},"# Create with defaults\nuser = UserFactory()\n\n# Override specific fields\nuser = UserFactory(username='specific_user', email='specific@email.com')\n\n# Create multiple objects\nusers = UserFactory.create_batch(5)  # Creates 5 users\n\n# Build without saving to database (useful for validation tests)\nuser = UserFactory.build()\n\n# Create related objects\nprofile = UserProfileFactory(user__username='custom_user')  # Creates user with custom username\n",[1204,4471,4472,4477,4488,4492,4497,4534,4538,4543,4567,4571,4576,4590,4594,4599],{"__ignoreMap":1202},[1207,4473,4474],{"class":1209,"line":1210},[1207,4475,4476],{"class":1213},"# Create with defaults\n",[1207,4478,4479,4482,4484,4486],{"class":1209,"line":1217},[1207,4480,4481],{"class":1620},"user ",[1207,4483,1961],{"class":1632},[1207,4485,3172],{"class":1862},[1207,4487,1866],{"class":1632},[1207,4489,4490],{"class":1209,"line":1238},[1207,4491,1527],{"emptyLinePlaceholder":1526},[1207,4493,4494],{"class":1209,"line":1254},[1207,4495,4496],{"class":1213},"# Override specific fields\n",[1207,4498,4499,4501,4503,4505,4507,4509,4511,4513,4516,4518,4520,4523,4525,4527,4530,4532],{"class":1209,"line":1270},[1207,4500,4481],{"class":1620},[1207,4502,1961],{"class":1632},[1207,4504,3172],{"class":1862},[1207,4506,1811],{"class":1632},[1207,4508,2183],{"class":1957},[1207,4510,1961],{"class":1632},[1207,4512,1965],{"class":1964},[1207,4514,4515],{"class":1224},"specific_user",[1207,4517,1965],{"class":1964},[1207,4519,1644],{"class":1632},[1207,4521,4522],{"class":1957}," email",[1207,4524,1961],{"class":1632},[1207,4526,1965],{"class":1964},[1207,4528,4529],{"class":1224},"specific@email.com",[1207,4531,1965],{"class":1964},[1207,4533,2136],{"class":1632},[1207,4535,4536],{"class":1209,"line":1535},[1207,4537,1527],{"emptyLinePlaceholder":1526},[1207,4539,4540],{"class":1209,"line":1710},[1207,4541,4542],{"class":1213},"# Create multiple objects\n",[1207,4544,4545,4548,4550,4552,4554,4557,4559,4562,4564],{"class":1209,"line":1727},[1207,4546,4547],{"class":1620},"users ",[1207,4549,1961],{"class":1632},[1207,4551,3172],{"class":1620},[1207,4553,1633],{"class":1632},[1207,4555,4556],{"class":1862},"create_batch",[1207,4558,1811],{"class":1632},[1207,4560,4561],{"class":1231},"5",[1207,4563,2328],{"class":1632},[1207,4565,4566],{"class":1213},"  # Creates 5 users\n",[1207,4568,4569],{"class":1209,"line":1732},[1207,4570,1527],{"emptyLinePlaceholder":1526},[1207,4572,4573],{"class":1209,"line":1746},[1207,4574,4575],{"class":1213},"# Build without saving to database (useful for validation tests)\n",[1207,4577,4578,4580,4582,4584,4586,4588],{"class":1209,"line":1753},[1207,4579,4481],{"class":1620},[1207,4581,1961],{"class":1632},[1207,4583,3172],{"class":1620},[1207,4585,1633],{"class":1632},[1207,4587,4102],{"class":1862},[1207,4589,1866],{"class":1632},[1207,4591,4592],{"class":1209,"line":1760},[1207,4593,1527],{"emptyLinePlaceholder":1526},[1207,4595,4596],{"class":1209,"line":1766},[1207,4597,4598],{"class":1213},"# Create related objects\n",[1207,4600,4601,4604,4606,4608,4610,4613,4615,4617,4620,4622,4624],{"class":1209,"line":1772},[1207,4602,4603],{"class":1620},"profile ",[1207,4605,1961],{"class":1632},[1207,4607,3436],{"class":1862},[1207,4609,1811],{"class":1632},[1207,4611,4612],{"class":1957},"user__username",[1207,4614,1961],{"class":1632},[1207,4616,1965],{"class":1964},[1207,4618,4619],{"class":1224},"custom_user",[1207,4621,1965],{"class":1964},[1207,4623,2328],{"class":1632},[1207,4625,4626],{"class":1213},"  # Creates user with custom username\n",[1030,4628,4630],{"id":4629},"integration-testing","Integration Testing",[1026,4632,4633],{},"Integration tests verify that different components of your service work together correctly. While unit tests focus on individual functions, integration tests ensure that your service layer, database, and external APIs all play nicely together.",[1038,4635,4637],{"id":4636},"understanding-integration-vs-unit-tests","Understanding Integration vs Unit Tests",[1026,4639,4640,4643,4644,4647],{},[1045,4641,4642],{},"Unit Test",": \"Does this function calculate tax correctly?\"\n",[1045,4645,4646],{},"Integration Test",": \"When I create an order through the service layer, does it save to the database, call the tax service, and update the order total correctly?\"",[1026,4649,4650],{},"Integration tests are slower than unit tests because they involve real database operations and potentially external service calls, but they catch bugs that unit tests miss.",[1038,4652,4654],{"id":4653},"database-integration-tests","Database Integration Tests",[1026,4656,4657],{},"These tests verify that your service layer correctly interacts with the database, including transactions, relationships, and data consistency.",[1197,4659,4661],{"className":1602,"code":4660,"language":1604,"meta":1202,"style":1202},"# user_service/tests/test_integration.py\nimport pytest\nfrom django.test import TransactionTestCase\nfrom django.db import transaction\nfrom django.core.exceptions import ValidationError\nfrom user_service.models import User, UserProfile\nfrom user_service.services import UserService\n\n@pytest.mark.django_db\nclass TestUserServiceIntegration:\n    \"\"\"\n    Integration tests for UserService\n    \n    These tests verify that the service layer correctly interacts\n    with the database and handles complex operations involving\n    multiple models and transactions.\n    \"\"\"\n    \n    def test_user_creation_with_profile(self):\n        \"\"\"\n        Test complete user creation flow with profile\n        \n        This test verifies that creating a user with a profile:\n        1. Creates both User and UserProfile records\n        2. Links them correctly\n        3. Saves all data to the database\n        4. Handles the transaction properly\n        \"\"\"\n        # Arrange: Set up test data\n        service = UserService()\n        user_data = {\n            'username': 'integrationuser',\n            'email': 'integration@example.com',\n            'password': 'testpass123',\n            'profile_data': {\n                'bio': 'Integration test user',\n                'phone_number': '+1234567890'\n            }\n        }\n        \n        # Act: Call the service method\n        user = service.create_user_with_profile(user_data)\n        \n        # Assert: Verify user creation\n        assert user.username == 'integrationuser'\n        assert user.email == 'integration@example.com'\n        \n        # Verify the user was actually saved to database\n        saved_user = User.objects.get(id=user.id)\n        assert saved_user.username == 'integrationuser'\n        \n        # Assert: Verify profile creation and relationship\n        assert hasattr(user, 'profile')\n        assert user.profile.bio == 'Integration test user'\n        assert user.profile.phone_number == '+1234567890'\n        \n        # Verify the profile was saved and linked correctly\n        saved_profile = UserProfile.objects.get(user=user)\n        assert saved_profile.bio == 'Integration test user'\n    \n    def test_transaction_rollback_on_error(self):\n        \"\"\"\n        Test that transactions are properly rolled back on errors\n        \n        This is a critical test for data integrity. If creating a user\n        succeeds but creating the profile fails, we want to ensure\n        that the user creation is rolled back so we don't have\n        orphaned data.\n        \"\"\"\n        service = UserService()\n        \n        # Arrange: Create user data that will cause an error in profile creation\n        user_data = {\n            'username': 'erroruser',\n            'email': 'error@example.com',\n            'password': 'testpass123',\n            'profile_data': {\n                'phone_number': 'invalid-phone-number'  # This will cause validation error\n            }\n        }\n        \n        # Act & Assert: Expect the operation to fail\n        with pytest.raises(ValidationError):\n            service.create_user_with_profile(user_data)\n        \n        # Assert: Verify that user was not created due to rollback\n        # This is the key test - if transactions work correctly,\n        # the user should not exist in the database\n        assert not User.objects.filter(username='erroruser').exists()\n        \n        # Also verify no orphaned profile was created\n        assert not UserProfile.objects.filter(user__username='erroruser').exists()\n    \n    def test_bulk_user_creation(self):\n        \"\"\"\n        Test creating multiple users in a single operation\n        \n        This tests bulk operations and ensures they work correctly\n        with the database.\n        \"\"\"\n        service = UserService()\n        \n        # Arrange: Create data for multiple users\n        users_data = [\n            {\n                'username': f'bulkuser{i}',\n                'email': f'bulk{i}@example.com',\n                'password': 'testpass123'\n            }\n            for i in range(5)\n        ]\n        \n        # Act: Create users in bulk\n        created_users = service.create_users_bulk(users_data)\n        \n        # Assert: Verify all users were created\n        assert len(created_users) == 5\n        \n        # Verify they're all in the database\n        for i, user in enumerate(created_users):\n            assert user.username == f'bulkuser{i}'\n            # Verify it's actually in the database\n            db_user = User.objects.get(id=user.id)\n            assert db_user.username == f'bulkuser{i}'\n    \n    def test_user_update_with_related_data(self):\n        \"\"\"\n        Test updating user with related profile data\n        \n        This tests complex update operations that involve\n        multiple related models.\n        \"\"\"\n        service = UserService()\n        \n        # Arrange: Create a user with profile\n        user = service.create_user_with_profile({\n            'username': 'updateuser',\n            'email': 'update@example.com',\n            'password': 'testpass123',\n            'profile_data': {\n                'bio': 'Original bio',\n                'phone_number': '+1111111111'\n            }\n        })\n        \n        # Act: Update user and profile data\n        updated_user = service.update_user_with_profile(user.id, {\n            'first_name': 'Updated',\n            'last_name': 'Name',\n            'profile_data': {\n                'bio': 'Updated bio',\n                'phone_number': '+2222222222'\n            }\n        })\n        \n        # Assert: Verify user updates\n        assert updated_user.first_name == 'Updated'\n        assert updated_user.last_name == 'Name'\n        \n        # Verify profile updates\n        updated_user.refresh_from_db()  # Reload from database\n        assert updated_user.profile.bio == 'Updated bio'\n        assert updated_user.profile.phone_number == '+2222222222'\n        \n        # Verify changes are persisted in database\n        db_user = User.objects.select_related('profile').get(id=user.id)\n        assert db_user.first_name == 'Updated'\n        assert db_user.profile.bio == 'Updated bio'\n",[1204,4662,4663,4668,4674,4689,4705,4723,4741,4755,4759,4773,4782,4786,4791,4795,4800,4805,4810,4814,4818,4831,4835,4840,4844,4849,4854,4859,4864,4869,4873,4877,4888,4896,4915,4934,4952,4965,4985,5002,5007,5011,5015,5020,5040,5044,5049,5067,5085,5089,5094,5126,5145,5149,5154,5176,5198,5220,5224,5229,5257,5276,5280,5293,5297,5302,5306,5311,5316,5321,5326,5330,5340,5344,5349,5357,5376,5395,5413,5425,5445,5449,5453,5457,5462,5478,5493,5497,5502,5507,5512,5549,5553,5558,5592,5596,5609,5613,5618,5622,5627,5632,5636,5646,5650,5655,5665,5670,5696,5722,5738,5742,5762,5767,5771,5776,5797,5801,5806,5825,5829,5834,5858,5883,5888,5919,5944,5948,5961,5965,5970,5974,5979,5985,5990,6001,6006,6012,6028,6048,6068,6087,6100,6120,6138,6143,6149,6154,6160,6187,6206,6226,6239,6259,6277,6282,6287,6292,6298,6318,6337,6342,6348,6364,6387,6410,6415,6421,6466,6485],{"__ignoreMap":1202},[1207,4664,4665],{"class":1209,"line":1210},[1207,4666,4667],{"class":1213},"# user_service/tests/test_integration.py\n",[1207,4669,4670,4672],{"class":1209,"line":1217},[1207,4671,1617],{"class":1616},[1207,4673,1621],{"class":1620},[1207,4675,4676,4678,4680,4682,4684,4686],{"class":1209,"line":1238},[1207,4677,1626],{"class":1616},[1207,4679,1654],{"class":1620},[1207,4681,1633],{"class":1632},[1207,4683,1659],{"class":1620},[1207,4685,1617],{"class":1616},[1207,4687,4688],{"class":1620}," TransactionTestCase\n",[1207,4690,4691,4693,4695,4697,4700,4702],{"class":1209,"line":1254},[1207,4692,1626],{"class":1616},[1207,4694,1654],{"class":1620},[1207,4696,1633],{"class":1632},[1207,4698,4699],{"class":1620},"db ",[1207,4701,1617],{"class":1616},[1207,4703,4704],{"class":1620}," transaction\n",[1207,4706,4707,4709,4711,4713,4715,4717,4719,4721],{"class":1209,"line":1270},[1207,4708,1626],{"class":1616},[1207,4710,1654],{"class":1620},[1207,4712,1633],{"class":1632},[1207,4714,3664],{"class":1620},[1207,4716,1633],{"class":1632},[1207,4718,1719],{"class":1620},[1207,4720,1617],{"class":1616},[1207,4722,3673],{"class":1620},[1207,4724,4725,4727,4729,4731,4733,4735,4737,4739],{"class":1209,"line":1535},[1207,4726,1626],{"class":1616},[1207,4728,1697],{"class":1620},[1207,4730,1633],{"class":1632},[1207,4732,1685],{"class":1620},[1207,4734,1617],{"class":1616},[1207,4736,1937],{"class":1620},[1207,4738,1644],{"class":1632},[1207,4740,3161],{"class":1620},[1207,4742,4743,4745,4747,4749,4751,4753],{"class":1209,"line":1710},[1207,4744,1626],{"class":1616},[1207,4746,1697],{"class":1620},[1207,4748,1633],{"class":1632},[1207,4750,1702],{"class":1620},[1207,4752,1617],{"class":1616},[1207,4754,1707],{"class":1620},[1207,4756,4757],{"class":1209,"line":1727},[1207,4758,1527],{"emptyLinePlaceholder":1526},[1207,4760,4761,4763,4765,4767,4769,4771],{"class":1209,"line":1732},[1207,4762,3707],{"class":1632},[1207,4764,1795],{"class":1794},[1207,4766,1633],{"class":1632},[1207,4768,2029],{"class":1794},[1207,4770,1633],{"class":1632},[1207,4772,2034],{"class":1794},[1207,4774,4775,4777,4780],{"class":1209,"line":1746},[1207,4776,1736],{"class":1735},[1207,4778,4779],{"class":1739}," TestUserServiceIntegration",[1207,4781,1743],{"class":1632},[1207,4783,4784],{"class":1209,"line":1753},[1207,4785,1750],{"class":1749},[1207,4787,4788],{"class":1209,"line":1760},[1207,4789,4790],{"class":1756},"    Integration tests for UserService\n",[1207,4792,4793],{"class":1209,"line":1766},[1207,4794,1763],{"class":1756},[1207,4796,4797],{"class":1209,"line":1772},[1207,4798,4799],{"class":1756},"    These tests verify that the service layer correctly interacts\n",[1207,4801,4802],{"class":1209,"line":1778},[1207,4803,4804],{"class":1756},"    with the database and handles complex operations involving\n",[1207,4806,4807],{"class":1209,"line":1783},[1207,4808,4809],{"class":1756},"    multiple models and transactions.\n",[1207,4811,4812],{"class":1209,"line":1788},[1207,4813,1750],{"class":1749},[1207,4815,4816],{"class":1209,"line":1803},[1207,4817,1763],{"class":1620},[1207,4819,4820,4822,4825,4827,4829],{"class":1209,"line":1821},[1207,4821,1806],{"class":1735},[1207,4823,4824],{"class":1794}," test_user_creation_with_profile",[1207,4826,1811],{"class":1632},[1207,4828,1815],{"class":1814},[1207,4830,1818],{"class":1632},[1207,4832,4833],{"class":1209,"line":1827},[1207,4834,1824],{"class":1749},[1207,4836,4837],{"class":1209,"line":1833},[1207,4838,4839],{"class":1756},"        Test complete user creation flow with profile\n",[1207,4841,4842],{"class":1209,"line":1839},[1207,4843,1836],{"class":1756},[1207,4845,4846],{"class":1209,"line":1845},[1207,4847,4848],{"class":1756},"        This test verifies that creating a user with a profile:\n",[1207,4850,4851],{"class":1209,"line":1851},[1207,4852,4853],{"class":1756},"        1. Creates both User and UserProfile records\n",[1207,4855,4856],{"class":1209,"line":1856},[1207,4857,4858],{"class":1756},"        2. Links them correctly\n",[1207,4860,4861],{"class":1209,"line":1869},[1207,4862,4863],{"class":1756},"        3. Saves all data to the database\n",[1207,4865,4866],{"class":1209,"line":1874},[1207,4867,4868],{"class":1756},"        4. Handles the transaction properly\n",[1207,4870,4871],{"class":1209,"line":1885},[1207,4872,1824],{"class":1749},[1207,4874,4875],{"class":1209,"line":1899},[1207,4876,2434],{"class":1213},[1207,4878,4879,4882,4884,4886],{"class":1209,"line":1904},[1207,4880,4881],{"class":1620},"        service ",[1207,4883,1961],{"class":1632},[1207,4885,1863],{"class":1862},[1207,4887,1866],{"class":1632},[1207,4889,4890,4892,4894],{"class":1209,"line":1910},[1207,4891,2440],{"class":1620},[1207,4893,1961],{"class":1632},[1207,4895,2445],{"class":1632},[1207,4897,4898,4900,4902,4904,4906,4908,4911,4913],{"class":1209,"line":1915},[1207,4899,2451],{"class":1964},[1207,4901,2183],{"class":1224},[1207,4903,1965],{"class":1964},[1207,4905,2458],{"class":1632},[1207,4907,2188],{"class":1964},[1207,4909,4910],{"class":1224},"integrationuser",[1207,4912,1965],{"class":1964},[1207,4914,1973],{"class":1632},[1207,4916,4917,4919,4921,4923,4925,4927,4930,4932],{"class":1209,"line":1921},[1207,4918,2451],{"class":1964},[1207,4920,2204],{"class":1224},[1207,4922,1965],{"class":1964},[1207,4924,2458],{"class":1632},[1207,4926,2188],{"class":1964},[1207,4928,4929],{"class":1224},"integration@example.com",[1207,4931,1965],{"class":1964},[1207,4933,1973],{"class":1632},[1207,4935,4936,4938,4940,4942,4944,4946,4948,4950],{"class":1209,"line":1927},[1207,4937,2451],{"class":1964},[1207,4939,2495],{"class":1224},[1207,4941,1965],{"class":1964},[1207,4943,2458],{"class":1632},[1207,4945,2188],{"class":1964},[1207,4947,2003],{"class":1224},[1207,4949,1965],{"class":1964},[1207,4951,1973],{"class":1632},[1207,4953,4954,4956,4959,4961,4963],{"class":1209,"line":1932},[1207,4955,2451],{"class":1964},[1207,4957,4958],{"class":1224},"profile_data",[1207,4960,1965],{"class":1964},[1207,4962,2458],{"class":1632},[1207,4964,2445],{"class":1632},[1207,4966,4967,4970,4972,4974,4976,4978,4981,4983],{"class":1209,"line":1954},[1207,4968,4969],{"class":1964},"                '",[1207,4971,3867],{"class":1224},[1207,4973,1965],{"class":1964},[1207,4975,2458],{"class":1632},[1207,4977,2188],{"class":1964},[1207,4979,4980],{"class":1224},"Integration test user",[1207,4982,1965],{"class":1964},[1207,4984,1973],{"class":1632},[1207,4986,4987,4989,4991,4993,4995,4997,5000],{"class":1209,"line":1976},[1207,4988,4969],{"class":1964},[1207,4990,3630],{"class":1224},[1207,4992,1965],{"class":1964},[1207,4994,2458],{"class":1632},[1207,4996,2188],{"class":1964},[1207,4998,4999],{"class":1224},"+1234567890",[1207,5001,2006],{"class":1964},[1207,5003,5004],{"class":1209,"line":1993},[1207,5005,5006],{"class":1632},"            }\n",[1207,5008,5009],{"class":1209,"line":2009},[1207,5010,2554],{"class":1632},[1207,5012,5013],{"class":1209,"line":2015},[1207,5014,1836],{"class":1620},[1207,5016,5017],{"class":1209,"line":2020},[1207,5018,5019],{"class":1213},"        # Act: Call the service method\n",[1207,5021,5022,5024,5026,5029,5031,5034,5036,5038],{"class":1209,"line":2037},[1207,5023,2570],{"class":1620},[1207,5025,1961],{"class":1632},[1207,5027,5028],{"class":1620}," service",[1207,5030,1633],{"class":1632},[1207,5032,5033],{"class":1862},"create_user_with_profile",[1207,5035,1811],{"class":1632},[1207,5037,2583],{"class":1862},[1207,5039,2136],{"class":1632},[1207,5041,5042],{"class":1209,"line":2060},[1207,5043,1836],{"class":1620},[1207,5045,5046],{"class":1209,"line":2065},[1207,5047,5048],{"class":1213},"        # Assert: Verify user creation\n",[1207,5050,5051,5053,5055,5057,5059,5061,5063,5065],{"class":1209,"line":2071},[1207,5052,2153],{"class":1616},[1207,5054,2604],{"class":1620},[1207,5056,1633],{"class":1632},[1207,5058,2183],{"class":1942},[1207,5060,2164],{"class":2163},[1207,5062,2188],{"class":1964},[1207,5064,4910],{"class":1224},[1207,5066,2006],{"class":1964},[1207,5068,5069,5071,5073,5075,5077,5079,5081,5083],{"class":1209,"line":2076},[1207,5070,2153],{"class":1616},[1207,5072,2604],{"class":1620},[1207,5074,1633],{"class":1632},[1207,5076,2204],{"class":1942},[1207,5078,2164],{"class":2163},[1207,5080,2188],{"class":1964},[1207,5082,4929],{"class":1224},[1207,5084,2006],{"class":1964},[1207,5086,5087],{"class":1209,"line":2082},[1207,5088,1836],{"class":1620},[1207,5090,5091],{"class":1209,"line":2088},[1207,5092,5093],{"class":1213},"        # Verify the user was actually saved to database\n",[1207,5095,5096,5099,5101,5103,5105,5107,5109,5112,5114,5116,5118,5120,5122,5124],{"class":1209,"line":2094},[1207,5097,5098],{"class":1620},"        saved_user ",[1207,5100,1961],{"class":1632},[1207,5102,1937],{"class":1620},[1207,5104,1633],{"class":1632},[1207,5106,1943],{"class":1942},[1207,5108,1633],{"class":1632},[1207,5110,5111],{"class":1862},"get",[1207,5113,1811],{"class":1632},[1207,5115,2133],{"class":1957},[1207,5117,1961],{"class":1632},[1207,5119,2643],{"class":1862},[1207,5121,1633],{"class":1632},[1207,5123,2133],{"class":1942},[1207,5125,2136],{"class":1632},[1207,5127,5128,5130,5133,5135,5137,5139,5141,5143],{"class":1209,"line":2100},[1207,5129,2153],{"class":1616},[1207,5131,5132],{"class":1620}," saved_user",[1207,5134,1633],{"class":1632},[1207,5136,2183],{"class":1942},[1207,5138,2164],{"class":2163},[1207,5140,2188],{"class":1964},[1207,5142,4910],{"class":1224},[1207,5144,2006],{"class":1964},[1207,5146,5147],{"class":1209,"line":2105},[1207,5148,1836],{"class":1620},[1207,5150,5151],{"class":1209,"line":2111},[1207,5152,5153],{"class":1213},"        # Assert: Verify profile creation and relationship\n",[1207,5155,5156,5158,5162,5164,5166,5168,5170,5172,5174],{"class":1209,"line":2139},[1207,5157,2153],{"class":1616},[1207,5159,5161],{"class":5160},"sJdAF"," hasattr",[1207,5163,1811],{"class":1632},[1207,5165,2643],{"class":1862},[1207,5167,1644],{"class":1632},[1207,5169,2188],{"class":1964},[1207,5171,4026],{"class":1224},[1207,5173,1965],{"class":1964},[1207,5175,2136],{"class":1632},[1207,5177,5178,5180,5182,5184,5186,5188,5190,5192,5194,5196],{"class":1209,"line":2144},[1207,5179,2153],{"class":1616},[1207,5181,2604],{"class":1620},[1207,5183,1633],{"class":1632},[1207,5185,4026],{"class":1942},[1207,5187,1633],{"class":1632},[1207,5189,3867],{"class":1942},[1207,5191,2164],{"class":2163},[1207,5193,2188],{"class":1964},[1207,5195,4980],{"class":1224},[1207,5197,2006],{"class":1964},[1207,5199,5200,5202,5204,5206,5208,5210,5212,5214,5216,5218],{"class":1209,"line":2150},[1207,5201,2153],{"class":1616},[1207,5203,2604],{"class":1620},[1207,5205,1633],{"class":1632},[1207,5207,4026],{"class":1942},[1207,5209,1633],{"class":1632},[1207,5211,3630],{"class":1942},[1207,5213,2164],{"class":2163},[1207,5215,2188],{"class":1964},[1207,5217,4999],{"class":1224},[1207,5219,2006],{"class":1964},[1207,5221,5222],{"class":1209,"line":2174},[1207,5223,1836],{"class":1620},[1207,5225,5226],{"class":1209,"line":2195},[1207,5227,5228],{"class":1213},"        # Verify the profile was saved and linked correctly\n",[1207,5230,5231,5234,5236,5239,5241,5243,5245,5247,5249,5251,5253,5255],{"class":1209,"line":2215},[1207,5232,5233],{"class":1620},"        saved_profile ",[1207,5235,1961],{"class":1632},[1207,5237,5238],{"class":1620}," UserProfile",[1207,5240,1633],{"class":1632},[1207,5242,1943],{"class":1942},[1207,5244,1633],{"class":1632},[1207,5246,5111],{"class":1862},[1207,5248,1811],{"class":1632},[1207,5250,2643],{"class":1957},[1207,5252,1961],{"class":1632},[1207,5254,2643],{"class":1862},[1207,5256,2136],{"class":1632},[1207,5258,5259,5261,5264,5266,5268,5270,5272,5274],{"class":1209,"line":2220},[1207,5260,2153],{"class":1616},[1207,5262,5263],{"class":1620}," saved_profile",[1207,5265,1633],{"class":1632},[1207,5267,3867],{"class":1942},[1207,5269,2164],{"class":2163},[1207,5271,2188],{"class":1964},[1207,5273,4980],{"class":1224},[1207,5275,2006],{"class":1964},[1207,5277,5278],{"class":1209,"line":2235},[1207,5279,1763],{"class":1620},[1207,5281,5282,5284,5287,5289,5291],{"class":1209,"line":2253},[1207,5283,1806],{"class":1735},[1207,5285,5286],{"class":1794}," test_transaction_rollback_on_error",[1207,5288,1811],{"class":1632},[1207,5290,1815],{"class":1814},[1207,5292,1818],{"class":1632},[1207,5294,5295],{"class":1209,"line":2258},[1207,5296,1824],{"class":1749},[1207,5298,5299],{"class":1209,"line":2264},[1207,5300,5301],{"class":1756},"        Test that transactions are properly rolled back on errors\n",[1207,5303,5304],{"class":1209,"line":2269},[1207,5305,1836],{"class":1756},[1207,5307,5308],{"class":1209,"line":2275},[1207,5309,5310],{"class":1756},"        This is a critical test for data integrity. If creating a user\n",[1207,5312,5313],{"class":1209,"line":2281},[1207,5314,5315],{"class":1756},"        succeeds but creating the profile fails, we want to ensure\n",[1207,5317,5318],{"class":1209,"line":2286},[1207,5319,5320],{"class":1756},"        that the user creation is rolled back so we don't have\n",[1207,5322,5323],{"class":1209,"line":2292},[1207,5324,5325],{"class":1756},"        orphaned data.\n",[1207,5327,5328],{"class":1209,"line":2313},[1207,5329,1824],{"class":1749},[1207,5331,5332,5334,5336,5338],{"class":1209,"line":2334},[1207,5333,4881],{"class":1620},[1207,5335,1961],{"class":1632},[1207,5337,1863],{"class":1862},[1207,5339,1866],{"class":1632},[1207,5341,5342],{"class":1209,"line":2339},[1207,5343,1836],{"class":1620},[1207,5345,5346],{"class":1209,"line":2358},[1207,5347,5348],{"class":1213},"        # Arrange: Create user data that will cause an error in profile creation\n",[1207,5350,5351,5353,5355],{"class":1209,"line":2381},[1207,5352,2440],{"class":1620},[1207,5354,1961],{"class":1632},[1207,5356,2445],{"class":1632},[1207,5358,5359,5361,5363,5365,5367,5369,5372,5374],{"class":1209,"line":2386},[1207,5360,2451],{"class":1964},[1207,5362,2183],{"class":1224},[1207,5364,1965],{"class":1964},[1207,5366,2458],{"class":1632},[1207,5368,2188],{"class":1964},[1207,5370,5371],{"class":1224},"erroruser",[1207,5373,1965],{"class":1964},[1207,5375,1973],{"class":1632},[1207,5377,5378,5380,5382,5384,5386,5388,5391,5393],{"class":1209,"line":2392},[1207,5379,2451],{"class":1964},[1207,5381,2204],{"class":1224},[1207,5383,1965],{"class":1964},[1207,5385,2458],{"class":1632},[1207,5387,2188],{"class":1964},[1207,5389,5390],{"class":1224},"error@example.com",[1207,5392,1965],{"class":1964},[1207,5394,1973],{"class":1632},[1207,5396,5397,5399,5401,5403,5405,5407,5409,5411],{"class":1209,"line":2397},[1207,5398,2451],{"class":1964},[1207,5400,2495],{"class":1224},[1207,5402,1965],{"class":1964},[1207,5404,2458],{"class":1632},[1207,5406,2188],{"class":1964},[1207,5408,2003],{"class":1224},[1207,5410,1965],{"class":1964},[1207,5412,1973],{"class":1632},[1207,5414,5415,5417,5419,5421,5423],{"class":1209,"line":2403},[1207,5416,2451],{"class":1964},[1207,5418,4958],{"class":1224},[1207,5420,1965],{"class":1964},[1207,5422,2458],{"class":1632},[1207,5424,2445],{"class":1632},[1207,5426,5427,5429,5431,5433,5435,5437,5440,5442],{"class":1209,"line":2409},[1207,5428,4969],{"class":1964},[1207,5430,3630],{"class":1224},[1207,5432,1965],{"class":1964},[1207,5434,2458],{"class":1632},[1207,5436,2188],{"class":1964},[1207,5438,5439],{"class":1224},"invalid-phone-number",[1207,5441,1965],{"class":1964},[1207,5443,5444],{"class":1213},"  # This will cause validation error\n",[1207,5446,5447],{"class":1209,"line":2414},[1207,5448,5006],{"class":1632},[1207,5450,5451],{"class":1209,"line":2420},[1207,5452,2554],{"class":1632},[1207,5454,5455],{"class":1209,"line":2426},[1207,5456,1836],{"class":1620},[1207,5458,5459],{"class":1209,"line":2431},[1207,5460,5461],{"class":1213},"        # Act & Assert: Expect the operation to fail\n",[1207,5463,5464,5466,5468,5470,5472,5474,5476],{"class":1209,"line":2437},[1207,5465,2295],{"class":1616},[1207,5467,2298],{"class":1620},[1207,5469,1633],{"class":1632},[1207,5471,2303],{"class":1862},[1207,5473,1811],{"class":1632},[1207,5475,4141],{"class":1862},[1207,5477,1818],{"class":1632},[1207,5479,5480,5483,5485,5487,5489,5491],{"class":1209,"line":2448},[1207,5481,5482],{"class":1620},"            service",[1207,5484,1633],{"class":1632},[1207,5486,5033],{"class":1862},[1207,5488,1811],{"class":1632},[1207,5490,2583],{"class":1862},[1207,5492,2136],{"class":1632},[1207,5494,5495],{"class":1209,"line":2470},[1207,5496,1836],{"class":1620},[1207,5498,5499],{"class":1209,"line":2490},[1207,5500,5501],{"class":1213},"        # Assert: Verify that user was not created due to rollback\n",[1207,5503,5504],{"class":1209,"line":2511},[1207,5505,5506],{"class":1213},"        # This is the key test - if transactions work correctly,\n",[1207,5508,5509],{"class":1209,"line":2532},[1207,5510,5511],{"class":1213},"        # the user should not exist in the database\n",[1207,5513,5514,5516,5518,5520,5522,5524,5526,5529,5531,5533,5535,5537,5539,5541,5544,5547],{"class":1209,"line":2551},[1207,5515,2153],{"class":1616},[1207,5517,3853],{"class":2163},[1207,5519,1937],{"class":1620},[1207,5521,1633],{"class":1632},[1207,5523,1943],{"class":1942},[1207,5525,1633],{"class":1632},[1207,5527,5528],{"class":1862},"filter",[1207,5530,1811],{"class":1632},[1207,5532,2183],{"class":1957},[1207,5534,1961],{"class":1632},[1207,5536,1965],{"class":1964},[1207,5538,5371],{"class":1224},[1207,5540,1965],{"class":1964},[1207,5542,5543],{"class":1632},").",[1207,5545,5546],{"class":1862},"exists",[1207,5548,1866],{"class":1632},[1207,5550,5551],{"class":1209,"line":2557},[1207,5552,1836],{"class":1620},[1207,5554,5555],{"class":1209,"line":2562},[1207,5556,5557],{"class":1213},"        # Also verify no orphaned profile was created\n",[1207,5559,5560,5562,5564,5566,5568,5570,5572,5574,5576,5578,5580,5582,5584,5586,5588,5590],{"class":1209,"line":2567},[1207,5561,2153],{"class":1616},[1207,5563,3853],{"class":2163},[1207,5565,5238],{"class":1620},[1207,5567,1633],{"class":1632},[1207,5569,1943],{"class":1942},[1207,5571,1633],{"class":1632},[1207,5573,5528],{"class":1862},[1207,5575,1811],{"class":1632},[1207,5577,4612],{"class":1957},[1207,5579,1961],{"class":1632},[1207,5581,1965],{"class":1964},[1207,5583,5371],{"class":1224},[1207,5585,1965],{"class":1964},[1207,5587,5543],{"class":1632},[1207,5589,5546],{"class":1862},[1207,5591,1866],{"class":1632},[1207,5593,5594],{"class":1209,"line":2588},[1207,5595,1763],{"class":1620},[1207,5597,5598,5600,5603,5605,5607],{"class":1209,"line":2593},[1207,5599,1806],{"class":1735},[1207,5601,5602],{"class":1794}," test_bulk_user_creation",[1207,5604,1811],{"class":1632},[1207,5606,1815],{"class":1814},[1207,5608,1818],{"class":1632},[1207,5610,5611],{"class":1209,"line":2599},[1207,5612,1824],{"class":1749},[1207,5614,5615],{"class":1209,"line":2619},[1207,5616,5617],{"class":1756},"        Test creating multiple users in a single operation\n",[1207,5619,5620],{"class":1209,"line":2624},[1207,5621,1836],{"class":1756},[1207,5623,5624],{"class":1209,"line":2630},[1207,5625,5626],{"class":1756},"        This tests bulk operations and ensures they work correctly\n",[1207,5628,5629],{"class":1209,"line":2652},[1207,5630,5631],{"class":1756},"        with the database.\n",[1207,5633,5634],{"class":1209,"line":2657},[1207,5635,1824],{"class":1749},[1207,5637,5638,5640,5642,5644],{"class":1209,"line":2675},[1207,5639,4881],{"class":1620},[1207,5641,1961],{"class":1632},[1207,5643,1863],{"class":1862},[1207,5645,1866],{"class":1632},[1207,5647,5648],{"class":1209,"line":2702},[1207,5649,1836],{"class":1620},[1207,5651,5652],{"class":1209,"line":2707},[1207,5653,5654],{"class":1213},"        # Arrange: Create data for multiple users\n",[1207,5656,5657,5660,5662],{"class":1209,"line":2713},[1207,5658,5659],{"class":1620},"        users_data ",[1207,5661,1961],{"class":1632},[1207,5663,5664],{"class":1632}," [\n",[1207,5666,5667],{"class":1209,"line":2718},[1207,5668,5669],{"class":1632},"            {\n",[1207,5671,5672,5674,5676,5678,5680,5682,5685,5687,5690,5692,5694],{"class":1209,"line":2724},[1207,5673,4969],{"class":1964},[1207,5675,2183],{"class":1224},[1207,5677,1965],{"class":1964},[1207,5679,2458],{"class":1632},[1207,5681,3281],{"class":1735},[1207,5683,5684],{"class":1224},"'bulkuser",[1207,5686,3288],{"class":3287},[1207,5688,5689],{"class":1620},"i",[1207,5691,3294],{"class":3287},[1207,5693,1965],{"class":1224},[1207,5695,1973],{"class":1632},[1207,5697,5698,5700,5702,5704,5706,5708,5711,5713,5715,5717,5720],{"class":1209,"line":2730},[1207,5699,4969],{"class":1964},[1207,5701,2204],{"class":1224},[1207,5703,1965],{"class":1964},[1207,5705,2458],{"class":1632},[1207,5707,3281],{"class":1735},[1207,5709,5710],{"class":1224},"'bulk",[1207,5712,3288],{"class":3287},[1207,5714,5689],{"class":1620},[1207,5716,3294],{"class":3287},[1207,5718,5719],{"class":1224},"@example.com'",[1207,5721,1973],{"class":1632},[1207,5723,5724,5726,5728,5730,5732,5734,5736],{"class":1209,"line":2736},[1207,5725,4969],{"class":1964},[1207,5727,2495],{"class":1224},[1207,5729,1965],{"class":1964},[1207,5731,2458],{"class":1632},[1207,5733,2188],{"class":1964},[1207,5735,2003],{"class":1224},[1207,5737,2006],{"class":1964},[1207,5739,5740],{"class":1209,"line":2742},[1207,5741,5006],{"class":1632},[1207,5743,5744,5747,5750,5753,5756,5758,5760],{"class":1209,"line":2748},[1207,5745,5746],{"class":1616},"            for",[1207,5748,5749],{"class":1620}," i ",[1207,5751,5752],{"class":1616},"in",[1207,5754,5755],{"class":5160}," range",[1207,5757,1811],{"class":1632},[1207,5759,4561],{"class":1231},[1207,5761,2136],{"class":1632},[1207,5763,5764],{"class":1209,"line":2753},[1207,5765,5766],{"class":1632},"        ]\n",[1207,5768,5769],{"class":1209,"line":2759},[1207,5770,1836],{"class":1620},[1207,5772,5773],{"class":1209,"line":2781},[1207,5774,5775],{"class":1213},"        # Act: Create users in bulk\n",[1207,5777,5778,5781,5783,5785,5787,5790,5792,5795],{"class":1209,"line":2820},[1207,5779,5780],{"class":1620},"        created_users ",[1207,5782,1961],{"class":1632},[1207,5784,5028],{"class":1620},[1207,5786,1633],{"class":1632},[1207,5788,5789],{"class":1862},"create_users_bulk",[1207,5791,1811],{"class":1632},[1207,5793,5794],{"class":1862},"users_data",[1207,5796,2136],{"class":1632},[1207,5798,5799],{"class":1209,"line":2825},[1207,5800,1836],{"class":1620},[1207,5802,5803],{"class":1209,"line":2830},[1207,5804,5805],{"class":1213},"        # Assert: Verify all users were created\n",[1207,5807,5808,5810,5813,5815,5818,5820,5822],{"class":1209,"line":2846},[1207,5809,2153],{"class":1616},[1207,5811,5812],{"class":5160}," len",[1207,5814,1811],{"class":1632},[1207,5816,5817],{"class":1862},"created_users",[1207,5819,2328],{"class":1632},[1207,5821,2164],{"class":2163},[1207,5823,5824],{"class":1231}," 5\n",[1207,5826,5827],{"class":1209,"line":2861},[1207,5828,1836],{"class":1620},[1207,5830,5831],{"class":1209,"line":2884},[1207,5832,5833],{"class":1213},"        # Verify they're all in the database\n",[1207,5835,5836,5839,5842,5844,5847,5849,5852,5854,5856],{"class":1209,"line":2889},[1207,5837,5838],{"class":1616},"        for",[1207,5840,5841],{"class":1620}," i",[1207,5843,1644],{"class":1632},[1207,5845,5846],{"class":1620}," user ",[1207,5848,5752],{"class":1616},[1207,5850,5851],{"class":5160}," enumerate",[1207,5853,1811],{"class":1632},[1207,5855,5817],{"class":1862},[1207,5857,1818],{"class":1632},[1207,5859,5860,5863,5865,5867,5869,5871,5873,5875,5877,5879,5881],{"class":1209,"line":2894},[1207,5861,5862],{"class":1616},"            assert",[1207,5864,2604],{"class":1620},[1207,5866,1633],{"class":1632},[1207,5868,2183],{"class":1942},[1207,5870,2164],{"class":2163},[1207,5872,3281],{"class":1735},[1207,5874,5684],{"class":1224},[1207,5876,3288],{"class":3287},[1207,5878,5689],{"class":1620},[1207,5880,3294],{"class":3287},[1207,5882,2006],{"class":1224},[1207,5884,5885],{"class":1209,"line":2900},[1207,5886,5887],{"class":1213},"            # Verify it's actually in the database\n",[1207,5889,5890,5893,5895,5897,5899,5901,5903,5905,5907,5909,5911,5913,5915,5917],{"class":1209,"line":2914},[1207,5891,5892],{"class":1620},"            db_user ",[1207,5894,1961],{"class":1632},[1207,5896,1937],{"class":1620},[1207,5898,1633],{"class":1632},[1207,5900,1943],{"class":1942},[1207,5902,1633],{"class":1632},[1207,5904,5111],{"class":1862},[1207,5906,1811],{"class":1632},[1207,5908,2133],{"class":1957},[1207,5910,1961],{"class":1632},[1207,5912,2643],{"class":1862},[1207,5914,1633],{"class":1632},[1207,5916,2133],{"class":1942},[1207,5918,2136],{"class":1632},[1207,5920,5921,5923,5926,5928,5930,5932,5934,5936,5938,5940,5942],{"class":1209,"line":2919},[1207,5922,5862],{"class":1616},[1207,5924,5925],{"class":1620}," db_user",[1207,5927,1633],{"class":1632},[1207,5929,2183],{"class":1942},[1207,5931,2164],{"class":2163},[1207,5933,3281],{"class":1735},[1207,5935,5684],{"class":1224},[1207,5937,3288],{"class":3287},[1207,5939,5689],{"class":1620},[1207,5941,3294],{"class":3287},[1207,5943,2006],{"class":1224},[1207,5945,5946],{"class":1209,"line":2925},[1207,5947,1763],{"class":1620},[1207,5949,5950,5952,5955,5957,5959],{"class":1209,"line":2945},[1207,5951,1806],{"class":1735},[1207,5953,5954],{"class":1794}," test_user_update_with_related_data",[1207,5956,1811],{"class":1632},[1207,5958,1815],{"class":1814},[1207,5960,1818],{"class":1632},[1207,5962,5963],{"class":1209,"line":2950},[1207,5964,1824],{"class":1749},[1207,5966,5967],{"class":1209,"line":2956},[1207,5968,5969],{"class":1756},"        Test updating user with related profile data\n",[1207,5971,5972],{"class":1209,"line":2971},[1207,5973,1836],{"class":1756},[1207,5975,5976],{"class":1209,"line":3016},[1207,5977,5978],{"class":1756},"        This tests complex update operations that involve\n",[1207,5980,5982],{"class":1209,"line":5981},131,[1207,5983,5984],{"class":1756},"        multiple related models.\n",[1207,5986,5988],{"class":1209,"line":5987},132,[1207,5989,1824],{"class":1749},[1207,5991,5993,5995,5997,5999],{"class":1209,"line":5992},133,[1207,5994,4881],{"class":1620},[1207,5996,1961],{"class":1632},[1207,5998,1863],{"class":1862},[1207,6000,1866],{"class":1632},[1207,6002,6004],{"class":1209,"line":6003},134,[1207,6005,1836],{"class":1620},[1207,6007,6009],{"class":1209,"line":6008},135,[1207,6010,6011],{"class":1213},"        # Arrange: Create a user with profile\n",[1207,6013,6015,6017,6019,6021,6023,6025],{"class":1209,"line":6014},136,[1207,6016,2570],{"class":1620},[1207,6018,1961],{"class":1632},[1207,6020,5028],{"class":1620},[1207,6022,1633],{"class":1632},[1207,6024,5033],{"class":1862},[1207,6026,6027],{"class":1632},"({\n",[1207,6029,6031,6033,6035,6037,6039,6041,6044,6046],{"class":1209,"line":6030},137,[1207,6032,2451],{"class":1964},[1207,6034,2183],{"class":1224},[1207,6036,1965],{"class":1964},[1207,6038,2458],{"class":1632},[1207,6040,2188],{"class":1964},[1207,6042,6043],{"class":1224},"updateuser",[1207,6045,1965],{"class":1964},[1207,6047,1973],{"class":1632},[1207,6049,6051,6053,6055,6057,6059,6061,6064,6066],{"class":1209,"line":6050},138,[1207,6052,2451],{"class":1964},[1207,6054,2204],{"class":1224},[1207,6056,1965],{"class":1964},[1207,6058,2458],{"class":1632},[1207,6060,2188],{"class":1964},[1207,6062,6063],{"class":1224},"update@example.com",[1207,6065,1965],{"class":1964},[1207,6067,1973],{"class":1632},[1207,6069,6071,6073,6075,6077,6079,6081,6083,6085],{"class":1209,"line":6070},139,[1207,6072,2451],{"class":1964},[1207,6074,2495],{"class":1224},[1207,6076,1965],{"class":1964},[1207,6078,2458],{"class":1632},[1207,6080,2188],{"class":1964},[1207,6082,2003],{"class":1224},[1207,6084,1965],{"class":1964},[1207,6086,1973],{"class":1632},[1207,6088,6090,6092,6094,6096,6098],{"class":1209,"line":6089},140,[1207,6091,2451],{"class":1964},[1207,6093,4958],{"class":1224},[1207,6095,1965],{"class":1964},[1207,6097,2458],{"class":1632},[1207,6099,2445],{"class":1632},[1207,6101,6103,6105,6107,6109,6111,6113,6116,6118],{"class":1209,"line":6102},141,[1207,6104,4969],{"class":1964},[1207,6106,3867],{"class":1224},[1207,6108,1965],{"class":1964},[1207,6110,2458],{"class":1632},[1207,6112,2188],{"class":1964},[1207,6114,6115],{"class":1224},"Original bio",[1207,6117,1965],{"class":1964},[1207,6119,1973],{"class":1632},[1207,6121,6123,6125,6127,6129,6131,6133,6136],{"class":1209,"line":6122},142,[1207,6124,4969],{"class":1964},[1207,6126,3630],{"class":1224},[1207,6128,1965],{"class":1964},[1207,6130,2458],{"class":1632},[1207,6132,2188],{"class":1964},[1207,6134,6135],{"class":1224},"+1111111111",[1207,6137,2006],{"class":1964},[1207,6139,6141],{"class":1209,"line":6140},143,[1207,6142,5006],{"class":1632},[1207,6144,6146],{"class":1209,"line":6145},144,[1207,6147,6148],{"class":1632},"        })\n",[1207,6150,6152],{"class":1209,"line":6151},145,[1207,6153,1836],{"class":1620},[1207,6155,6157],{"class":1209,"line":6156},146,[1207,6158,6159],{"class":1213},"        # Act: Update user and profile data\n",[1207,6161,6163,6166,6168,6170,6172,6175,6177,6179,6181,6183,6185],{"class":1209,"line":6162},147,[1207,6164,6165],{"class":1620},"        updated_user ",[1207,6167,1961],{"class":1632},[1207,6169,5028],{"class":1620},[1207,6171,1633],{"class":1632},[1207,6173,6174],{"class":1862},"update_user_with_profile",[1207,6176,1811],{"class":1632},[1207,6178,2643],{"class":1862},[1207,6180,1633],{"class":1632},[1207,6182,2133],{"class":1942},[1207,6184,1644],{"class":1632},[1207,6186,2445],{"class":1632},[1207,6188,6190,6192,6194,6196,6198,6200,6202,6204],{"class":1209,"line":6189},148,[1207,6191,2451],{"class":1964},[1207,6193,2516],{"class":1224},[1207,6195,1965],{"class":1964},[1207,6197,2458],{"class":1632},[1207,6199,2188],{"class":1964},[1207,6201,2877],{"class":1224},[1207,6203,1965],{"class":1964},[1207,6205,1973],{"class":1632},[1207,6207,6209,6211,6213,6215,6217,6219,6222,6224],{"class":1209,"line":6208},149,[1207,6210,2451],{"class":1964},[1207,6212,2537],{"class":1224},[1207,6214,1965],{"class":1964},[1207,6216,2458],{"class":1632},[1207,6218,2188],{"class":1964},[1207,6220,6221],{"class":1224},"Name",[1207,6223,1965],{"class":1964},[1207,6225,1973],{"class":1632},[1207,6227,6229,6231,6233,6235,6237],{"class":1209,"line":6228},150,[1207,6230,2451],{"class":1964},[1207,6232,4958],{"class":1224},[1207,6234,1965],{"class":1964},[1207,6236,2458],{"class":1632},[1207,6238,2445],{"class":1632},[1207,6240,6242,6244,6246,6248,6250,6252,6255,6257],{"class":1209,"line":6241},151,[1207,6243,4969],{"class":1964},[1207,6245,3867],{"class":1224},[1207,6247,1965],{"class":1964},[1207,6249,2458],{"class":1632},[1207,6251,2188],{"class":1964},[1207,6253,6254],{"class":1224},"Updated bio",[1207,6256,1965],{"class":1964},[1207,6258,1973],{"class":1632},[1207,6260,6262,6264,6266,6268,6270,6272,6275],{"class":1209,"line":6261},152,[1207,6263,4969],{"class":1964},[1207,6265,3630],{"class":1224},[1207,6267,1965],{"class":1964},[1207,6269,2458],{"class":1632},[1207,6271,2188],{"class":1964},[1207,6273,6274],{"class":1224},"+2222222222",[1207,6276,2006],{"class":1964},[1207,6278,6280],{"class":1209,"line":6279},153,[1207,6281,5006],{"class":1632},[1207,6283,6285],{"class":1209,"line":6284},154,[1207,6286,6148],{"class":1632},[1207,6288,6290],{"class":1209,"line":6289},155,[1207,6291,1836],{"class":1620},[1207,6293,6295],{"class":1209,"line":6294},156,[1207,6296,6297],{"class":1213},"        # Assert: Verify user updates\n",[1207,6299,6301,6303,6306,6308,6310,6312,6314,6316],{"class":1209,"line":6300},157,[1207,6302,2153],{"class":1616},[1207,6304,6305],{"class":1620}," updated_user",[1207,6307,1633],{"class":1632},[1207,6309,2516],{"class":1942},[1207,6311,2164],{"class":2163},[1207,6313,2188],{"class":1964},[1207,6315,2877],{"class":1224},[1207,6317,2006],{"class":1964},[1207,6319,6321,6323,6325,6327,6329,6331,6333,6335],{"class":1209,"line":6320},158,[1207,6322,2153],{"class":1616},[1207,6324,6305],{"class":1620},[1207,6326,1633],{"class":1632},[1207,6328,2537],{"class":1942},[1207,6330,2164],{"class":2163},[1207,6332,2188],{"class":1964},[1207,6334,6221],{"class":1224},[1207,6336,2006],{"class":1964},[1207,6338,6340],{"class":1209,"line":6339},159,[1207,6341,1836],{"class":1620},[1207,6343,6345],{"class":1209,"line":6344},160,[1207,6346,6347],{"class":1213},"        # Verify profile updates\n",[1207,6349,6351,6354,6356,6359,6361],{"class":1209,"line":6350},161,[1207,6352,6353],{"class":1620},"        updated_user",[1207,6355,1633],{"class":1632},[1207,6357,6358],{"class":1862},"refresh_from_db",[1207,6360,4156],{"class":1632},[1207,6362,6363],{"class":1213},"  # Reload from database\n",[1207,6365,6367,6369,6371,6373,6375,6377,6379,6381,6383,6385],{"class":1209,"line":6366},162,[1207,6368,2153],{"class":1616},[1207,6370,6305],{"class":1620},[1207,6372,1633],{"class":1632},[1207,6374,4026],{"class":1942},[1207,6376,1633],{"class":1632},[1207,6378,3867],{"class":1942},[1207,6380,2164],{"class":2163},[1207,6382,2188],{"class":1964},[1207,6384,6254],{"class":1224},[1207,6386,2006],{"class":1964},[1207,6388,6390,6392,6394,6396,6398,6400,6402,6404,6406,6408],{"class":1209,"line":6389},163,[1207,6391,2153],{"class":1616},[1207,6393,6305],{"class":1620},[1207,6395,1633],{"class":1632},[1207,6397,4026],{"class":1942},[1207,6399,1633],{"class":1632},[1207,6401,3630],{"class":1942},[1207,6403,2164],{"class":2163},[1207,6405,2188],{"class":1964},[1207,6407,6274],{"class":1224},[1207,6409,2006],{"class":1964},[1207,6411,6413],{"class":1209,"line":6412},164,[1207,6414,1836],{"class":1620},[1207,6416,6418],{"class":1209,"line":6417},165,[1207,6419,6420],{"class":1213},"        # Verify changes are persisted in database\n",[1207,6422,6424,6427,6429,6431,6433,6435,6437,6440,6442,6444,6446,6448,6450,6452,6454,6456,6458,6460,6462,6464],{"class":1209,"line":6423},166,[1207,6425,6426],{"class":1620},"        db_user ",[1207,6428,1961],{"class":1632},[1207,6430,1937],{"class":1620},[1207,6432,1633],{"class":1632},[1207,6434,1943],{"class":1942},[1207,6436,1633],{"class":1632},[1207,6438,6439],{"class":1862},"select_related",[1207,6441,1811],{"class":1632},[1207,6443,1965],{"class":1964},[1207,6445,4026],{"class":1224},[1207,6447,1965],{"class":1964},[1207,6449,5543],{"class":1632},[1207,6451,5111],{"class":1862},[1207,6453,1811],{"class":1632},[1207,6455,2133],{"class":1957},[1207,6457,1961],{"class":1632},[1207,6459,2643],{"class":1862},[1207,6461,1633],{"class":1632},[1207,6463,2133],{"class":1942},[1207,6465,2136],{"class":1632},[1207,6467,6469,6471,6473,6475,6477,6479,6481,6483],{"class":1209,"line":6468},167,[1207,6470,2153],{"class":1616},[1207,6472,5925],{"class":1620},[1207,6474,1633],{"class":1632},[1207,6476,2516],{"class":1942},[1207,6478,2164],{"class":2163},[1207,6480,2188],{"class":1964},[1207,6482,2877],{"class":1224},[1207,6484,2006],{"class":1964},[1207,6486,6488,6490,6492,6494,6496,6498,6500,6502,6504,6506],{"class":1209,"line":6487},168,[1207,6489,2153],{"class":1616},[1207,6491,5925],{"class":1620},[1207,6493,1633],{"class":1632},[1207,6495,4026],{"class":1942},[1207,6497,1633],{"class":1632},[1207,6499,3867],{"class":1942},[1207,6501,2164],{"class":2163},[1207,6503,2188],{"class":1964},[1207,6505,6254],{"class":1224},[1207,6507,2006],{"class":1964},[1026,6509,6510],{},[1045,6511,6512],{},"Key integration testing concepts:",[1123,6514,6515,6521,6527,6533,6539],{},[1084,6516,6517,6520],{},[1045,6518,6519],{},"Real Database Operations",": Unlike unit tests, these actually save and retrieve data from the database.",[1084,6522,6523,6526],{},[1045,6524,6525],{},"Transaction Testing",": Verifying that database transactions work correctly, especially rollbacks on errors.",[1084,6528,6529,6532],{},[1045,6530,6531],{},"Relationship Testing",": Ensuring that foreign keys and related objects work correctly.",[1084,6534,6535,6538],{},[1045,6536,6537],{},"Data Persistence",": Verifying that data is actually saved and can be retrieved.",[1084,6540,6541,6544],{},[1045,6542,6543],{},"Complex Workflows",": Testing multi-step operations that involve several database operations.",[1038,6546,6548],{"id":6547},"api-integration-tests","API Integration Tests",[1026,6550,6551],{},"API integration tests verify that your REST endpoints work correctly with the database and business logic. These tests make actual HTTP requests to your Django views and verify the responses.",[1197,6553,6555],{"className":1602,"code":6554,"language":1604,"meta":1202,"style":1202},"# user_service/tests/test_api_integration.py\nimport pytest\nimport json\nfrom django.test import Client\nfrom django.urls import reverse\nfrom rest_framework import status\nfrom rest_framework.test import APIClient\nfrom django.contrib.auth.models import User\nfrom user_service.tests.factories import UserFactory\n\n@pytest.mark.django_db\nclass TestUserAPIIntegration:\n    \"\"\"\n    API integration tests for user endpoints\n    \n    These tests verify that your API endpoints:\n    1. Accept the correct input formats\n    2. Return the expected response formats\n    3. Properly interact with the database\n    4. Handle authentication and permissions correctly\n    5. Return appropriate HTTP status codes\n    \"\"\"\n    \n    @pytest.fixture\n    def api_client(self):\n        \"\"\"\n        Fixture providing an API client for making HTTP requests\n        \n        We use DRF's APIClient instead of Django's Client because\n        it has better support for JSON requests and authentication.\n        \"\"\"\n        return APIClient()\n    \n    @pytest.fixture\n    def authenticated_user(self):\n        \"\"\"Fixture providing an authenticated user for tests that require login\"\"\"\n        return UserFactory()\n    \n    def test_user_list_api(self, api_client):\n        \"\"\"\n        Test user list API endpoint\n        \n        This test verifies:\n        1. The endpoint returns a 200 status code\n        2. The response contains the expected number of users\n        3. The response format is correct\n        \"\"\"\n        # Arrange: Create test users using our factory\n        UserFactory.create_batch(3)  # Creates 3 users\n        \n        # Act: Make GET request to user list endpoint\n        response = api_client.get(reverse('user-list'))\n        \n        # Assert: Verify response status\n        assert response.status_code == status.HTTP_200_OK\n        \n        # Assert: Verify response data\n        data = response.json()\n        assert 'results' in data  # Assuming paginated response\n        assert len(data['results']) == 3\n        \n        # Verify each user has expected fields\n        for user_data in data['results']:\n            assert 'id' in user_data\n            assert 'username' in user_data\n            assert 'email' in user_data\n            # Verify sensitive fields are not exposed\n            assert 'password' not in user_data\n    \n    def test_user_creation_api(self, api_client):\n        \"\"\"\n        Test user creation via API\n        \n        This test verifies:\n        1. Valid user data creates a new user\n        2. The user is actually saved to the database\n        3. The response contains the created user data\n        4. Sensitive data is handled correctly\n        \"\"\"\n        # Arrange: Prepare user data\n        user_data = {\n            'username': 'apiuser',\n            'email': 'api@example.com',\n            'password': 'apipass123',\n            'first_name': 'API',\n            'last_name': 'User'\n        }\n        \n        # Act: Make POST request to create user\n        response = api_client.post(\n            reverse('user-list'),\n            data=json.dumps(user_data),\n            content_type='application/json'\n        )\n        \n        # Assert: Verify response status\n        assert response.status_code == status.HTTP_201_CREATED\n        \n        # Assert: Verify response data\n        response_data = response.json()\n        assert response_data['username'] == 'apiuser'\n        assert response_data['email'] == 'api@example.com'\n        assert response_data['first_name'] == 'API'\n        assert response_data['last_name'] == 'User'\n        \n        # Verify password is not returned in response\n        assert 'password' not in response_data\n        \n        # Assert: Verify user was actually created in database\n        created_user = User.objects.get(username='apiuser')\n        assert created_user.email == 'api@example.com'\n        assert created_user.check_password('apipass123')  # Verify password was hashed\n    \n    def test_user_creation_validation_errors(self, api_client):\n        \"\"\"\n        Test user creation with invalid data\n        \n        This test verifies that the API properly validates input\n        and returns appropriate error messages.\n        \"\"\"\n        # Arrange: Prepare invalid user data (missing required fields)\n        invalid_data = {\n            'username': '',  # Empty username should be invalid\n            'email': 'invalid-email',  # Invalid email format\n            # Missing password\n        }\n        \n        # Act: Make POST request with invalid data\n        response = api_client.post(\n            reverse('user-list'),\n            data=json.dumps(invalid_data),\n            content_type='application/json'\n        )\n        \n        # Assert: Verify error response\n        assert response.status_code == status.HTTP_400_BAD_REQUEST\n        \n        # Verify error details\n        error_data = response.json()\n        assert 'username' in error_data  # Username validation error\n        assert 'email' in error_data     # Email validation error\n        assert 'password' in error_data  # Password required error\n        \n        # Verify no user was created\n        assert User.objects.count() == 0\n    \n    def test_user_update_api(self, api_client, authenticated_user):\n        \"\"\"\n        Test user update via API\n        \n        This test verifies:\n        1. Authenticated users can update their data\n        2. Partial updates work correctly\n        3. Changes are persisted to the database\n        \"\"\"\n        # Arrange: Authenticate the user\n        api_client.force_authenticate(user=authenticated_user)\n        \n        # Prepare update data (partial update)\n        update_data = {\n            'first_name': 'Updated',\n            'last_name': 'Name'\n        }\n        \n        # Act: Make PATCH request to update user\n        response = api_client.patch(\n            reverse('user-detail', kwargs={'pk': authenticated_user.id}),\n            data=json.dumps(update_data),\n            content_type='application/json'\n        )\n        \n        # Assert: Verify response\n        assert response.status_code == status.HTTP_200_OK\n        \n        response_data = response.json()\n        assert response_data['first_name'] == 'Updated'\n        assert response_data['last_name'] == 'Name'\n        \n        # Assert: Verify changes were saved to database\n        authenticated_user.refresh_from_db()\n        assert authenticated_user.first_name == 'Updated'\n        assert authenticated_user.last_name == 'Name'\n    \n    def test_user_detail_unauthorized(self, api_client):\n        \"\"\"\n        Test that unauthorized users cannot access user details\n        \n        This test verifies authentication and authorization work correctly.\n        \"\"\"\n        # Arrange: Create a user but don't authenticate\n        user = UserFactory()\n        \n        # Act: Try to access user detail without authentication\n        response = api_client.get(\n            reverse('user-detail', kwargs={'pk': user.id})\n        )\n        \n        # Assert: Verify access is denied\n        assert response.status_code == status.HTTP_401_UNAUTHORIZED\n    \n    def test_user_list_pagination(self, api_client):\n        \"\"\"\n        Test that user list pagination works correctly\n        \n        This test verifies that large datasets are properly paginated.\n        \"\"\"\n        # Arrange: Create many users\n        UserFactory.create_batch(25)  # Create 25 users\n        \n        # Act: Request first page\n        response = api_client.get(reverse('user-list'))\n        \n        # Assert: Verify pagination\n        assert response.status_code == status.HTTP_200_OK\n        \n        data = response.json()\n        assert 'results' in data\n        assert 'count' in data\n        assert 'next' in data\n        assert 'previous' in data\n        \n        assert data['count'] == 25  # Total count\n        assert len(data['results']) \u003C= 20  # Page size (assuming 20 per page)\n        assert data['next'] is not None  # Should have next page\n        assert data['previous'] is None  # First page, no previous\n    \n    def test_user_search_functionality(self, api_client):\n        \"\"\"\n        Test user search/filtering functionality\n        \n        This test verifies that query parameters work correctly.\n        \"\"\"\n        # Arrange: Create users with specific data\n        UserFactory(username='john_doe', first_name='John')\n        UserFactory(username='jane_doe', first_name='Jane')\n        UserFactory(username='bob_smith', first_name='Bob')\n        \n        # Act: Search for users with 'doe' in username\n        response = api_client.get(\n            reverse('user-list'),\n            {'search': 'doe'}  # Query parameter\n        )\n        \n        # Assert: Verify search results\n        assert response.status_code == status.HTTP_200_OK\n        \n        data = response.json()\n        assert len(data['results']) == 2  # Should find john_doe and jane_doe\n        \n        usernames = [user['username'] for user in data['results']]\n        assert 'john_doe' in usernames\n        assert 'jane_doe' in usernames\n        assert 'bob_smith' not in usernames\n",[1204,6556,6557,6562,6568,6575,6590,6606,6618,6634,6656,6675,6679,6693,6702,6706,6711,6715,6720,6725,6730,6735,6740,6745,6749,6753,6763,6776,6780,6785,6789,6794,6799,6803,6812,6816,6826,6839,6850,6858,6862,6879,6883,6888,6892,6897,6902,6907,6912,6916,6921,6940,6944,6949,6979,6983,6988,7010,7014,7019,7034,7053,7080,7084,7089,7112,7127,7141,7155,7160,7176,7180,7197,7201,7206,7210,7214,7219,7224,7229,7234,7238,7243,7251,7270,7289,7308,7327,7343,7347,7351,7356,7371,7387,7407,7421,7425,7429,7433,7452,7456,7460,7475,7500,7524,7548,7572,7576,7581,7598,7602,7607,7638,7657,7681,7685,7702,7706,7711,7715,7720,7725,7729,7734,7743,7761,7783,7788,7792,7796,7801,7815,7829,7848,7860,7864,7868,7873,7892,7896,7901,7916,7934,7952,7969,7973,7978,8000,8004,8025,8029,8034,8038,8042,8047,8052,8057,8061,8066,8087,8091,8096,8105,8123,8139,8143,8147,8152,8166,8205,8224,8237,8242,8247,8253,8272,8277,8292,8317,8342,8347,8353,8365,8384,8403,8408,8426,8431,8437,8442,8448,8453,8459,8470,8475,8481,8496,8532,8537,8542,8548,8568,8573,8591,8596,8602,8607,8613,8618,8624,8643,8648,8654,8681,8686,8692,8711,8716,8731,8747,8762,8778,8794,8799,8824,8854,8881,8905,8910,8928,8933,8939,8944,8950,8955,8961,8995,9028,9061,9066,9072,9087,9102,9128,9133,9138,9144,9163,9168,9183,9211,9216,9259,9275,9290],{"__ignoreMap":1202},[1207,6558,6559],{"class":1209,"line":1210},[1207,6560,6561],{"class":1213},"# user_service/tests/test_api_integration.py\n",[1207,6563,6564,6566],{"class":1209,"line":1217},[1207,6565,1617],{"class":1616},[1207,6567,1621],{"class":1620},[1207,6569,6570,6572],{"class":1209,"line":1238},[1207,6571,1617],{"class":1616},[1207,6573,6574],{"class":1620}," json\n",[1207,6576,6577,6579,6581,6583,6585,6587],{"class":1209,"line":1254},[1207,6578,1626],{"class":1616},[1207,6580,1654],{"class":1620},[1207,6582,1633],{"class":1632},[1207,6584,1659],{"class":1620},[1207,6586,1617],{"class":1616},[1207,6588,6589],{"class":1620}," Client\n",[1207,6591,6592,6594,6596,6598,6601,6603],{"class":1209,"line":1270},[1207,6593,1626],{"class":1616},[1207,6595,1654],{"class":1620},[1207,6597,1633],{"class":1632},[1207,6599,6600],{"class":1620},"urls ",[1207,6602,1617],{"class":1616},[1207,6604,6605],{"class":1620}," reverse\n",[1207,6607,6608,6610,6613,6615],{"class":1209,"line":1535},[1207,6609,1626],{"class":1616},[1207,6611,6612],{"class":1620}," rest_framework ",[1207,6614,1617],{"class":1616},[1207,6616,6617],{"class":1620}," status\n",[1207,6619,6620,6622,6625,6627,6629,6631],{"class":1209,"line":1710},[1207,6621,1626],{"class":1616},[1207,6623,6624],{"class":1620}," rest_framework",[1207,6626,1633],{"class":1632},[1207,6628,1659],{"class":1620},[1207,6630,1617],{"class":1616},[1207,6632,6633],{"class":1620}," APIClient\n",[1207,6635,6636,6638,6640,6642,6644,6646,6648,6650,6652,6654],{"class":1209,"line":1727},[1207,6637,1626],{"class":1616},[1207,6639,1654],{"class":1620},[1207,6641,1633],{"class":1632},[1207,6643,1675],{"class":1620},[1207,6645,1633],{"class":1632},[1207,6647,1680],{"class":1620},[1207,6649,1633],{"class":1632},[1207,6651,1685],{"class":1620},[1207,6653,1617],{"class":1616},[1207,6655,1690],{"class":1620},[1207,6657,6658,6660,6662,6664,6666,6668,6670,6672],{"class":1209,"line":1732},[1207,6659,1626],{"class":1616},[1207,6661,1697],{"class":1620},[1207,6663,1633],{"class":1632},[1207,6665,3684],{"class":1620},[1207,6667,1633],{"class":1632},[1207,6669,3689],{"class":1620},[1207,6671,1617],{"class":1616},[1207,6673,6674],{"class":1620}," UserFactory\n",[1207,6676,6677],{"class":1209,"line":1746},[1207,6678,1527],{"emptyLinePlaceholder":1526},[1207,6680,6681,6683,6685,6687,6689,6691],{"class":1209,"line":1753},[1207,6682,3707],{"class":1632},[1207,6684,1795],{"class":1794},[1207,6686,1633],{"class":1632},[1207,6688,2029],{"class":1794},[1207,6690,1633],{"class":1632},[1207,6692,2034],{"class":1794},[1207,6694,6695,6697,6700],{"class":1209,"line":1760},[1207,6696,1736],{"class":1735},[1207,6698,6699],{"class":1739}," TestUserAPIIntegration",[1207,6701,1743],{"class":1632},[1207,6703,6704],{"class":1209,"line":1766},[1207,6705,1750],{"class":1749},[1207,6707,6708],{"class":1209,"line":1772},[1207,6709,6710],{"class":1756},"    API integration tests for user endpoints\n",[1207,6712,6713],{"class":1209,"line":1778},[1207,6714,1763],{"class":1756},[1207,6716,6717],{"class":1209,"line":1783},[1207,6718,6719],{"class":1756},"    These tests verify that your API endpoints:\n",[1207,6721,6722],{"class":1209,"line":1788},[1207,6723,6724],{"class":1756},"    1. Accept the correct input formats\n",[1207,6726,6727],{"class":1209,"line":1803},[1207,6728,6729],{"class":1756},"    2. Return the expected response formats\n",[1207,6731,6732],{"class":1209,"line":1821},[1207,6733,6734],{"class":1756},"    3. Properly interact with the database\n",[1207,6736,6737],{"class":1209,"line":1827},[1207,6738,6739],{"class":1756},"    4. Handle authentication and permissions correctly\n",[1207,6741,6742],{"class":1209,"line":1833},[1207,6743,6744],{"class":1756},"    5. Return appropriate HTTP status codes\n",[1207,6746,6747],{"class":1209,"line":1839},[1207,6748,1750],{"class":1749},[1207,6750,6751],{"class":1209,"line":1845},[1207,6752,1763],{"class":1620},[1207,6754,6755,6757,6759,6761],{"class":1209,"line":1851},[1207,6756,1791],{"class":1632},[1207,6758,1795],{"class":1794},[1207,6760,1633],{"class":1632},[1207,6762,1800],{"class":1794},[1207,6764,6765,6767,6770,6772,6774],{"class":1209,"line":1856},[1207,6766,1806],{"class":1735},[1207,6768,6769],{"class":1794}," api_client",[1207,6771,1811],{"class":1632},[1207,6773,1815],{"class":1814},[1207,6775,1818],{"class":1632},[1207,6777,6778],{"class":1209,"line":1869},[1207,6779,1824],{"class":1749},[1207,6781,6782],{"class":1209,"line":1874},[1207,6783,6784],{"class":1756},"        Fixture providing an API client for making HTTP requests\n",[1207,6786,6787],{"class":1209,"line":1885},[1207,6788,1836],{"class":1756},[1207,6790,6791],{"class":1209,"line":1899},[1207,6792,6793],{"class":1756},"        We use DRF's APIClient instead of Django's Client because\n",[1207,6795,6796],{"class":1209,"line":1904},[1207,6797,6798],{"class":1756},"        it has better support for JSON requests and authentication.\n",[1207,6800,6801],{"class":1209,"line":1910},[1207,6802,1824],{"class":1749},[1207,6804,6805,6807,6810],{"class":1209,"line":1915},[1207,6806,1859],{"class":1616},[1207,6808,6809],{"class":1862}," APIClient",[1207,6811,1866],{"class":1632},[1207,6813,6814],{"class":1209,"line":1921},[1207,6815,1763],{"class":1620},[1207,6817,6818,6820,6822,6824],{"class":1209,"line":1927},[1207,6819,1791],{"class":1632},[1207,6821,1795],{"class":1794},[1207,6823,1633],{"class":1632},[1207,6825,1800],{"class":1794},[1207,6827,6828,6830,6833,6835,6837],{"class":1209,"line":1932},[1207,6829,1806],{"class":1735},[1207,6831,6832],{"class":1794}," authenticated_user",[1207,6834,1811],{"class":1632},[1207,6836,1815],{"class":1814},[1207,6838,1818],{"class":1632},[1207,6840,6841,6844,6847],{"class":1209,"line":1954},[1207,6842,6843],{"class":1749},"        \"\"\"",[1207,6845,6846],{"class":1756},"Fixture providing an authenticated user for tests that require login",[1207,6848,6849],{"class":1749},"\"\"\"\n",[1207,6851,6852,6854,6856],{"class":1209,"line":1976},[1207,6853,1859],{"class":1616},[1207,6855,3172],{"class":1862},[1207,6857,1866],{"class":1632},[1207,6859,6860],{"class":1209,"line":1993},[1207,6861,1763],{"class":1620},[1207,6863,6864,6866,6869,6871,6873,6875,6877],{"class":1209,"line":2009},[1207,6865,1806],{"class":1735},[1207,6867,6868],{"class":1794}," test_user_list_api",[1207,6870,1811],{"class":1632},[1207,6872,1815],{"class":1814},[1207,6874,1644],{"class":1632},[1207,6876,6769],{"class":2051},[1207,6878,1818],{"class":1632},[1207,6880,6881],{"class":1209,"line":2015},[1207,6882,1824],{"class":1749},[1207,6884,6885],{"class":1209,"line":2020},[1207,6886,6887],{"class":1756},"        Test user list API endpoint\n",[1207,6889,6890],{"class":1209,"line":2037},[1207,6891,1836],{"class":1756},[1207,6893,6894],{"class":1209,"line":2060},[1207,6895,6896],{"class":1756},"        This test verifies:\n",[1207,6898,6899],{"class":1209,"line":2065},[1207,6900,6901],{"class":1756},"        1. The endpoint returns a 200 status code\n",[1207,6903,6904],{"class":1209,"line":2071},[1207,6905,6906],{"class":1756},"        2. The response contains the expected number of users\n",[1207,6908,6909],{"class":1209,"line":2076},[1207,6910,6911],{"class":1756},"        3. The response format is correct\n",[1207,6913,6914],{"class":1209,"line":2082},[1207,6915,1824],{"class":1749},[1207,6917,6918],{"class":1209,"line":2088},[1207,6919,6920],{"class":1213},"        # Arrange: Create test users using our factory\n",[1207,6922,6923,6926,6928,6930,6932,6935,6937],{"class":1209,"line":2094},[1207,6924,6925],{"class":1620},"        UserFactory",[1207,6927,1633],{"class":1632},[1207,6929,4556],{"class":1862},[1207,6931,1811],{"class":1632},[1207,6933,6934],{"class":1231},"3",[1207,6936,2328],{"class":1632},[1207,6938,6939],{"class":1213},"  # Creates 3 users\n",[1207,6941,6942],{"class":1209,"line":2100},[1207,6943,1836],{"class":1620},[1207,6945,6946],{"class":1209,"line":2105},[1207,6947,6948],{"class":1213},"        # Act: Make GET request to user list endpoint\n",[1207,6950,6951,6954,6956,6958,6960,6962,6964,6967,6969,6971,6974,6976],{"class":1209,"line":2111},[1207,6952,6953],{"class":1620},"        response ",[1207,6955,1961],{"class":1632},[1207,6957,6769],{"class":1620},[1207,6959,1633],{"class":1632},[1207,6961,5111],{"class":1862},[1207,6963,1811],{"class":1632},[1207,6965,6966],{"class":1862},"reverse",[1207,6968,1811],{"class":1632},[1207,6970,1965],{"class":1964},[1207,6972,6973],{"class":1224},"user-list",[1207,6975,1965],{"class":1964},[1207,6977,6978],{"class":1632},"))\n",[1207,6980,6981],{"class":1209,"line":2139},[1207,6982,1836],{"class":1620},[1207,6984,6985],{"class":1209,"line":2144},[1207,6986,6987],{"class":1213},"        # Assert: Verify response status\n",[1207,6989,6990,6992,6995,6997,6999,7001,7004,7006],{"class":1209,"line":2150},[1207,6991,2153],{"class":1616},[1207,6993,6994],{"class":1620}," response",[1207,6996,1633],{"class":1632},[1207,6998,2772],{"class":1942},[1207,7000,2164],{"class":2163},[1207,7002,7003],{"class":1620}," status",[1207,7005,1633],{"class":1632},[1207,7007,7009],{"class":7008},"sFGJz","HTTP_200_OK\n",[1207,7011,7012],{"class":1209,"line":2174},[1207,7013,1836],{"class":1620},[1207,7015,7016],{"class":1209,"line":2195},[1207,7017,7018],{"class":1213},"        # Assert: Verify response data\n",[1207,7020,7021,7024,7026,7028,7030,7032],{"class":1209,"line":2215},[1207,7022,7023],{"class":1620},"        data ",[1207,7025,1961],{"class":1632},[1207,7027,6994],{"class":1620},[1207,7029,1633],{"class":1632},[1207,7031,2792],{"class":1862},[1207,7033,1866],{"class":1632},[1207,7035,7036,7038,7040,7043,7045,7047,7050],{"class":1209,"line":2220},[1207,7037,2153],{"class":1616},[1207,7039,2188],{"class":1964},[1207,7041,7042],{"class":1224},"results",[1207,7044,1965],{"class":1964},[1207,7046,2983],{"class":2163},[1207,7048,7049],{"class":1620}," data  ",[1207,7051,7052],{"class":1213},"# Assuming paginated response\n",[1207,7054,7055,7057,7059,7061,7064,7066,7068,7070,7072,7075,7077],{"class":1209,"line":2235},[1207,7056,2153],{"class":1616},[1207,7058,5812],{"class":5160},[1207,7060,1811],{"class":1632},[1207,7062,7063],{"class":1862},"data",[1207,7065,2989],{"class":1632},[1207,7067,1965],{"class":1964},[1207,7069,7042],{"class":1224},[1207,7071,1965],{"class":1964},[1207,7073,7074],{"class":1632},"])",[1207,7076,2164],{"class":2163},[1207,7078,7079],{"class":1231}," 3\n",[1207,7081,7082],{"class":1209,"line":2253},[1207,7083,1836],{"class":1620},[1207,7085,7086],{"class":1209,"line":2258},[1207,7087,7088],{"class":1213},"        # Verify each user has expected fields\n",[1207,7090,7091,7093,7096,7098,7101,7103,7105,7107,7109],{"class":1209,"line":2264},[1207,7092,5838],{"class":1616},[1207,7094,7095],{"class":1620}," user_data ",[1207,7097,5752],{"class":1616},[1207,7099,7100],{"class":1620}," data",[1207,7102,2989],{"class":1632},[1207,7104,1965],{"class":1964},[1207,7106,7042],{"class":1224},[1207,7108,1965],{"class":1964},[1207,7110,7111],{"class":1632},"]:\n",[1207,7113,7114,7116,7118,7120,7122,7124],{"class":1209,"line":2269},[1207,7115,5862],{"class":1616},[1207,7117,2188],{"class":1964},[1207,7119,2133],{"class":1224},[1207,7121,1965],{"class":1964},[1207,7123,2983],{"class":2163},[1207,7125,7126],{"class":1620}," user_data\n",[1207,7128,7129,7131,7133,7135,7137,7139],{"class":1209,"line":2275},[1207,7130,5862],{"class":1616},[1207,7132,2188],{"class":1964},[1207,7134,2183],{"class":1224},[1207,7136,1965],{"class":1964},[1207,7138,2983],{"class":2163},[1207,7140,7126],{"class":1620},[1207,7142,7143,7145,7147,7149,7151,7153],{"class":1209,"line":2281},[1207,7144,5862],{"class":1616},[1207,7146,2188],{"class":1964},[1207,7148,2204],{"class":1224},[1207,7150,1965],{"class":1964},[1207,7152,2983],{"class":2163},[1207,7154,7126],{"class":1620},[1207,7156,7157],{"class":1209,"line":2286},[1207,7158,7159],{"class":1213},"            # Verify sensitive fields are not exposed\n",[1207,7161,7162,7164,7166,7168,7170,7172,7174],{"class":1209,"line":2292},[1207,7163,5862],{"class":1616},[1207,7165,2188],{"class":1964},[1207,7167,2495],{"class":1224},[1207,7169,1965],{"class":1964},[1207,7171,3853],{"class":2163},[1207,7173,2983],{"class":2163},[1207,7175,7126],{"class":1620},[1207,7177,7178],{"class":1209,"line":2313},[1207,7179,1763],{"class":1620},[1207,7181,7182,7184,7187,7189,7191,7193,7195],{"class":1209,"line":2334},[1207,7183,1806],{"class":1735},[1207,7185,7186],{"class":1794}," test_user_creation_api",[1207,7188,1811],{"class":1632},[1207,7190,1815],{"class":1814},[1207,7192,1644],{"class":1632},[1207,7194,6769],{"class":2051},[1207,7196,1818],{"class":1632},[1207,7198,7199],{"class":1209,"line":2339},[1207,7200,1824],{"class":1749},[1207,7202,7203],{"class":1209,"line":2358},[1207,7204,7205],{"class":1756},"        Test user creation via API\n",[1207,7207,7208],{"class":1209,"line":2381},[1207,7209,1836],{"class":1756},[1207,7211,7212],{"class":1209,"line":2386},[1207,7213,6896],{"class":1756},[1207,7215,7216],{"class":1209,"line":2392},[1207,7217,7218],{"class":1756},"        1. Valid user data creates a new user\n",[1207,7220,7221],{"class":1209,"line":2397},[1207,7222,7223],{"class":1756},"        2. The user is actually saved to the database\n",[1207,7225,7226],{"class":1209,"line":2403},[1207,7227,7228],{"class":1756},"        3. The response contains the created user data\n",[1207,7230,7231],{"class":1209,"line":2409},[1207,7232,7233],{"class":1756},"        4. Sensitive data is handled correctly\n",[1207,7235,7236],{"class":1209,"line":2414},[1207,7237,1824],{"class":1749},[1207,7239,7240],{"class":1209,"line":2420},[1207,7241,7242],{"class":1213},"        # Arrange: Prepare user data\n",[1207,7244,7245,7247,7249],{"class":1209,"line":2426},[1207,7246,2440],{"class":1620},[1207,7248,1961],{"class":1632},[1207,7250,2445],{"class":1632},[1207,7252,7253,7255,7257,7259,7261,7263,7266,7268],{"class":1209,"line":2431},[1207,7254,2451],{"class":1964},[1207,7256,2183],{"class":1224},[1207,7258,1965],{"class":1964},[1207,7260,2458],{"class":1632},[1207,7262,2188],{"class":1964},[1207,7264,7265],{"class":1224},"apiuser",[1207,7267,1965],{"class":1964},[1207,7269,1973],{"class":1632},[1207,7271,7272,7274,7276,7278,7280,7282,7285,7287],{"class":1209,"line":2437},[1207,7273,2451],{"class":1964},[1207,7275,2204],{"class":1224},[1207,7277,1965],{"class":1964},[1207,7279,2458],{"class":1632},[1207,7281,2188],{"class":1964},[1207,7283,7284],{"class":1224},"api@example.com",[1207,7286,1965],{"class":1964},[1207,7288,1973],{"class":1632},[1207,7290,7291,7293,7295,7297,7299,7301,7304,7306],{"class":1209,"line":2448},[1207,7292,2451],{"class":1964},[1207,7294,2495],{"class":1224},[1207,7296,1965],{"class":1964},[1207,7298,2458],{"class":1632},[1207,7300,2188],{"class":1964},[1207,7302,7303],{"class":1224},"apipass123",[1207,7305,1965],{"class":1964},[1207,7307,1973],{"class":1632},[1207,7309,7310,7312,7314,7316,7318,7320,7323,7325],{"class":1209,"line":2470},[1207,7311,2451],{"class":1964},[1207,7313,2516],{"class":1224},[1207,7315,1965],{"class":1964},[1207,7317,2458],{"class":1632},[1207,7319,2188],{"class":1964},[1207,7321,7322],{"class":1224},"API",[1207,7324,1965],{"class":1964},[1207,7326,1973],{"class":1632},[1207,7328,7329,7331,7333,7335,7337,7339,7341],{"class":1209,"line":2490},[1207,7330,2451],{"class":1964},[1207,7332,2537],{"class":1224},[1207,7334,1965],{"class":1964},[1207,7336,2458],{"class":1632},[1207,7338,2188],{"class":1964},[1207,7340,2546],{"class":1224},[1207,7342,2006],{"class":1964},[1207,7344,7345],{"class":1209,"line":2511},[1207,7346,2554],{"class":1632},[1207,7348,7349],{"class":1209,"line":2532},[1207,7350,1836],{"class":1620},[1207,7352,7353],{"class":1209,"line":2551},[1207,7354,7355],{"class":1213},"        # Act: Make POST request to create user\n",[1207,7357,7358,7360,7362,7364,7366,7369],{"class":1209,"line":2557},[1207,7359,6953],{"class":1620},[1207,7361,1961],{"class":1632},[1207,7363,6769],{"class":1620},[1207,7365,1633],{"class":1632},[1207,7367,7368],{"class":1862},"post",[1207,7370,1951],{"class":1632},[1207,7372,7373,7376,7378,7380,7382,7384],{"class":1209,"line":2562},[1207,7374,7375],{"class":1862},"            reverse",[1207,7377,1811],{"class":1632},[1207,7379,1965],{"class":1964},[1207,7381,6973],{"class":1224},[1207,7383,1965],{"class":1964},[1207,7385,7386],{"class":1632},"),\n",[1207,7388,7389,7392,7394,7396,7398,7401,7403,7405],{"class":1209,"line":2567},[1207,7390,7391],{"class":1957},"            data",[1207,7393,1961],{"class":1632},[1207,7395,2792],{"class":1862},[1207,7397,1633],{"class":1632},[1207,7399,7400],{"class":1862},"dumps",[1207,7402,1811],{"class":1632},[1207,7404,2583],{"class":1862},[1207,7406,7386],{"class":1632},[1207,7408,7409,7412,7414,7416,7419],{"class":1209,"line":2588},[1207,7410,7411],{"class":1957},"            content_type",[1207,7413,1961],{"class":1632},[1207,7415,1965],{"class":1964},[1207,7417,7418],{"class":1224},"application/json",[1207,7420,2006],{"class":1964},[1207,7422,7423],{"class":1209,"line":2593},[1207,7424,2012],{"class":1632},[1207,7426,7427],{"class":1209,"line":2599},[1207,7428,1836],{"class":1620},[1207,7430,7431],{"class":1209,"line":2619},[1207,7432,6987],{"class":1213},[1207,7434,7435,7437,7439,7441,7443,7445,7447,7449],{"class":1209,"line":2624},[1207,7436,2153],{"class":1616},[1207,7438,6994],{"class":1620},[1207,7440,1633],{"class":1632},[1207,7442,2772],{"class":1942},[1207,7444,2164],{"class":2163},[1207,7446,7003],{"class":1620},[1207,7448,1633],{"class":1632},[1207,7450,7451],{"class":7008},"HTTP_201_CREATED\n",[1207,7453,7454],{"class":1209,"line":2630},[1207,7455,1836],{"class":1620},[1207,7457,7458],{"class":1209,"line":2652},[1207,7459,7018],{"class":1213},[1207,7461,7462,7465,7467,7469,7471,7473],{"class":1209,"line":2657},[1207,7463,7464],{"class":1620},"        response_data ",[1207,7466,1961],{"class":1632},[1207,7468,6994],{"class":1620},[1207,7470,1633],{"class":1632},[1207,7472,2792],{"class":1862},[1207,7474,1866],{"class":1632},[1207,7476,7477,7479,7482,7484,7486,7488,7490,7492,7494,7496,7498],{"class":1209,"line":2675},[1207,7478,2153],{"class":1616},[1207,7480,7481],{"class":1620}," response_data",[1207,7483,2989],{"class":1632},[1207,7485,1965],{"class":1964},[1207,7487,2183],{"class":1224},[1207,7489,1965],{"class":1964},[1207,7491,3010],{"class":1632},[1207,7493,2164],{"class":2163},[1207,7495,2188],{"class":1964},[1207,7497,7265],{"class":1224},[1207,7499,2006],{"class":1964},[1207,7501,7502,7504,7506,7508,7510,7512,7514,7516,7518,7520,7522],{"class":1209,"line":2702},[1207,7503,2153],{"class":1616},[1207,7505,7481],{"class":1620},[1207,7507,2989],{"class":1632},[1207,7509,1965],{"class":1964},[1207,7511,2204],{"class":1224},[1207,7513,1965],{"class":1964},[1207,7515,3010],{"class":1632},[1207,7517,2164],{"class":2163},[1207,7519,2188],{"class":1964},[1207,7521,7284],{"class":1224},[1207,7523,2006],{"class":1964},[1207,7525,7526,7528,7530,7532,7534,7536,7538,7540,7542,7544,7546],{"class":1209,"line":2707},[1207,7527,2153],{"class":1616},[1207,7529,7481],{"class":1620},[1207,7531,2989],{"class":1632},[1207,7533,1965],{"class":1964},[1207,7535,2516],{"class":1224},[1207,7537,1965],{"class":1964},[1207,7539,3010],{"class":1632},[1207,7541,2164],{"class":2163},[1207,7543,2188],{"class":1964},[1207,7545,7322],{"class":1224},[1207,7547,2006],{"class":1964},[1207,7549,7550,7552,7554,7556,7558,7560,7562,7564,7566,7568,7570],{"class":1209,"line":2713},[1207,7551,2153],{"class":1616},[1207,7553,7481],{"class":1620},[1207,7555,2989],{"class":1632},[1207,7557,1965],{"class":1964},[1207,7559,2537],{"class":1224},[1207,7561,1965],{"class":1964},[1207,7563,3010],{"class":1632},[1207,7565,2164],{"class":2163},[1207,7567,2188],{"class":1964},[1207,7569,2546],{"class":1224},[1207,7571,2006],{"class":1964},[1207,7573,7574],{"class":1209,"line":2718},[1207,7575,1836],{"class":1620},[1207,7577,7578],{"class":1209,"line":2724},[1207,7579,7580],{"class":1213},"        # Verify password is not returned in response\n",[1207,7582,7583,7585,7587,7589,7591,7593,7595],{"class":1209,"line":2730},[1207,7584,2153],{"class":1616},[1207,7586,2188],{"class":1964},[1207,7588,2495],{"class":1224},[1207,7590,1965],{"class":1964},[1207,7592,3853],{"class":2163},[1207,7594,2983],{"class":2163},[1207,7596,7597],{"class":1620}," response_data\n",[1207,7599,7600],{"class":1209,"line":2736},[1207,7601,1836],{"class":1620},[1207,7603,7604],{"class":1209,"line":2742},[1207,7605,7606],{"class":1213},"        # Assert: Verify user was actually created in database\n",[1207,7608,7609,7612,7614,7616,7618,7620,7622,7624,7626,7628,7630,7632,7634,7636],{"class":1209,"line":2748},[1207,7610,7611],{"class":1620},"        created_user ",[1207,7613,1961],{"class":1632},[1207,7615,1937],{"class":1620},[1207,7617,1633],{"class":1632},[1207,7619,1943],{"class":1942},[1207,7621,1633],{"class":1632},[1207,7623,5111],{"class":1862},[1207,7625,1811],{"class":1632},[1207,7627,2183],{"class":1957},[1207,7629,1961],{"class":1632},[1207,7631,1965],{"class":1964},[1207,7633,7265],{"class":1224},[1207,7635,1965],{"class":1964},[1207,7637,2136],{"class":1632},[1207,7639,7640,7642,7645,7647,7649,7651,7653,7655],{"class":1209,"line":2753},[1207,7641,2153],{"class":1616},[1207,7643,7644],{"class":1620}," created_user",[1207,7646,1633],{"class":1632},[1207,7648,2204],{"class":1942},[1207,7650,2164],{"class":2163},[1207,7652,2188],{"class":1964},[1207,7654,7284],{"class":1224},[1207,7656,2006],{"class":1964},[1207,7658,7659,7661,7663,7665,7668,7670,7672,7674,7676,7678],{"class":1209,"line":2759},[1207,7660,2153],{"class":1616},[1207,7662,7644],{"class":1620},[1207,7664,1633],{"class":1632},[1207,7666,7667],{"class":1862},"check_password",[1207,7669,1811],{"class":1632},[1207,7671,1965],{"class":1964},[1207,7673,7303],{"class":1224},[1207,7675,1965],{"class":1964},[1207,7677,2328],{"class":1632},[1207,7679,7680],{"class":1213},"  # Verify password was hashed\n",[1207,7682,7683],{"class":1209,"line":2781},[1207,7684,1763],{"class":1620},[1207,7686,7687,7689,7692,7694,7696,7698,7700],{"class":1209,"line":2820},[1207,7688,1806],{"class":1735},[1207,7690,7691],{"class":1794}," test_user_creation_validation_errors",[1207,7693,1811],{"class":1632},[1207,7695,1815],{"class":1814},[1207,7697,1644],{"class":1632},[1207,7699,6769],{"class":2051},[1207,7701,1818],{"class":1632},[1207,7703,7704],{"class":1209,"line":2825},[1207,7705,1824],{"class":1749},[1207,7707,7708],{"class":1209,"line":2830},[1207,7709,7710],{"class":1756},"        Test user creation with invalid data\n",[1207,7712,7713],{"class":1209,"line":2846},[1207,7714,1836],{"class":1756},[1207,7716,7717],{"class":1209,"line":2861},[1207,7718,7719],{"class":1756},"        This test verifies that the API properly validates input\n",[1207,7721,7722],{"class":1209,"line":2884},[1207,7723,7724],{"class":1756},"        and returns appropriate error messages.\n",[1207,7726,7727],{"class":1209,"line":2889},[1207,7728,1824],{"class":1749},[1207,7730,7731],{"class":1209,"line":2894},[1207,7732,7733],{"class":1213},"        # Arrange: Prepare invalid user data (missing required fields)\n",[1207,7735,7736,7739,7741],{"class":1209,"line":2900},[1207,7737,7738],{"class":1620},"        invalid_data ",[1207,7740,1961],{"class":1632},[1207,7742,2445],{"class":1632},[1207,7744,7745,7747,7749,7751,7753,7756,7758],{"class":1209,"line":2914},[1207,7746,2451],{"class":1964},[1207,7748,2183],{"class":1224},[1207,7750,1965],{"class":1964},[1207,7752,2458],{"class":1632},[1207,7754,7755],{"class":1964}," ''",[1207,7757,1644],{"class":1632},[1207,7759,7760],{"class":1213},"  # Empty username should be invalid\n",[1207,7762,7763,7765,7767,7769,7771,7773,7776,7778,7780],{"class":1209,"line":2919},[1207,7764,2451],{"class":1964},[1207,7766,2204],{"class":1224},[1207,7768,1965],{"class":1964},[1207,7770,2458],{"class":1632},[1207,7772,2188],{"class":1964},[1207,7774,7775],{"class":1224},"invalid-email",[1207,7777,1965],{"class":1964},[1207,7779,1644],{"class":1632},[1207,7781,7782],{"class":1213},"  # Invalid email format\n",[1207,7784,7785],{"class":1209,"line":2925},[1207,7786,7787],{"class":1213},"            # Missing password\n",[1207,7789,7790],{"class":1209,"line":2945},[1207,7791,2554],{"class":1632},[1207,7793,7794],{"class":1209,"line":2950},[1207,7795,1836],{"class":1620},[1207,7797,7798],{"class":1209,"line":2956},[1207,7799,7800],{"class":1213},"        # Act: Make POST request with invalid data\n",[1207,7802,7803,7805,7807,7809,7811,7813],{"class":1209,"line":2971},[1207,7804,6953],{"class":1620},[1207,7806,1961],{"class":1632},[1207,7808,6769],{"class":1620},[1207,7810,1633],{"class":1632},[1207,7812,7368],{"class":1862},[1207,7814,1951],{"class":1632},[1207,7816,7817,7819,7821,7823,7825,7827],{"class":1209,"line":3016},[1207,7818,7375],{"class":1862},[1207,7820,1811],{"class":1632},[1207,7822,1965],{"class":1964},[1207,7824,6973],{"class":1224},[1207,7826,1965],{"class":1964},[1207,7828,7386],{"class":1632},[1207,7830,7831,7833,7835,7837,7839,7841,7843,7846],{"class":1209,"line":5981},[1207,7832,7391],{"class":1957},[1207,7834,1961],{"class":1632},[1207,7836,2792],{"class":1862},[1207,7838,1633],{"class":1632},[1207,7840,7400],{"class":1862},[1207,7842,1811],{"class":1632},[1207,7844,7845],{"class":1862},"invalid_data",[1207,7847,7386],{"class":1632},[1207,7849,7850,7852,7854,7856,7858],{"class":1209,"line":5987},[1207,7851,7411],{"class":1957},[1207,7853,1961],{"class":1632},[1207,7855,1965],{"class":1964},[1207,7857,7418],{"class":1224},[1207,7859,2006],{"class":1964},[1207,7861,7862],{"class":1209,"line":5992},[1207,7863,2012],{"class":1632},[1207,7865,7866],{"class":1209,"line":6003},[1207,7867,1836],{"class":1620},[1207,7869,7870],{"class":1209,"line":6008},[1207,7871,7872],{"class":1213},"        # Assert: Verify error response\n",[1207,7874,7875,7877,7879,7881,7883,7885,7887,7889],{"class":1209,"line":6014},[1207,7876,2153],{"class":1616},[1207,7878,6994],{"class":1620},[1207,7880,1633],{"class":1632},[1207,7882,2772],{"class":1942},[1207,7884,2164],{"class":2163},[1207,7886,7003],{"class":1620},[1207,7888,1633],{"class":1632},[1207,7890,7891],{"class":7008},"HTTP_400_BAD_REQUEST\n",[1207,7893,7894],{"class":1209,"line":6030},[1207,7895,1836],{"class":1620},[1207,7897,7898],{"class":1209,"line":6050},[1207,7899,7900],{"class":1213},"        # Verify error details\n",[1207,7902,7903,7906,7908,7910,7912,7914],{"class":1209,"line":6070},[1207,7904,7905],{"class":1620},"        error_data ",[1207,7907,1961],{"class":1632},[1207,7909,6994],{"class":1620},[1207,7911,1633],{"class":1632},[1207,7913,2792],{"class":1862},[1207,7915,1866],{"class":1632},[1207,7917,7918,7920,7922,7924,7926,7928,7931],{"class":1209,"line":6089},[1207,7919,2153],{"class":1616},[1207,7921,2188],{"class":1964},[1207,7923,2183],{"class":1224},[1207,7925,1965],{"class":1964},[1207,7927,2983],{"class":2163},[1207,7929,7930],{"class":1620}," error_data  ",[1207,7932,7933],{"class":1213},"# Username validation error\n",[1207,7935,7936,7938,7940,7942,7944,7946,7949],{"class":1209,"line":6102},[1207,7937,2153],{"class":1616},[1207,7939,2188],{"class":1964},[1207,7941,2204],{"class":1224},[1207,7943,1965],{"class":1964},[1207,7945,2983],{"class":2163},[1207,7947,7948],{"class":1620}," error_data     ",[1207,7950,7951],{"class":1213},"# Email validation error\n",[1207,7953,7954,7956,7958,7960,7962,7964,7966],{"class":1209,"line":6122},[1207,7955,2153],{"class":1616},[1207,7957,2188],{"class":1964},[1207,7959,2495],{"class":1224},[1207,7961,1965],{"class":1964},[1207,7963,2983],{"class":2163},[1207,7965,7930],{"class":1620},[1207,7967,7968],{"class":1213},"# Password required error\n",[1207,7970,7971],{"class":1209,"line":6140},[1207,7972,1836],{"class":1620},[1207,7974,7975],{"class":1209,"line":6145},[1207,7976,7977],{"class":1213},"        # Verify no user was created\n",[1207,7979,7980,7982,7984,7986,7988,7990,7993,7995,7997],{"class":1209,"line":6151},[1207,7981,2153],{"class":1616},[1207,7983,1937],{"class":1620},[1207,7985,1633],{"class":1632},[1207,7987,1943],{"class":1942},[1207,7989,1633],{"class":1632},[1207,7991,7992],{"class":1862},"count",[1207,7994,4156],{"class":1632},[1207,7996,2164],{"class":2163},[1207,7998,7999],{"class":1231}," 0\n",[1207,8001,8002],{"class":1209,"line":6156},[1207,8003,1763],{"class":1620},[1207,8005,8006,8008,8011,8013,8015,8017,8019,8021,8023],{"class":1209,"line":6162},[1207,8007,1806],{"class":1735},[1207,8009,8010],{"class":1794}," test_user_update_api",[1207,8012,1811],{"class":1632},[1207,8014,1815],{"class":1814},[1207,8016,1644],{"class":1632},[1207,8018,6769],{"class":2051},[1207,8020,1644],{"class":1632},[1207,8022,6832],{"class":2051},[1207,8024,1818],{"class":1632},[1207,8026,8027],{"class":1209,"line":6189},[1207,8028,1824],{"class":1749},[1207,8030,8031],{"class":1209,"line":6208},[1207,8032,8033],{"class":1756},"        Test user update via API\n",[1207,8035,8036],{"class":1209,"line":6228},[1207,8037,1836],{"class":1756},[1207,8039,8040],{"class":1209,"line":6241},[1207,8041,6896],{"class":1756},[1207,8043,8044],{"class":1209,"line":6261},[1207,8045,8046],{"class":1756},"        1. Authenticated users can update their data\n",[1207,8048,8049],{"class":1209,"line":6279},[1207,8050,8051],{"class":1756},"        2. Partial updates work correctly\n",[1207,8053,8054],{"class":1209,"line":6284},[1207,8055,8056],{"class":1756},"        3. Changes are persisted to the database\n",[1207,8058,8059],{"class":1209,"line":6289},[1207,8060,1824],{"class":1749},[1207,8062,8063],{"class":1209,"line":6294},[1207,8064,8065],{"class":1213},"        # Arrange: Authenticate the user\n",[1207,8067,8068,8071,8073,8076,8078,8080,8082,8085],{"class":1209,"line":6300},[1207,8069,8070],{"class":1620},"        api_client",[1207,8072,1633],{"class":1632},[1207,8074,8075],{"class":1862},"force_authenticate",[1207,8077,1811],{"class":1632},[1207,8079,2643],{"class":1957},[1207,8081,1961],{"class":1632},[1207,8083,8084],{"class":1862},"authenticated_user",[1207,8086,2136],{"class":1632},[1207,8088,8089],{"class":1209,"line":6320},[1207,8090,1836],{"class":1620},[1207,8092,8093],{"class":1209,"line":6339},[1207,8094,8095],{"class":1213},"        # Prepare update data (partial update)\n",[1207,8097,8098,8101,8103],{"class":1209,"line":6344},[1207,8099,8100],{"class":1620},"        update_data ",[1207,8102,1961],{"class":1632},[1207,8104,2445],{"class":1632},[1207,8106,8107,8109,8111,8113,8115,8117,8119,8121],{"class":1209,"line":6350},[1207,8108,2451],{"class":1964},[1207,8110,2516],{"class":1224},[1207,8112,1965],{"class":1964},[1207,8114,2458],{"class":1632},[1207,8116,2188],{"class":1964},[1207,8118,2877],{"class":1224},[1207,8120,1965],{"class":1964},[1207,8122,1973],{"class":1632},[1207,8124,8125,8127,8129,8131,8133,8135,8137],{"class":1209,"line":6366},[1207,8126,2451],{"class":1964},[1207,8128,2537],{"class":1224},[1207,8130,1965],{"class":1964},[1207,8132,2458],{"class":1632},[1207,8134,2188],{"class":1964},[1207,8136,6221],{"class":1224},[1207,8138,2006],{"class":1964},[1207,8140,8141],{"class":1209,"line":6389},[1207,8142,2554],{"class":1632},[1207,8144,8145],{"class":1209,"line":6412},[1207,8146,1836],{"class":1620},[1207,8148,8149],{"class":1209,"line":6417},[1207,8150,8151],{"class":1213},"        # Act: Make PATCH request to update user\n",[1207,8153,8154,8156,8158,8160,8162,8164],{"class":1209,"line":6423},[1207,8155,6953],{"class":1620},[1207,8157,1961],{"class":1632},[1207,8159,6769],{"class":1620},[1207,8161,1633],{"class":1632},[1207,8163,2344],{"class":1862},[1207,8165,1951],{"class":1632},[1207,8167,8168,8170,8172,8174,8177,8179,8181,8184,8187,8189,8192,8194,8196,8198,8200,8202],{"class":1209,"line":6468},[1207,8169,7375],{"class":1862},[1207,8171,1811],{"class":1632},[1207,8173,1965],{"class":1964},[1207,8175,8176],{"class":1224},"user-detail",[1207,8178,1965],{"class":1964},[1207,8180,1644],{"class":1632},[1207,8182,8183],{"class":1957}," kwargs",[1207,8185,8186],{"class":1632},"={",[1207,8188,1965],{"class":1964},[1207,8190,8191],{"class":1224},"pk",[1207,8193,1965],{"class":1964},[1207,8195,2458],{"class":1632},[1207,8197,6832],{"class":1862},[1207,8199,1633],{"class":1632},[1207,8201,2133],{"class":1942},[1207,8203,8204],{"class":1632},"}),\n",[1207,8206,8207,8209,8211,8213,8215,8217,8219,8222],{"class":1209,"line":6487},[1207,8208,7391],{"class":1957},[1207,8210,1961],{"class":1632},[1207,8212,2792],{"class":1862},[1207,8214,1633],{"class":1632},[1207,8216,7400],{"class":1862},[1207,8218,1811],{"class":1632},[1207,8220,8221],{"class":1862},"update_data",[1207,8223,7386],{"class":1632},[1207,8225,8227,8229,8231,8233,8235],{"class":1209,"line":8226},169,[1207,8228,7411],{"class":1957},[1207,8230,1961],{"class":1632},[1207,8232,1965],{"class":1964},[1207,8234,7418],{"class":1224},[1207,8236,2006],{"class":1964},[1207,8238,8240],{"class":1209,"line":8239},170,[1207,8241,2012],{"class":1632},[1207,8243,8245],{"class":1209,"line":8244},171,[1207,8246,1836],{"class":1620},[1207,8248,8250],{"class":1209,"line":8249},172,[1207,8251,8252],{"class":1213},"        # Assert: Verify response\n",[1207,8254,8256,8258,8260,8262,8264,8266,8268,8270],{"class":1209,"line":8255},173,[1207,8257,2153],{"class":1616},[1207,8259,6994],{"class":1620},[1207,8261,1633],{"class":1632},[1207,8263,2772],{"class":1942},[1207,8265,2164],{"class":2163},[1207,8267,7003],{"class":1620},[1207,8269,1633],{"class":1632},[1207,8271,7009],{"class":7008},[1207,8273,8275],{"class":1209,"line":8274},174,[1207,8276,1836],{"class":1620},[1207,8278,8280,8282,8284,8286,8288,8290],{"class":1209,"line":8279},175,[1207,8281,7464],{"class":1620},[1207,8283,1961],{"class":1632},[1207,8285,6994],{"class":1620},[1207,8287,1633],{"class":1632},[1207,8289,2792],{"class":1862},[1207,8291,1866],{"class":1632},[1207,8293,8295,8297,8299,8301,8303,8305,8307,8309,8311,8313,8315],{"class":1209,"line":8294},176,[1207,8296,2153],{"class":1616},[1207,8298,7481],{"class":1620},[1207,8300,2989],{"class":1632},[1207,8302,1965],{"class":1964},[1207,8304,2516],{"class":1224},[1207,8306,1965],{"class":1964},[1207,8308,3010],{"class":1632},[1207,8310,2164],{"class":2163},[1207,8312,2188],{"class":1964},[1207,8314,2877],{"class":1224},[1207,8316,2006],{"class":1964},[1207,8318,8320,8322,8324,8326,8328,8330,8332,8334,8336,8338,8340],{"class":1209,"line":8319},177,[1207,8321,2153],{"class":1616},[1207,8323,7481],{"class":1620},[1207,8325,2989],{"class":1632},[1207,8327,1965],{"class":1964},[1207,8329,2537],{"class":1224},[1207,8331,1965],{"class":1964},[1207,8333,3010],{"class":1632},[1207,8335,2164],{"class":2163},[1207,8337,2188],{"class":1964},[1207,8339,6221],{"class":1224},[1207,8341,2006],{"class":1964},[1207,8343,8345],{"class":1209,"line":8344},178,[1207,8346,1836],{"class":1620},[1207,8348,8350],{"class":1209,"line":8349},179,[1207,8351,8352],{"class":1213},"        # Assert: Verify changes were saved to database\n",[1207,8354,8356,8359,8361,8363],{"class":1209,"line":8355},180,[1207,8357,8358],{"class":1620},"        authenticated_user",[1207,8360,1633],{"class":1632},[1207,8362,6358],{"class":1862},[1207,8364,1866],{"class":1632},[1207,8366,8368,8370,8372,8374,8376,8378,8380,8382],{"class":1209,"line":8367},181,[1207,8369,2153],{"class":1616},[1207,8371,6832],{"class":1620},[1207,8373,1633],{"class":1632},[1207,8375,2516],{"class":1942},[1207,8377,2164],{"class":2163},[1207,8379,2188],{"class":1964},[1207,8381,2877],{"class":1224},[1207,8383,2006],{"class":1964},[1207,8385,8387,8389,8391,8393,8395,8397,8399,8401],{"class":1209,"line":8386},182,[1207,8388,2153],{"class":1616},[1207,8390,6832],{"class":1620},[1207,8392,1633],{"class":1632},[1207,8394,2537],{"class":1942},[1207,8396,2164],{"class":2163},[1207,8398,2188],{"class":1964},[1207,8400,6221],{"class":1224},[1207,8402,2006],{"class":1964},[1207,8404,8406],{"class":1209,"line":8405},183,[1207,8407,1763],{"class":1620},[1207,8409,8411,8413,8416,8418,8420,8422,8424],{"class":1209,"line":8410},184,[1207,8412,1806],{"class":1735},[1207,8414,8415],{"class":1794}," test_user_detail_unauthorized",[1207,8417,1811],{"class":1632},[1207,8419,1815],{"class":1814},[1207,8421,1644],{"class":1632},[1207,8423,6769],{"class":2051},[1207,8425,1818],{"class":1632},[1207,8427,8429],{"class":1209,"line":8428},185,[1207,8430,1824],{"class":1749},[1207,8432,8434],{"class":1209,"line":8433},186,[1207,8435,8436],{"class":1756},"        Test that unauthorized users cannot access user details\n",[1207,8438,8440],{"class":1209,"line":8439},187,[1207,8441,1836],{"class":1756},[1207,8443,8445],{"class":1209,"line":8444},188,[1207,8446,8447],{"class":1756},"        This test verifies authentication and authorization work correctly.\n",[1207,8449,8451],{"class":1209,"line":8450},189,[1207,8452,1824],{"class":1749},[1207,8454,8456],{"class":1209,"line":8455},190,[1207,8457,8458],{"class":1213},"        # Arrange: Create a user but don't authenticate\n",[1207,8460,8462,8464,8466,8468],{"class":1209,"line":8461},191,[1207,8463,2570],{"class":1620},[1207,8465,1961],{"class":1632},[1207,8467,3172],{"class":1862},[1207,8469,1866],{"class":1632},[1207,8471,8473],{"class":1209,"line":8472},192,[1207,8474,1836],{"class":1620},[1207,8476,8478],{"class":1209,"line":8477},193,[1207,8479,8480],{"class":1213},"        # Act: Try to access user detail without authentication\n",[1207,8482,8484,8486,8488,8490,8492,8494],{"class":1209,"line":8483},194,[1207,8485,6953],{"class":1620},[1207,8487,1961],{"class":1632},[1207,8489,6769],{"class":1620},[1207,8491,1633],{"class":1632},[1207,8493,5111],{"class":1862},[1207,8495,1951],{"class":1632},[1207,8497,8499,8501,8503,8505,8507,8509,8511,8513,8515,8517,8519,8521,8523,8525,8527,8529],{"class":1209,"line":8498},195,[1207,8500,7375],{"class":1862},[1207,8502,1811],{"class":1632},[1207,8504,1965],{"class":1964},[1207,8506,8176],{"class":1224},[1207,8508,1965],{"class":1964},[1207,8510,1644],{"class":1632},[1207,8512,8183],{"class":1957},[1207,8514,8186],{"class":1632},[1207,8516,1965],{"class":1964},[1207,8518,8191],{"class":1224},[1207,8520,1965],{"class":1964},[1207,8522,2458],{"class":1632},[1207,8524,2604],{"class":1862},[1207,8526,1633],{"class":1632},[1207,8528,2133],{"class":1942},[1207,8530,8531],{"class":1632},"})\n",[1207,8533,8535],{"class":1209,"line":8534},196,[1207,8536,2012],{"class":1632},[1207,8538,8540],{"class":1209,"line":8539},197,[1207,8541,1836],{"class":1620},[1207,8543,8545],{"class":1209,"line":8544},198,[1207,8546,8547],{"class":1213},"        # Assert: Verify access is denied\n",[1207,8549,8551,8553,8555,8557,8559,8561,8563,8565],{"class":1209,"line":8550},199,[1207,8552,2153],{"class":1616},[1207,8554,6994],{"class":1620},[1207,8556,1633],{"class":1632},[1207,8558,2772],{"class":1942},[1207,8560,2164],{"class":2163},[1207,8562,7003],{"class":1620},[1207,8564,1633],{"class":1632},[1207,8566,8567],{"class":7008},"HTTP_401_UNAUTHORIZED\n",[1207,8569,8571],{"class":1209,"line":8570},200,[1207,8572,1763],{"class":1620},[1207,8574,8576,8578,8581,8583,8585,8587,8589],{"class":1209,"line":8575},201,[1207,8577,1806],{"class":1735},[1207,8579,8580],{"class":1794}," test_user_list_pagination",[1207,8582,1811],{"class":1632},[1207,8584,1815],{"class":1814},[1207,8586,1644],{"class":1632},[1207,8588,6769],{"class":2051},[1207,8590,1818],{"class":1632},[1207,8592,8594],{"class":1209,"line":8593},202,[1207,8595,1824],{"class":1749},[1207,8597,8599],{"class":1209,"line":8598},203,[1207,8600,8601],{"class":1756},"        Test that user list pagination works correctly\n",[1207,8603,8605],{"class":1209,"line":8604},204,[1207,8606,1836],{"class":1756},[1207,8608,8610],{"class":1209,"line":8609},205,[1207,8611,8612],{"class":1756},"        This test verifies that large datasets are properly paginated.\n",[1207,8614,8616],{"class":1209,"line":8615},206,[1207,8617,1824],{"class":1749},[1207,8619,8621],{"class":1209,"line":8620},207,[1207,8622,8623],{"class":1213},"        # Arrange: Create many users\n",[1207,8625,8627,8629,8631,8633,8635,8638,8640],{"class":1209,"line":8626},208,[1207,8628,6925],{"class":1620},[1207,8630,1633],{"class":1632},[1207,8632,4556],{"class":1862},[1207,8634,1811],{"class":1632},[1207,8636,8637],{"class":1231},"25",[1207,8639,2328],{"class":1632},[1207,8641,8642],{"class":1213},"  # Create 25 users\n",[1207,8644,8646],{"class":1209,"line":8645},209,[1207,8647,1836],{"class":1620},[1207,8649,8651],{"class":1209,"line":8650},210,[1207,8652,8653],{"class":1213},"        # Act: Request first page\n",[1207,8655,8657,8659,8661,8663,8665,8667,8669,8671,8673,8675,8677,8679],{"class":1209,"line":8656},211,[1207,8658,6953],{"class":1620},[1207,8660,1961],{"class":1632},[1207,8662,6769],{"class":1620},[1207,8664,1633],{"class":1632},[1207,8666,5111],{"class":1862},[1207,8668,1811],{"class":1632},[1207,8670,6966],{"class":1862},[1207,8672,1811],{"class":1632},[1207,8674,1965],{"class":1964},[1207,8676,6973],{"class":1224},[1207,8678,1965],{"class":1964},[1207,8680,6978],{"class":1632},[1207,8682,8684],{"class":1209,"line":8683},212,[1207,8685,1836],{"class":1620},[1207,8687,8689],{"class":1209,"line":8688},213,[1207,8690,8691],{"class":1213},"        # Assert: Verify pagination\n",[1207,8693,8695,8697,8699,8701,8703,8705,8707,8709],{"class":1209,"line":8694},214,[1207,8696,2153],{"class":1616},[1207,8698,6994],{"class":1620},[1207,8700,1633],{"class":1632},[1207,8702,2772],{"class":1942},[1207,8704,2164],{"class":2163},[1207,8706,7003],{"class":1620},[1207,8708,1633],{"class":1632},[1207,8710,7009],{"class":7008},[1207,8712,8714],{"class":1209,"line":8713},215,[1207,8715,1836],{"class":1620},[1207,8717,8719,8721,8723,8725,8727,8729],{"class":1209,"line":8718},216,[1207,8720,7023],{"class":1620},[1207,8722,1961],{"class":1632},[1207,8724,6994],{"class":1620},[1207,8726,1633],{"class":1632},[1207,8728,2792],{"class":1862},[1207,8730,1866],{"class":1632},[1207,8732,8734,8736,8738,8740,8742,8744],{"class":1209,"line":8733},217,[1207,8735,2153],{"class":1616},[1207,8737,2188],{"class":1964},[1207,8739,7042],{"class":1224},[1207,8741,1965],{"class":1964},[1207,8743,2983],{"class":2163},[1207,8745,8746],{"class":1620}," data\n",[1207,8748,8750,8752,8754,8756,8758,8760],{"class":1209,"line":8749},218,[1207,8751,2153],{"class":1616},[1207,8753,2188],{"class":1964},[1207,8755,7992],{"class":1224},[1207,8757,1965],{"class":1964},[1207,8759,2983],{"class":2163},[1207,8761,8746],{"class":1620},[1207,8763,8765,8767,8769,8772,8774,8776],{"class":1209,"line":8764},219,[1207,8766,2153],{"class":1616},[1207,8768,2188],{"class":1964},[1207,8770,8771],{"class":1224},"next",[1207,8773,1965],{"class":1964},[1207,8775,2983],{"class":2163},[1207,8777,8746],{"class":1620},[1207,8779,8781,8783,8785,8788,8790,8792],{"class":1209,"line":8780},220,[1207,8782,2153],{"class":1616},[1207,8784,2188],{"class":1964},[1207,8786,8787],{"class":1224},"previous",[1207,8789,1965],{"class":1964},[1207,8791,2983],{"class":2163},[1207,8793,8746],{"class":1620},[1207,8795,8797],{"class":1209,"line":8796},221,[1207,8798,1836],{"class":1620},[1207,8800,8802,8804,8806,8808,8810,8812,8814,8816,8818,8821],{"class":1209,"line":8801},222,[1207,8803,2153],{"class":1616},[1207,8805,7100],{"class":1620},[1207,8807,2989],{"class":1632},[1207,8809,1965],{"class":1964},[1207,8811,7992],{"class":1224},[1207,8813,1965],{"class":1964},[1207,8815,3010],{"class":1632},[1207,8817,2164],{"class":2163},[1207,8819,8820],{"class":1231}," 25",[1207,8822,8823],{"class":1213},"  # Total count\n",[1207,8825,8827,8829,8831,8833,8835,8837,8839,8841,8843,8845,8848,8851],{"class":1209,"line":8826},223,[1207,8828,2153],{"class":1616},[1207,8830,5812],{"class":5160},[1207,8832,1811],{"class":1632},[1207,8834,7063],{"class":1862},[1207,8836,2989],{"class":1632},[1207,8838,1965],{"class":1964},[1207,8840,7042],{"class":1224},[1207,8842,1965],{"class":1964},[1207,8844,7074],{"class":1632},[1207,8846,8847],{"class":2163}," \u003C=",[1207,8849,8850],{"class":1231}," 20",[1207,8852,8853],{"class":1213},"  # Page size (assuming 20 per page)\n",[1207,8855,8857,8859,8861,8863,8865,8867,8869,8871,8873,8875,8878],{"class":1209,"line":8856},224,[1207,8858,2153],{"class":1616},[1207,8860,7100],{"class":1620},[1207,8862,2989],{"class":1632},[1207,8864,1965],{"class":1964},[1207,8866,8771],{"class":1224},[1207,8868,1965],{"class":1964},[1207,8870,3010],{"class":1632},[1207,8872,3850],{"class":2163},[1207,8874,3853],{"class":2163},[1207,8876,8877],{"class":2813}," None",[1207,8879,8880],{"class":1213},"  # Should have next page\n",[1207,8882,8884,8886,8888,8890,8892,8894,8896,8898,8900,8902],{"class":1209,"line":8883},225,[1207,8885,2153],{"class":1616},[1207,8887,7100],{"class":1620},[1207,8889,2989],{"class":1632},[1207,8891,1965],{"class":1964},[1207,8893,8787],{"class":1224},[1207,8895,1965],{"class":1964},[1207,8897,3010],{"class":1632},[1207,8899,3850],{"class":2163},[1207,8901,8877],{"class":2813},[1207,8903,8904],{"class":1213},"  # First page, no previous\n",[1207,8906,8908],{"class":1209,"line":8907},226,[1207,8909,1763],{"class":1620},[1207,8911,8913,8915,8918,8920,8922,8924,8926],{"class":1209,"line":8912},227,[1207,8914,1806],{"class":1735},[1207,8916,8917],{"class":1794}," test_user_search_functionality",[1207,8919,1811],{"class":1632},[1207,8921,1815],{"class":1814},[1207,8923,1644],{"class":1632},[1207,8925,6769],{"class":2051},[1207,8927,1818],{"class":1632},[1207,8929,8931],{"class":1209,"line":8930},228,[1207,8932,1824],{"class":1749},[1207,8934,8936],{"class":1209,"line":8935},229,[1207,8937,8938],{"class":1756},"        Test user search/filtering functionality\n",[1207,8940,8942],{"class":1209,"line":8941},230,[1207,8943,1836],{"class":1756},[1207,8945,8947],{"class":1209,"line":8946},231,[1207,8948,8949],{"class":1756},"        This test verifies that query parameters work correctly.\n",[1207,8951,8953],{"class":1209,"line":8952},232,[1207,8954,1824],{"class":1749},[1207,8956,8958],{"class":1209,"line":8957},233,[1207,8959,8960],{"class":1213},"        # Arrange: Create users with specific data\n",[1207,8962,8964,8966,8968,8970,8972,8974,8977,8979,8981,8984,8986,8988,8991,8993],{"class":1209,"line":8963},234,[1207,8965,6925],{"class":1862},[1207,8967,1811],{"class":1632},[1207,8969,2183],{"class":1957},[1207,8971,1961],{"class":1632},[1207,8973,1965],{"class":1964},[1207,8975,8976],{"class":1224},"john_doe",[1207,8978,1965],{"class":1964},[1207,8980,1644],{"class":1632},[1207,8982,8983],{"class":1957}," first_name",[1207,8985,1961],{"class":1632},[1207,8987,1965],{"class":1964},[1207,8989,8990],{"class":1224},"John",[1207,8992,1965],{"class":1964},[1207,8994,2136],{"class":1632},[1207,8996,8998,9000,9002,9004,9006,9008,9011,9013,9015,9017,9019,9021,9024,9026],{"class":1209,"line":8997},235,[1207,8999,6925],{"class":1862},[1207,9001,1811],{"class":1632},[1207,9003,2183],{"class":1957},[1207,9005,1961],{"class":1632},[1207,9007,1965],{"class":1964},[1207,9009,9010],{"class":1224},"jane_doe",[1207,9012,1965],{"class":1964},[1207,9014,1644],{"class":1632},[1207,9016,8983],{"class":1957},[1207,9018,1961],{"class":1632},[1207,9020,1965],{"class":1964},[1207,9022,9023],{"class":1224},"Jane",[1207,9025,1965],{"class":1964},[1207,9027,2136],{"class":1632},[1207,9029,9031,9033,9035,9037,9039,9041,9044,9046,9048,9050,9052,9054,9057,9059],{"class":1209,"line":9030},236,[1207,9032,6925],{"class":1862},[1207,9034,1811],{"class":1632},[1207,9036,2183],{"class":1957},[1207,9038,1961],{"class":1632},[1207,9040,1965],{"class":1964},[1207,9042,9043],{"class":1224},"bob_smith",[1207,9045,1965],{"class":1964},[1207,9047,1644],{"class":1632},[1207,9049,8983],{"class":1957},[1207,9051,1961],{"class":1632},[1207,9053,1965],{"class":1964},[1207,9055,9056],{"class":1224},"Bob",[1207,9058,1965],{"class":1964},[1207,9060,2136],{"class":1632},[1207,9062,9064],{"class":1209,"line":9063},237,[1207,9065,1836],{"class":1620},[1207,9067,9069],{"class":1209,"line":9068},238,[1207,9070,9071],{"class":1213},"        # Act: Search for users with 'doe' in username\n",[1207,9073,9075,9077,9079,9081,9083,9085],{"class":1209,"line":9074},239,[1207,9076,6953],{"class":1620},[1207,9078,1961],{"class":1632},[1207,9080,6769],{"class":1620},[1207,9082,1633],{"class":1632},[1207,9084,5111],{"class":1862},[1207,9086,1951],{"class":1632},[1207,9088,9090,9092,9094,9096,9098,9100],{"class":1209,"line":9089},240,[1207,9091,7375],{"class":1862},[1207,9093,1811],{"class":1632},[1207,9095,1965],{"class":1964},[1207,9097,6973],{"class":1224},[1207,9099,1965],{"class":1964},[1207,9101,7386],{"class":1632},[1207,9103,9105,9107,9109,9112,9114,9116,9118,9121,9123,9125],{"class":1209,"line":9104},241,[1207,9106,2864],{"class":1632},[1207,9108,1965],{"class":1964},[1207,9110,9111],{"class":1224},"search",[1207,9113,1965],{"class":1964},[1207,9115,2458],{"class":1632},[1207,9117,2188],{"class":1964},[1207,9119,9120],{"class":1224},"doe",[1207,9122,1965],{"class":1964},[1207,9124,3294],{"class":1632},[1207,9126,9127],{"class":1213},"  # Query parameter\n",[1207,9129,9131],{"class":1209,"line":9130},242,[1207,9132,2012],{"class":1632},[1207,9134,9136],{"class":1209,"line":9135},243,[1207,9137,1836],{"class":1620},[1207,9139,9141],{"class":1209,"line":9140},244,[1207,9142,9143],{"class":1213},"        # Assert: Verify search results\n",[1207,9145,9147,9149,9151,9153,9155,9157,9159,9161],{"class":1209,"line":9146},245,[1207,9148,2153],{"class":1616},[1207,9150,6994],{"class":1620},[1207,9152,1633],{"class":1632},[1207,9154,2772],{"class":1942},[1207,9156,2164],{"class":2163},[1207,9158,7003],{"class":1620},[1207,9160,1633],{"class":1632},[1207,9162,7009],{"class":7008},[1207,9164,9166],{"class":1209,"line":9165},246,[1207,9167,1836],{"class":1620},[1207,9169,9171,9173,9175,9177,9179,9181],{"class":1209,"line":9170},247,[1207,9172,7023],{"class":1620},[1207,9174,1961],{"class":1632},[1207,9176,6994],{"class":1620},[1207,9178,1633],{"class":1632},[1207,9180,2792],{"class":1862},[1207,9182,1866],{"class":1632},[1207,9184,9186,9188,9190,9192,9194,9196,9198,9200,9202,9204,9206,9208],{"class":1209,"line":9185},248,[1207,9187,2153],{"class":1616},[1207,9189,5812],{"class":5160},[1207,9191,1811],{"class":1632},[1207,9193,7063],{"class":1862},[1207,9195,2989],{"class":1632},[1207,9197,1965],{"class":1964},[1207,9199,7042],{"class":1224},[1207,9201,1965],{"class":1964},[1207,9203,7074],{"class":1632},[1207,9205,2164],{"class":2163},[1207,9207,2939],{"class":1231},[1207,9209,9210],{"class":1213},"  # Should find john_doe and jane_doe\n",[1207,9212,9214],{"class":1209,"line":9213},249,[1207,9215,1836],{"class":1620},[1207,9217,9219,9222,9224,9227,9229,9231,9233,9235,9237,9239,9242,9244,9246,9248,9250,9252,9254,9256],{"class":1209,"line":9218},250,[1207,9220,9221],{"class":1620},"        usernames ",[1207,9223,1961],{"class":1632},[1207,9225,9226],{"class":1632}," [",[1207,9228,2643],{"class":1620},[1207,9230,2989],{"class":1632},[1207,9232,1965],{"class":1964},[1207,9234,2183],{"class":1224},[1207,9236,1965],{"class":1964},[1207,9238,3010],{"class":1632},[1207,9240,9241],{"class":1616}," for",[1207,9243,5846],{"class":1620},[1207,9245,5752],{"class":1616},[1207,9247,7100],{"class":1620},[1207,9249,2989],{"class":1632},[1207,9251,1965],{"class":1964},[1207,9253,7042],{"class":1224},[1207,9255,1965],{"class":1964},[1207,9257,9258],{"class":1632},"]]\n",[1207,9260,9262,9264,9266,9268,9270,9272],{"class":1209,"line":9261},251,[1207,9263,2153],{"class":1616},[1207,9265,2188],{"class":1964},[1207,9267,8976],{"class":1224},[1207,9269,1965],{"class":1964},[1207,9271,2983],{"class":2163},[1207,9273,9274],{"class":1620}," usernames\n",[1207,9276,9278,9280,9282,9284,9286,9288],{"class":1209,"line":9277},252,[1207,9279,2153],{"class":1616},[1207,9281,2188],{"class":1964},[1207,9283,9010],{"class":1224},[1207,9285,1965],{"class":1964},[1207,9287,2983],{"class":2163},[1207,9289,9274],{"class":1620},[1207,9291,9293,9295,9297,9299,9301,9303,9305],{"class":1209,"line":9292},253,[1207,9294,2153],{"class":1616},[1207,9296,2188],{"class":1964},[1207,9298,9043],{"class":1224},[1207,9300,1965],{"class":1964},[1207,9302,3853],{"class":2163},[1207,9304,2983],{"class":2163},[1207,9306,9274],{"class":1620},[1026,9308,9309],{},[1045,9310,9311],{},"Key API integration testing concepts:",[1123,9313,9314,9320,9326,9332,9338,9344,9350,9355],{},[1084,9315,9316,9319],{},[1045,9317,9318],{},"HTTP Methods",": Test GET, POST, PUT, PATCH, DELETE operations",[1084,9321,9322,9325],{},[1045,9323,9324],{},"Status Codes",": Verify correct HTTP status codes are returned",[1084,9327,9328,9331],{},[1045,9329,9330],{},"Request/Response Format",": Ensure JSON serialization works correctly",[1084,9333,9334,9337],{},[1045,9335,9336],{},"Authentication",": Test both authenticated and unauthenticated access",[1084,9339,9340,9343],{},[1045,9341,9342],{},"Validation",": Verify input validation and error handling",[1084,9345,9346,9349],{},[1045,9347,9348],{},"Database Persistence",": Ensure API operations actually affect the database",[1084,9351,9352,9354],{},[1045,9353,208],{},": Test that large datasets are handled correctly",[1084,9356,9357,9360],{},[1045,9358,9359],{},"Search/Filtering",": Verify query parameters work as expected",[1030,9362,1396],{"id":9363},"contract-testing-1",[1026,9365,9366],{},"Contract testing is a crucial technique for microservices that ensures services can communicate correctly even as they evolve independently. Think of it as a formal agreement between services about how they'll talk to each other.",[1038,9368,9370],{"id":9369},"understanding-the-problem","Understanding the Problem",[1026,9372,9373],{},"In microservices, Service A (consumer) calls Service B (provider). Both teams develop independently, but they need to ensure their services remain compatible. Traditional integration tests require both services to be running, which creates dependencies and slows down development.",[1026,9375,9376],{},[1045,9377,9378],{},"The Challenge:",[1081,9380,9381,9384,9387],{},[1084,9382,9383],{},"User Service team changes their API response format",[1084,9385,9386],{},"Order Service team doesn't know about the change",[1084,9388,9389],{},"Order Service breaks in production when it can't parse the new response",[1026,9391,9392,9395],{},[1045,9393,9394],{},"The Solution:","\nContract testing verifies the \"contract\" (API specification) between services without requiring both services to run simultaneously.",[1038,9397,9399],{"id":9398},"how-contract-testing-works","How Contract Testing Works",[1123,9401,9402,9408,9414,9420],{},[1084,9403,9404,9407],{},[1045,9405,9406],{},"Consumer Side",": Order Service defines what it expects from User Service (the contract)",[1084,9409,9410,9413],{},[1045,9411,9412],{},"Contract Storage",": The contract is stored in a shared location (Pact Broker)",[1084,9415,9416,9419],{},[1045,9417,9418],{},"Provider Side",": User Service verifies it can fulfill the contract",[1084,9421,9422,9425],{},[1045,9423,9424],{},"Continuous Verification",": Both sides run contract tests in their CI/CD pipelines",[1038,9427,9429],{"id":9428},"pact-testing-setup","Pact Testing Setup",[1026,9431,9432],{},"Pact is the most popular contract testing framework. Here's how to implement it:",[1197,9434,9436],{"className":1602,"code":9435,"language":1604,"meta":1202,"style":1202},"# tests/contract/test_user_service_contract.py\nimport pytest\nfrom pact import Consumer, Provider, Like, Term\nfrom user_service.client import UserServiceClient\n\n# Consumer side (Order Service testing User Service contract)\n@pytest.fixture(scope='session')\ndef pact():\n    \"\"\"\n    Create a Pact between Order Service (consumer) and User Service (provider)\n    \n    This fixture sets up the contract testing framework. The consumer\n    (Order Service) defines what it expects from the provider (User Service).\n    \"\"\"\n    return Consumer('OrderService').has_pact_with(Provider('UserService'))\n\n@pytest.fixture(scope='session')\ndef user_service_client():\n    \"\"\"\n    Client for making requests to User Service\n    \n    This would be the actual client your Order Service uses to\n    communicate with the User Service.\n    \"\"\"\n    return UserServiceClient('http://localhost:1234')\n\ndef test_get_user_contract(pact, user_service_client):\n    \"\"\"\n    Test contract for getting user by ID\n    \n    This test defines what the Order Service expects when it\n    requests user data from the User Service.\n    \"\"\"\n    # Define the expected response structure\n    # Like() means \"a value like this\" - the actual value can vary\n    # but the type and structure must match\n    expected_user = {\n        'id': Like(1),                    # Any integer\n        'username': Like('testuser'),     # Any string\n        'email': Like('test@example.com'), # Any string (could add email validation)\n        'first_name': Like('Test'),       # Any string\n        'last_name': Like('User'),        # Any string\n        'is_active': Like(True),          # Any boolean\n        'created_at': Term(               # String matching ISO date format\n            matcher=r'\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}',\n            example='2023-01-01T12:00:00'\n        )\n    }\n    \n    # Define the interaction - what request triggers what response\n    (pact\n     .given('User with ID 1 exists')                    # Provider state\n     .upon_receiving('a request for user with ID 1')   # Description\n     .with_request('GET', '/api/users/1/')              # Expected request\n     .will_respond_with(200, body=expected_user))       # Expected response\n    \n    # Execute the test within the Pact context\n    with pact:\n        # Make the actual request using your client\n        user = user_service_client.get_user(1)\n        \n        # Verify the response matches your expectations\n        assert user['username'] == 'testuser'\n        assert user['email'] == 'test@example.com'\n        assert 'id' in user\n        assert 'created_at' in user\n\ndef test_create_user_contract(pact, user_service_client):\n    \"\"\"\n    Test contract for creating a new user\n    \n    This test defines the contract for user creation, including\n    the request format and expected response.\n    \"\"\"\n    # Define the request data structure\n    user_data = {\n        'username': 'newuser',\n        'email': 'new@example.com',\n        'password': 'newpass123',\n        'first_name': 'New',\n        'last_name': 'User'\n    }\n    \n    # Define the expected response\n    expected_response = {\n        'id': Like(2),                    # New user gets an ID\n        'username': 'newuser',            # Exact match for provided data\n        'email': 'new@example.com',\n        'first_name': 'New',\n        'last_name': 'User',\n        'is_active': True,                # Default value\n        'created_at': Term(\n            matcher=r'\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}',\n            example='2023-01-01T12:00:00'\n        )\n    }\n    \n    # Define the interaction\n    (pact\n     .given('User service is available')               # Provider state\n     .upon_receiving('a request to create a new user') # Description\n     .with_request('POST', '/api/users/', body=user_data) # Expected request\n     .will_respond_with(201, body=expected_response))   # Expected response\n    \n    # Execute the test\n    with pact:\n        user = user_service_client.create_user(user_data)\n        \n        # Verify the response\n        assert user['username'] == 'newuser'\n        assert user['id'] is not None\n        assert user['is_active'] is True\n\ndef test_get_user_not_found_contract(pact, user_service_client):\n    \"\"\"\n    Test contract for user not found scenario\n    \n    It's important to test error cases too, so both services\n    agree on how errors are handled.\n    \"\"\"\n    expected_error = {\n        'error': 'User not found',\n        'code': 'USER_NOT_FOUND',\n        'detail': Like('User with ID 999 does not exist')\n    }\n    \n    (pact\n     .given('User with ID 999 does not exist')\n     .upon_receiving('a request for non-existent user')\n     .with_request('GET', '/api/users/999/')\n     .will_respond_with(404, body=expected_error))\n    \n    with pact:\n        # This should raise an exception or return an error response\n        try:\n            user_service_client.get_user(999)\n            assert False, \"Expected an exception for non-existent user\"\n        except UserNotFoundError as e:\n            assert e.code == 'USER_NOT_FOUND'\n\ndef test_user_list_with_pagination_contract(pact, user_service_client):\n    \"\"\"\n    Test contract for paginated user list\n    \n    This shows how to test more complex response structures\n    like paginated lists.\n    \"\"\"\n    expected_response = {\n        'count': Like(100),               # Total number of users\n        'next': Like('http://example.com/api/users/?page=2'),\n        'previous': None,                 # First page has no previous\n        'results': [\n            {\n                'id': Like(1),\n                'username': Like('user1'),\n                'email': Like('user1@example.com'),\n                'is_active': Like(True)\n            },\n            {\n                'id': Like(2),\n                'username': Like('user2'),\n                'email': Like('user2@example.com'),\n                'is_active': Like(True)\n            }\n        ]\n    }\n    \n    (pact\n     .given('Multiple users exist')\n     .upon_receiving('a request for user list')\n     .with_request('GET', '/api/users/', query={'page': '1', 'page_size': '20'})\n     .will_respond_with(200, body=expected_response))\n    \n    with pact:\n        response = user_service_client.get_users(page=1, page_size=20)\n        \n        assert 'results' in response\n        assert 'count' in response\n        assert len(response['results']) >= 1\n",[1204,9437,9438,9443,9449,9476,9492,9496,9501,9528,9539,9543,9548,9552,9557,9562,9566,9603,9607,9631,9640,9644,9649,9653,9658,9663,9667,9685,9689,9707,9711,9716,9720,9725,9730,9734,9739,9744,9749,9758,9781,9806,9831,9857,9882,9905,9924,9982,9996,10000,10005,10009,10014,10022,10044,10065,10095,10122,10126,10131,10140,10145,10164,10168,10173,10197,10221,10235,10249,10253,10270,10274,10279,10283,10288,10293,10297,10302,10311,10329,10347,10365,10383,10399,10403,10407,10412,10421,10443,10464,10482,10500,10518,10535,10549,10597,10609,10613,10617,10621,10626,10632,10652,10672,10709,10734,10738,10743,10751,10769,10773,10778,10802,10824,10844,10848,10865,10869,10874,10878,10883,10888,10892,10901,10921,10940,10964,10968,10972,10978,10994,11011,11036,11058,11062,11070,11075,11082,11098,11116,11132,11150,11154,11171,11175,11180,11184,11189,11194,11198,11206,11228,11251,11268,11280,11284,11302,11325,11348,11366,11371,11375,11393,11416,11439,11457,11461,11465,11469,11473,11479,11496,11513,11577,11597,11601,11609,11641,11645,11660,11674],{"__ignoreMap":1202},[1207,9439,9440],{"class":1209,"line":1210},[1207,9441,9442],{"class":1213},"# tests/contract/test_user_service_contract.py\n",[1207,9444,9445,9447],{"class":1209,"line":1217},[1207,9446,1617],{"class":1616},[1207,9448,1621],{"class":1620},[1207,9450,9451,9453,9456,9458,9461,9463,9466,9468,9471,9473],{"class":1209,"line":1238},[1207,9452,1626],{"class":1616},[1207,9454,9455],{"class":1620}," pact ",[1207,9457,1617],{"class":1616},[1207,9459,9460],{"class":1620}," Consumer",[1207,9462,1644],{"class":1632},[1207,9464,9465],{"class":1620}," Provider",[1207,9467,1644],{"class":1632},[1207,9469,9470],{"class":1620}," Like",[1207,9472,1644],{"class":1632},[1207,9474,9475],{"class":1620}," Term\n",[1207,9477,9478,9480,9482,9484,9487,9489],{"class":1209,"line":1254},[1207,9479,1626],{"class":1616},[1207,9481,1697],{"class":1620},[1207,9483,1633],{"class":1632},[1207,9485,9486],{"class":1620},"client ",[1207,9488,1617],{"class":1616},[1207,9490,9491],{"class":1620}," UserServiceClient\n",[1207,9493,9494],{"class":1209,"line":1270},[1207,9495,1527],{"emptyLinePlaceholder":1526},[1207,9497,9498],{"class":1209,"line":1535},[1207,9499,9500],{"class":1213},"# Consumer side (Order Service testing User Service contract)\n",[1207,9502,9503,9505,9507,9509,9512,9514,9517,9519,9521,9524,9526],{"class":1209,"line":1710},[1207,9504,3707],{"class":1632},[1207,9506,1795],{"class":1794},[1207,9508,1633],{"class":1632},[1207,9510,9511],{"class":1794},"fixture",[1207,9513,1811],{"class":1632},[1207,9515,9516],{"class":1957},"scope",[1207,9518,1961],{"class":1632},[1207,9520,1965],{"class":1964},[1207,9522,9523],{"class":1224},"session",[1207,9525,1965],{"class":1964},[1207,9527,2136],{"class":1632},[1207,9529,9530,9533,9536],{"class":1209,"line":1727},[1207,9531,9532],{"class":1735},"def",[1207,9534,9535],{"class":1794}," pact",[1207,9537,9538],{"class":1632},"():\n",[1207,9540,9541],{"class":1209,"line":1732},[1207,9542,1750],{"class":1749},[1207,9544,9545],{"class":1209,"line":1746},[1207,9546,9547],{"class":1756},"    Create a Pact between Order Service (consumer) and User Service (provider)\n",[1207,9549,9550],{"class":1209,"line":1753},[1207,9551,1763],{"class":1756},[1207,9553,9554],{"class":1209,"line":1760},[1207,9555,9556],{"class":1756},"    This fixture sets up the contract testing framework. The consumer\n",[1207,9558,9559],{"class":1209,"line":1766},[1207,9560,9561],{"class":1756},"    (Order Service) defines what it expects from the provider (User Service).\n",[1207,9563,9564],{"class":1209,"line":1772},[1207,9565,1750],{"class":1749},[1207,9567,9568,9571,9573,9575,9577,9580,9582,9584,9587,9589,9592,9594,9596,9599,9601],{"class":1209,"line":1778},[1207,9569,9570],{"class":1616},"    return",[1207,9572,9460],{"class":1862},[1207,9574,1811],{"class":1632},[1207,9576,1965],{"class":1964},[1207,9578,9579],{"class":1224},"OrderService",[1207,9581,1965],{"class":1964},[1207,9583,5543],{"class":1632},[1207,9585,9586],{"class":1862},"has_pact_with",[1207,9588,1811],{"class":1632},[1207,9590,9591],{"class":1862},"Provider",[1207,9593,1811],{"class":1632},[1207,9595,1965],{"class":1964},[1207,9597,9598],{"class":1224},"UserService",[1207,9600,1965],{"class":1964},[1207,9602,6978],{"class":1632},[1207,9604,9605],{"class":1209,"line":1783},[1207,9606,1527],{"emptyLinePlaceholder":1526},[1207,9608,9609,9611,9613,9615,9617,9619,9621,9623,9625,9627,9629],{"class":1209,"line":1788},[1207,9610,3707],{"class":1632},[1207,9612,1795],{"class":1794},[1207,9614,1633],{"class":1632},[1207,9616,9511],{"class":1794},[1207,9618,1811],{"class":1632},[1207,9620,9516],{"class":1957},[1207,9622,1961],{"class":1632},[1207,9624,1965],{"class":1964},[1207,9626,9523],{"class":1224},[1207,9628,1965],{"class":1964},[1207,9630,2136],{"class":1632},[1207,9632,9633,9635,9638],{"class":1209,"line":1803},[1207,9634,9532],{"class":1735},[1207,9636,9637],{"class":1794}," user_service_client",[1207,9639,9538],{"class":1632},[1207,9641,9642],{"class":1209,"line":1821},[1207,9643,1750],{"class":1749},[1207,9645,9646],{"class":1209,"line":1827},[1207,9647,9648],{"class":1756},"    Client for making requests to User Service\n",[1207,9650,9651],{"class":1209,"line":1833},[1207,9652,1763],{"class":1756},[1207,9654,9655],{"class":1209,"line":1839},[1207,9656,9657],{"class":1756},"    This would be the actual client your Order Service uses to\n",[1207,9659,9660],{"class":1209,"line":1845},[1207,9661,9662],{"class":1756},"    communicate with the User Service.\n",[1207,9664,9665],{"class":1209,"line":1851},[1207,9666,1750],{"class":1749},[1207,9668,9669,9671,9674,9676,9678,9681,9683],{"class":1209,"line":1856},[1207,9670,9570],{"class":1616},[1207,9672,9673],{"class":1862}," UserServiceClient",[1207,9675,1811],{"class":1632},[1207,9677,1965],{"class":1964},[1207,9679,9680],{"class":1224},"http://localhost:1234",[1207,9682,1965],{"class":1964},[1207,9684,2136],{"class":1632},[1207,9686,9687],{"class":1209,"line":1869},[1207,9688,1527],{"emptyLinePlaceholder":1526},[1207,9690,9691,9693,9696,9698,9701,9703,9705],{"class":1209,"line":1874},[1207,9692,9532],{"class":1735},[1207,9694,9695],{"class":1794}," test_get_user_contract",[1207,9697,1811],{"class":1632},[1207,9699,9700],{"class":2051},"pact",[1207,9702,1644],{"class":1632},[1207,9704,9637],{"class":2051},[1207,9706,1818],{"class":1632},[1207,9708,9709],{"class":1209,"line":1885},[1207,9710,1750],{"class":1749},[1207,9712,9713],{"class":1209,"line":1899},[1207,9714,9715],{"class":1756},"    Test contract for getting user by ID\n",[1207,9717,9718],{"class":1209,"line":1904},[1207,9719,1763],{"class":1756},[1207,9721,9722],{"class":1209,"line":1910},[1207,9723,9724],{"class":1756},"    This test defines what the Order Service expects when it\n",[1207,9726,9727],{"class":1209,"line":1915},[1207,9728,9729],{"class":1756},"    requests user data from the User Service.\n",[1207,9731,9732],{"class":1209,"line":1921},[1207,9733,1750],{"class":1749},[1207,9735,9736],{"class":1209,"line":1927},[1207,9737,9738],{"class":1213},"    # Define the expected response structure\n",[1207,9740,9741],{"class":1209,"line":1932},[1207,9742,9743],{"class":1213},"    # Like() means \"a value like this\" - the actual value can vary\n",[1207,9745,9746],{"class":1209,"line":1954},[1207,9747,9748],{"class":1213},"    # but the type and structure must match\n",[1207,9750,9751,9754,9756],{"class":1209,"line":1976},[1207,9752,9753],{"class":1620},"    expected_user ",[1207,9755,1961],{"class":1632},[1207,9757,2445],{"class":1632},[1207,9759,9760,9763,9765,9767,9769,9771,9773,9775,9778],{"class":1209,"line":1993},[1207,9761,9762],{"class":1964},"        '",[1207,9764,2133],{"class":1224},[1207,9766,1965],{"class":1964},[1207,9768,2458],{"class":1632},[1207,9770,9470],{"class":1862},[1207,9772,1811],{"class":1632},[1207,9774,2998],{"class":1231},[1207,9776,9777],{"class":1632},"),",[1207,9779,9780],{"class":1213},"                    # Any integer\n",[1207,9782,9783,9785,9787,9789,9791,9793,9795,9797,9799,9801,9803],{"class":1209,"line":2009},[1207,9784,9762],{"class":1964},[1207,9786,2183],{"class":1224},[1207,9788,1965],{"class":1964},[1207,9790,2458],{"class":1632},[1207,9792,9470],{"class":1862},[1207,9794,1811],{"class":1632},[1207,9796,1965],{"class":1964},[1207,9798,1968],{"class":1224},[1207,9800,1965],{"class":1964},[1207,9802,9777],{"class":1632},[1207,9804,9805],{"class":1213},"     # Any string\n",[1207,9807,9808,9810,9812,9814,9816,9818,9820,9822,9824,9826,9828],{"class":1209,"line":2015},[1207,9809,9762],{"class":1964},[1207,9811,2204],{"class":1224},[1207,9813,1965],{"class":1964},[1207,9815,2458],{"class":1632},[1207,9817,9470],{"class":1862},[1207,9819,1811],{"class":1632},[1207,9821,1965],{"class":1964},[1207,9823,1986],{"class":1224},[1207,9825,1965],{"class":1964},[1207,9827,9777],{"class":1632},[1207,9829,9830],{"class":1213}," # Any string (could add email validation)\n",[1207,9832,9833,9835,9837,9839,9841,9843,9845,9847,9850,9852,9854],{"class":1209,"line":2020},[1207,9834,9762],{"class":1964},[1207,9836,2516],{"class":1224},[1207,9838,1965],{"class":1964},[1207,9840,2458],{"class":1632},[1207,9842,9470],{"class":1862},[1207,9844,1811],{"class":1632},[1207,9846,1965],{"class":1964},[1207,9848,9849],{"class":1224},"Test",[1207,9851,1965],{"class":1964},[1207,9853,9777],{"class":1632},[1207,9855,9856],{"class":1213},"       # Any string\n",[1207,9858,9859,9861,9863,9865,9867,9869,9871,9873,9875,9877,9879],{"class":1209,"line":2037},[1207,9860,9762],{"class":1964},[1207,9862,2537],{"class":1224},[1207,9864,1965],{"class":1964},[1207,9866,2458],{"class":1632},[1207,9868,9470],{"class":1862},[1207,9870,1811],{"class":1632},[1207,9872,1965],{"class":1964},[1207,9874,2546],{"class":1224},[1207,9876,1965],{"class":1964},[1207,9878,9777],{"class":1632},[1207,9880,9881],{"class":1213},"        # Any string\n",[1207,9883,9884,9886,9889,9891,9893,9895,9897,9900,9902],{"class":1209,"line":2060},[1207,9885,9762],{"class":1964},[1207,9887,9888],{"class":1224},"is_active",[1207,9890,1965],{"class":1964},[1207,9892,2458],{"class":1632},[1207,9894,9470],{"class":1862},[1207,9896,1811],{"class":1632},[1207,9898,9899],{"class":2813},"True",[1207,9901,9777],{"class":1632},[1207,9903,9904],{"class":1213},"          # Any boolean\n",[1207,9906,9907,9909,9912,9914,9916,9919,9921],{"class":1209,"line":2065},[1207,9908,9762],{"class":1964},[1207,9910,9911],{"class":1224},"created_at",[1207,9913,1965],{"class":1964},[1207,9915,2458],{"class":1632},[1207,9917,9918],{"class":1862}," Term",[1207,9920,1811],{"class":1632},[1207,9922,9923],{"class":1213},"               # String matching ISO date format\n",[1207,9925,9926,9929,9931,9934,9936,9940,9944,9948,9950,9953,9955,9957,9959,9962,9964,9966,9968,9970,9972,9974,9976,9978,9980],{"class":1209,"line":2071},[1207,9927,9928],{"class":1957},"            matcher",[1207,9930,1961],{"class":1632},[1207,9932,9933],{"class":1735},"r",[1207,9935,1965],{"class":1964},[1207,9937,9939],{"class":9938},"sRJPX","\\d",[1207,9941,9943],{"class":9942},"sGuSu","{4}",[1207,9945,9947],{"class":9946},"s27EL","-",[1207,9949,9939],{"class":9938},[1207,9951,9952],{"class":9942},"{2}",[1207,9954,9947],{"class":9946},[1207,9956,9939],{"class":9938},[1207,9958,9952],{"class":9942},[1207,9960,9961],{"class":9946},"T",[1207,9963,9939],{"class":9938},[1207,9965,9952],{"class":9942},[1207,9967,2458],{"class":9946},[1207,9969,9939],{"class":9938},[1207,9971,9952],{"class":9942},[1207,9973,2458],{"class":9946},[1207,9975,9939],{"class":9938},[1207,9977,9952],{"class":9942},[1207,9979,1965],{"class":1964},[1207,9981,1973],{"class":1632},[1207,9983,9984,9987,9989,9991,9994],{"class":1209,"line":2076},[1207,9985,9986],{"class":1957},"            example",[1207,9988,1961],{"class":1632},[1207,9990,1965],{"class":1964},[1207,9992,9993],{"class":1224},"2023-01-01T12:00:00",[1207,9995,2006],{"class":1964},[1207,9997,9998],{"class":1209,"line":2082},[1207,9999,2012],{"class":1632},[1207,10001,10002],{"class":1209,"line":2088},[1207,10003,10004],{"class":1632},"    }\n",[1207,10006,10007],{"class":1209,"line":2094},[1207,10008,1763],{"class":1620},[1207,10010,10011],{"class":1209,"line":2100},[1207,10012,10013],{"class":1213},"    # Define the interaction - what request triggers what response\n",[1207,10015,10016,10019],{"class":1209,"line":2105},[1207,10017,10018],{"class":1632},"    (",[1207,10020,10021],{"class":1620},"pact\n",[1207,10023,10024,10027,10030,10032,10034,10037,10039,10041],{"class":1209,"line":2111},[1207,10025,10026],{"class":1632},"     .",[1207,10028,10029],{"class":1862},"given",[1207,10031,1811],{"class":1632},[1207,10033,1965],{"class":1964},[1207,10035,10036],{"class":1224},"User with ID 1 exists",[1207,10038,1965],{"class":1964},[1207,10040,2328],{"class":1632},[1207,10042,10043],{"class":1213},"                    # Provider state\n",[1207,10045,10046,10048,10051,10053,10055,10058,10060,10062],{"class":1209,"line":2139},[1207,10047,10026],{"class":1632},[1207,10049,10050],{"class":1862},"upon_receiving",[1207,10052,1811],{"class":1632},[1207,10054,1965],{"class":1964},[1207,10056,10057],{"class":1224},"a request for user with ID 1",[1207,10059,1965],{"class":1964},[1207,10061,2328],{"class":1632},[1207,10063,10064],{"class":1213},"   # Description\n",[1207,10066,10067,10069,10072,10074,10076,10079,10081,10083,10085,10088,10090,10092],{"class":1209,"line":2144},[1207,10068,10026],{"class":1632},[1207,10070,10071],{"class":1862},"with_request",[1207,10073,1811],{"class":1632},[1207,10075,1965],{"class":1964},[1207,10077,10078],{"class":1224},"GET",[1207,10080,1965],{"class":1964},[1207,10082,1644],{"class":1632},[1207,10084,2188],{"class":1964},[1207,10086,10087],{"class":1224},"/api/users/1/",[1207,10089,1965],{"class":1964},[1207,10091,2328],{"class":1632},[1207,10093,10094],{"class":1213},"              # Expected request\n",[1207,10096,10097,10099,10102,10104,10106,10108,10111,10113,10116,10119],{"class":1209,"line":2150},[1207,10098,10026],{"class":1632},[1207,10100,10101],{"class":1862},"will_respond_with",[1207,10103,1811],{"class":1632},[1207,10105,3564],{"class":1231},[1207,10107,1644],{"class":1632},[1207,10109,10110],{"class":1957}," body",[1207,10112,1961],{"class":1632},[1207,10114,10115],{"class":1862},"expected_user",[1207,10117,10118],{"class":1632},"))",[1207,10120,10121],{"class":1213},"       # Expected response\n",[1207,10123,10124],{"class":1209,"line":2174},[1207,10125,1763],{"class":1620},[1207,10127,10128],{"class":1209,"line":2195},[1207,10129,10130],{"class":1213},"    # Execute the test within the Pact context\n",[1207,10132,10133,10136,10138],{"class":1209,"line":2215},[1207,10134,10135],{"class":1616},"    with",[1207,10137,9535],{"class":1620},[1207,10139,1743],{"class":1632},[1207,10141,10142],{"class":1209,"line":2220},[1207,10143,10144],{"class":1213},"        # Make the actual request using your client\n",[1207,10146,10147,10149,10151,10153,10155,10158,10160,10162],{"class":1209,"line":2235},[1207,10148,2570],{"class":1620},[1207,10150,1961],{"class":1632},[1207,10152,9637],{"class":1620},[1207,10154,1633],{"class":1632},[1207,10156,10157],{"class":1862},"get_user",[1207,10159,1811],{"class":1632},[1207,10161,2998],{"class":1231},[1207,10163,2136],{"class":1632},[1207,10165,10166],{"class":1209,"line":2253},[1207,10167,1836],{"class":1620},[1207,10169,10170],{"class":1209,"line":2258},[1207,10171,10172],{"class":1213},"        # Verify the response matches your expectations\n",[1207,10174,10175,10177,10179,10181,10183,10185,10187,10189,10191,10193,10195],{"class":1209,"line":2264},[1207,10176,2153],{"class":1616},[1207,10178,2604],{"class":1620},[1207,10180,2989],{"class":1632},[1207,10182,1965],{"class":1964},[1207,10184,2183],{"class":1224},[1207,10186,1965],{"class":1964},[1207,10188,3010],{"class":1632},[1207,10190,2164],{"class":2163},[1207,10192,2188],{"class":1964},[1207,10194,1968],{"class":1224},[1207,10196,2006],{"class":1964},[1207,10198,10199,10201,10203,10205,10207,10209,10211,10213,10215,10217,10219],{"class":1209,"line":2269},[1207,10200,2153],{"class":1616},[1207,10202,2604],{"class":1620},[1207,10204,2989],{"class":1632},[1207,10206,1965],{"class":1964},[1207,10208,2204],{"class":1224},[1207,10210,1965],{"class":1964},[1207,10212,3010],{"class":1632},[1207,10214,2164],{"class":2163},[1207,10216,2188],{"class":1964},[1207,10218,1986],{"class":1224},[1207,10220,2006],{"class":1964},[1207,10222,10223,10225,10227,10229,10231,10233],{"class":1209,"line":2275},[1207,10224,2153],{"class":1616},[1207,10226,2188],{"class":1964},[1207,10228,2133],{"class":1224},[1207,10230,1965],{"class":1964},[1207,10232,2983],{"class":2163},[1207,10234,4274],{"class":1620},[1207,10236,10237,10239,10241,10243,10245,10247],{"class":1209,"line":2281},[1207,10238,2153],{"class":1616},[1207,10240,2188],{"class":1964},[1207,10242,9911],{"class":1224},[1207,10244,1965],{"class":1964},[1207,10246,2983],{"class":2163},[1207,10248,4274],{"class":1620},[1207,10250,10251],{"class":1209,"line":2286},[1207,10252,1527],{"emptyLinePlaceholder":1526},[1207,10254,10255,10257,10260,10262,10264,10266,10268],{"class":1209,"line":2292},[1207,10256,9532],{"class":1735},[1207,10258,10259],{"class":1794}," test_create_user_contract",[1207,10261,1811],{"class":1632},[1207,10263,9700],{"class":2051},[1207,10265,1644],{"class":1632},[1207,10267,9637],{"class":2051},[1207,10269,1818],{"class":1632},[1207,10271,10272],{"class":1209,"line":2313},[1207,10273,1750],{"class":1749},[1207,10275,10276],{"class":1209,"line":2334},[1207,10277,10278],{"class":1756},"    Test contract for creating a new user\n",[1207,10280,10281],{"class":1209,"line":2339},[1207,10282,1763],{"class":1756},[1207,10284,10285],{"class":1209,"line":2358},[1207,10286,10287],{"class":1756},"    This test defines the contract for user creation, including\n",[1207,10289,10290],{"class":1209,"line":2381},[1207,10291,10292],{"class":1756},"    the request format and expected response.\n",[1207,10294,10295],{"class":1209,"line":2386},[1207,10296,1750],{"class":1749},[1207,10298,10299],{"class":1209,"line":2392},[1207,10300,10301],{"class":1213},"    # Define the request data structure\n",[1207,10303,10304,10307,10309],{"class":1209,"line":2397},[1207,10305,10306],{"class":1620},"    user_data ",[1207,10308,1961],{"class":1632},[1207,10310,2445],{"class":1632},[1207,10312,10313,10315,10317,10319,10321,10323,10325,10327],{"class":1209,"line":2403},[1207,10314,9762],{"class":1964},[1207,10316,2183],{"class":1224},[1207,10318,1965],{"class":1964},[1207,10320,2458],{"class":1632},[1207,10322,2188],{"class":1964},[1207,10324,2463],{"class":1224},[1207,10326,1965],{"class":1964},[1207,10328,1973],{"class":1632},[1207,10330,10331,10333,10335,10337,10339,10341,10343,10345],{"class":1209,"line":2409},[1207,10332,9762],{"class":1964},[1207,10334,2204],{"class":1224},[1207,10336,1965],{"class":1964},[1207,10338,2458],{"class":1632},[1207,10340,2188],{"class":1964},[1207,10342,2483],{"class":1224},[1207,10344,1965],{"class":1964},[1207,10346,1973],{"class":1632},[1207,10348,10349,10351,10353,10355,10357,10359,10361,10363],{"class":1209,"line":2414},[1207,10350,9762],{"class":1964},[1207,10352,2495],{"class":1224},[1207,10354,1965],{"class":1964},[1207,10356,2458],{"class":1632},[1207,10358,2188],{"class":1964},[1207,10360,2504],{"class":1224},[1207,10362,1965],{"class":1964},[1207,10364,1973],{"class":1632},[1207,10366,10367,10369,10371,10373,10375,10377,10379,10381],{"class":1209,"line":2420},[1207,10368,9762],{"class":1964},[1207,10370,2516],{"class":1224},[1207,10372,1965],{"class":1964},[1207,10374,2458],{"class":1632},[1207,10376,2188],{"class":1964},[1207,10378,2525],{"class":1224},[1207,10380,1965],{"class":1964},[1207,10382,1973],{"class":1632},[1207,10384,10385,10387,10389,10391,10393,10395,10397],{"class":1209,"line":2426},[1207,10386,9762],{"class":1964},[1207,10388,2537],{"class":1224},[1207,10390,1965],{"class":1964},[1207,10392,2458],{"class":1632},[1207,10394,2188],{"class":1964},[1207,10396,2546],{"class":1224},[1207,10398,2006],{"class":1964},[1207,10400,10401],{"class":1209,"line":2431},[1207,10402,10004],{"class":1632},[1207,10404,10405],{"class":1209,"line":2437},[1207,10406,1763],{"class":1620},[1207,10408,10409],{"class":1209,"line":2448},[1207,10410,10411],{"class":1213},"    # Define the expected response\n",[1207,10413,10414,10417,10419],{"class":1209,"line":2470},[1207,10415,10416],{"class":1620},"    expected_response ",[1207,10418,1961],{"class":1632},[1207,10420,2445],{"class":1632},[1207,10422,10423,10425,10427,10429,10431,10433,10435,10438,10440],{"class":1209,"line":2490},[1207,10424,9762],{"class":1964},[1207,10426,2133],{"class":1224},[1207,10428,1965],{"class":1964},[1207,10430,2458],{"class":1632},[1207,10432,9470],{"class":1862},[1207,10434,1811],{"class":1632},[1207,10436,10437],{"class":1231},"2",[1207,10439,9777],{"class":1632},[1207,10441,10442],{"class":1213},"                    # New user gets an ID\n",[1207,10444,10445,10447,10449,10451,10453,10455,10457,10459,10461],{"class":1209,"line":2511},[1207,10446,9762],{"class":1964},[1207,10448,2183],{"class":1224},[1207,10450,1965],{"class":1964},[1207,10452,2458],{"class":1632},[1207,10454,2188],{"class":1964},[1207,10456,2463],{"class":1224},[1207,10458,1965],{"class":1964},[1207,10460,1644],{"class":1632},[1207,10462,10463],{"class":1213},"            # Exact match for provided data\n",[1207,10465,10466,10468,10470,10472,10474,10476,10478,10480],{"class":1209,"line":2532},[1207,10467,9762],{"class":1964},[1207,10469,2204],{"class":1224},[1207,10471,1965],{"class":1964},[1207,10473,2458],{"class":1632},[1207,10475,2188],{"class":1964},[1207,10477,2483],{"class":1224},[1207,10479,1965],{"class":1964},[1207,10481,1973],{"class":1632},[1207,10483,10484,10486,10488,10490,10492,10494,10496,10498],{"class":1209,"line":2551},[1207,10485,9762],{"class":1964},[1207,10487,2516],{"class":1224},[1207,10489,1965],{"class":1964},[1207,10491,2458],{"class":1632},[1207,10493,2188],{"class":1964},[1207,10495,2525],{"class":1224},[1207,10497,1965],{"class":1964},[1207,10499,1973],{"class":1632},[1207,10501,10502,10504,10506,10508,10510,10512,10514,10516],{"class":1209,"line":2557},[1207,10503,9762],{"class":1964},[1207,10505,2537],{"class":1224},[1207,10507,1965],{"class":1964},[1207,10509,2458],{"class":1632},[1207,10511,2188],{"class":1964},[1207,10513,2546],{"class":1224},[1207,10515,1965],{"class":1964},[1207,10517,1973],{"class":1632},[1207,10519,10520,10522,10524,10526,10528,10530,10532],{"class":1209,"line":2562},[1207,10521,9762],{"class":1964},[1207,10523,9888],{"class":1224},[1207,10525,1965],{"class":1964},[1207,10527,2458],{"class":1632},[1207,10529,2814],{"class":2813},[1207,10531,1644],{"class":1632},[1207,10533,10534],{"class":1213},"                # Default value\n",[1207,10536,10537,10539,10541,10543,10545,10547],{"class":1209,"line":2567},[1207,10538,9762],{"class":1964},[1207,10540,9911],{"class":1224},[1207,10542,1965],{"class":1964},[1207,10544,2458],{"class":1632},[1207,10546,9918],{"class":1862},[1207,10548,1951],{"class":1632},[1207,10550,10551,10553,10555,10557,10559,10561,10563,10565,10567,10569,10571,10573,10575,10577,10579,10581,10583,10585,10587,10589,10591,10593,10595],{"class":1209,"line":2588},[1207,10552,9928],{"class":1957},[1207,10554,1961],{"class":1632},[1207,10556,9933],{"class":1735},[1207,10558,1965],{"class":1964},[1207,10560,9939],{"class":9938},[1207,10562,9943],{"class":9942},[1207,10564,9947],{"class":9946},[1207,10566,9939],{"class":9938},[1207,10568,9952],{"class":9942},[1207,10570,9947],{"class":9946},[1207,10572,9939],{"class":9938},[1207,10574,9952],{"class":9942},[1207,10576,9961],{"class":9946},[1207,10578,9939],{"class":9938},[1207,10580,9952],{"class":9942},[1207,10582,2458],{"class":9946},[1207,10584,9939],{"class":9938},[1207,10586,9952],{"class":9942},[1207,10588,2458],{"class":9946},[1207,10590,9939],{"class":9938},[1207,10592,9952],{"class":9942},[1207,10594,1965],{"class":1964},[1207,10596,1973],{"class":1632},[1207,10598,10599,10601,10603,10605,10607],{"class":1209,"line":2593},[1207,10600,9986],{"class":1957},[1207,10602,1961],{"class":1632},[1207,10604,1965],{"class":1964},[1207,10606,9993],{"class":1224},[1207,10608,2006],{"class":1964},[1207,10610,10611],{"class":1209,"line":2599},[1207,10612,2012],{"class":1632},[1207,10614,10615],{"class":1209,"line":2619},[1207,10616,10004],{"class":1632},[1207,10618,10619],{"class":1209,"line":2624},[1207,10620,1763],{"class":1620},[1207,10622,10623],{"class":1209,"line":2630},[1207,10624,10625],{"class":1213},"    # Define the interaction\n",[1207,10627,10628,10630],{"class":1209,"line":2652},[1207,10629,10018],{"class":1632},[1207,10631,10021],{"class":1620},[1207,10633,10634,10636,10638,10640,10642,10645,10647,10649],{"class":1209,"line":2657},[1207,10635,10026],{"class":1632},[1207,10637,10029],{"class":1862},[1207,10639,1811],{"class":1632},[1207,10641,1965],{"class":1964},[1207,10643,10644],{"class":1224},"User service is available",[1207,10646,1965],{"class":1964},[1207,10648,2328],{"class":1632},[1207,10650,10651],{"class":1213},"               # Provider state\n",[1207,10653,10654,10656,10658,10660,10662,10665,10667,10669],{"class":1209,"line":2675},[1207,10655,10026],{"class":1632},[1207,10657,10050],{"class":1862},[1207,10659,1811],{"class":1632},[1207,10661,1965],{"class":1964},[1207,10663,10664],{"class":1224},"a request to create a new user",[1207,10666,1965],{"class":1964},[1207,10668,2328],{"class":1632},[1207,10670,10671],{"class":1213}," # Description\n",[1207,10673,10674,10676,10678,10680,10682,10685,10687,10689,10691,10694,10696,10698,10700,10702,10704,10706],{"class":1209,"line":2702},[1207,10675,10026],{"class":1632},[1207,10677,10071],{"class":1862},[1207,10679,1811],{"class":1632},[1207,10681,1965],{"class":1964},[1207,10683,10684],{"class":1224},"POST",[1207,10686,1965],{"class":1964},[1207,10688,1644],{"class":1632},[1207,10690,2188],{"class":1964},[1207,10692,10693],{"class":1224},"/api/users/",[1207,10695,1965],{"class":1964},[1207,10697,1644],{"class":1632},[1207,10699,10110],{"class":1957},[1207,10701,1961],{"class":1632},[1207,10703,2583],{"class":1862},[1207,10705,2328],{"class":1632},[1207,10707,10708],{"class":1213}," # Expected request\n",[1207,10710,10711,10713,10715,10717,10720,10722,10724,10726,10729,10731],{"class":1209,"line":2707},[1207,10712,10026],{"class":1632},[1207,10714,10101],{"class":1862},[1207,10716,1811],{"class":1632},[1207,10718,10719],{"class":1231},"201",[1207,10721,1644],{"class":1632},[1207,10723,10110],{"class":1957},[1207,10725,1961],{"class":1632},[1207,10727,10728],{"class":1862},"expected_response",[1207,10730,10118],{"class":1632},[1207,10732,10733],{"class":1213},"   # Expected response\n",[1207,10735,10736],{"class":1209,"line":2713},[1207,10737,1763],{"class":1620},[1207,10739,10740],{"class":1209,"line":2718},[1207,10741,10742],{"class":1213},"    # Execute the test\n",[1207,10744,10745,10747,10749],{"class":1209,"line":2724},[1207,10746,10135],{"class":1616},[1207,10748,9535],{"class":1620},[1207,10750,1743],{"class":1632},[1207,10752,10753,10755,10757,10759,10761,10763,10765,10767],{"class":1209,"line":2730},[1207,10754,2570],{"class":1620},[1207,10756,1961],{"class":1632},[1207,10758,9637],{"class":1620},[1207,10760,1633],{"class":1632},[1207,10762,1948],{"class":1862},[1207,10764,1811],{"class":1632},[1207,10766,2583],{"class":1862},[1207,10768,2136],{"class":1632},[1207,10770,10771],{"class":1209,"line":2736},[1207,10772,1836],{"class":1620},[1207,10774,10775],{"class":1209,"line":2742},[1207,10776,10777],{"class":1213},"        # Verify the response\n",[1207,10779,10780,10782,10784,10786,10788,10790,10792,10794,10796,10798,10800],{"class":1209,"line":2748},[1207,10781,2153],{"class":1616},[1207,10783,2604],{"class":1620},[1207,10785,2989],{"class":1632},[1207,10787,1965],{"class":1964},[1207,10789,2183],{"class":1224},[1207,10791,1965],{"class":1964},[1207,10793,3010],{"class":1632},[1207,10795,2164],{"class":2163},[1207,10797,2188],{"class":1964},[1207,10799,2463],{"class":1224},[1207,10801,2006],{"class":1964},[1207,10803,10804,10806,10808,10810,10812,10814,10816,10818,10820,10822],{"class":1209,"line":2753},[1207,10805,2153],{"class":1616},[1207,10807,2604],{"class":1620},[1207,10809,2989],{"class":1632},[1207,10811,1965],{"class":1964},[1207,10813,2133],{"class":1224},[1207,10815,1965],{"class":1964},[1207,10817,3010],{"class":1632},[1207,10819,3850],{"class":2163},[1207,10821,3853],{"class":2163},[1207,10823,3856],{"class":2813},[1207,10825,10826,10828,10830,10832,10834,10836,10838,10840,10842],{"class":1209,"line":2759},[1207,10827,2153],{"class":1616},[1207,10829,2604],{"class":1620},[1207,10831,2989],{"class":1632},[1207,10833,1965],{"class":1964},[1207,10835,9888],{"class":1224},[1207,10837,1965],{"class":1964},[1207,10839,3010],{"class":1632},[1207,10841,3850],{"class":2163},[1207,10843,2911],{"class":2813},[1207,10845,10846],{"class":1209,"line":2781},[1207,10847,1527],{"emptyLinePlaceholder":1526},[1207,10849,10850,10852,10855,10857,10859,10861,10863],{"class":1209,"line":2820},[1207,10851,9532],{"class":1735},[1207,10853,10854],{"class":1794}," test_get_user_not_found_contract",[1207,10856,1811],{"class":1632},[1207,10858,9700],{"class":2051},[1207,10860,1644],{"class":1632},[1207,10862,9637],{"class":2051},[1207,10864,1818],{"class":1632},[1207,10866,10867],{"class":1209,"line":2825},[1207,10868,1750],{"class":1749},[1207,10870,10871],{"class":1209,"line":2830},[1207,10872,10873],{"class":1756},"    Test contract for user not found scenario\n",[1207,10875,10876],{"class":1209,"line":2846},[1207,10877,1763],{"class":1756},[1207,10879,10880],{"class":1209,"line":2861},[1207,10881,10882],{"class":1756},"    It's important to test error cases too, so both services\n",[1207,10884,10885],{"class":1209,"line":2884},[1207,10886,10887],{"class":1756},"    agree on how errors are handled.\n",[1207,10889,10890],{"class":1209,"line":2889},[1207,10891,1750],{"class":1749},[1207,10893,10894,10897,10899],{"class":1209,"line":2894},[1207,10895,10896],{"class":1620},"    expected_error ",[1207,10898,1961],{"class":1632},[1207,10900,2445],{"class":1632},[1207,10902,10903,10905,10908,10910,10912,10914,10917,10919],{"class":1209,"line":2900},[1207,10904,9762],{"class":1964},[1207,10906,10907],{"class":1224},"error",[1207,10909,1965],{"class":1964},[1207,10911,2458],{"class":1632},[1207,10913,2188],{"class":1964},[1207,10915,10916],{"class":1224},"User not found",[1207,10918,1965],{"class":1964},[1207,10920,1973],{"class":1632},[1207,10922,10923,10925,10927,10929,10931,10933,10936,10938],{"class":1209,"line":2914},[1207,10924,9762],{"class":1964},[1207,10926,1204],{"class":1224},[1207,10928,1965],{"class":1964},[1207,10930,2458],{"class":1632},[1207,10932,2188],{"class":1964},[1207,10934,10935],{"class":1224},"USER_NOT_FOUND",[1207,10937,1965],{"class":1964},[1207,10939,1973],{"class":1632},[1207,10941,10942,10944,10947,10949,10951,10953,10955,10957,10960,10962],{"class":1209,"line":2919},[1207,10943,9762],{"class":1964},[1207,10945,10946],{"class":1224},"detail",[1207,10948,1965],{"class":1964},[1207,10950,2458],{"class":1632},[1207,10952,9470],{"class":1862},[1207,10954,1811],{"class":1632},[1207,10956,1965],{"class":1964},[1207,10958,10959],{"class":1224},"User with ID 999 does not exist",[1207,10961,1965],{"class":1964},[1207,10963,2136],{"class":1632},[1207,10965,10966],{"class":1209,"line":2925},[1207,10967,10004],{"class":1632},[1207,10969,10970],{"class":1209,"line":2945},[1207,10971,1763],{"class":1620},[1207,10973,10974,10976],{"class":1209,"line":2950},[1207,10975,10018],{"class":1632},[1207,10977,10021],{"class":1620},[1207,10979,10980,10982,10984,10986,10988,10990,10992],{"class":1209,"line":2956},[1207,10981,10026],{"class":1632},[1207,10983,10029],{"class":1862},[1207,10985,1811],{"class":1632},[1207,10987,1965],{"class":1964},[1207,10989,10959],{"class":1224},[1207,10991,1965],{"class":1964},[1207,10993,2136],{"class":1632},[1207,10995,10996,10998,11000,11002,11004,11007,11009],{"class":1209,"line":2971},[1207,10997,10026],{"class":1632},[1207,10999,10050],{"class":1862},[1207,11001,1811],{"class":1632},[1207,11003,1965],{"class":1964},[1207,11005,11006],{"class":1224},"a request for non-existent user",[1207,11008,1965],{"class":1964},[1207,11010,2136],{"class":1632},[1207,11012,11013,11015,11017,11019,11021,11023,11025,11027,11029,11032,11034],{"class":1209,"line":3016},[1207,11014,10026],{"class":1632},[1207,11016,10071],{"class":1862},[1207,11018,1811],{"class":1632},[1207,11020,1965],{"class":1964},[1207,11022,10078],{"class":1224},[1207,11024,1965],{"class":1964},[1207,11026,1644],{"class":1632},[1207,11028,2188],{"class":1964},[1207,11030,11031],{"class":1224},"/api/users/999/",[1207,11033,1965],{"class":1964},[1207,11035,2136],{"class":1632},[1207,11037,11038,11040,11042,11044,11047,11049,11051,11053,11056],{"class":1209,"line":5981},[1207,11039,10026],{"class":1632},[1207,11041,10101],{"class":1862},[1207,11043,1811],{"class":1632},[1207,11045,11046],{"class":1231},"404",[1207,11048,1644],{"class":1632},[1207,11050,10110],{"class":1957},[1207,11052,1961],{"class":1632},[1207,11054,11055],{"class":1862},"expected_error",[1207,11057,6978],{"class":1632},[1207,11059,11060],{"class":1209,"line":5987},[1207,11061,1763],{"class":1620},[1207,11063,11064,11066,11068],{"class":1209,"line":5992},[1207,11065,10135],{"class":1616},[1207,11067,9535],{"class":1620},[1207,11069,1743],{"class":1632},[1207,11071,11072],{"class":1209,"line":6003},[1207,11073,11074],{"class":1213},"        # This should raise an exception or return an error response\n",[1207,11076,11077,11080],{"class":1209,"line":6008},[1207,11078,11079],{"class":1616},"        try",[1207,11081,1743],{"class":1632},[1207,11083,11084,11087,11089,11091,11093,11096],{"class":1209,"line":6014},[1207,11085,11086],{"class":1620},"            user_service_client",[1207,11088,1633],{"class":1632},[1207,11090,10157],{"class":1862},[1207,11092,1811],{"class":1632},[1207,11094,11095],{"class":1231},"999",[1207,11097,2136],{"class":1632},[1207,11099,11100,11102,11105,11107,11110,11113],{"class":1209,"line":6030},[1207,11101,5862],{"class":1616},[1207,11103,11104],{"class":2813}," False",[1207,11106,1644],{"class":1632},[1207,11108,11109],{"class":1964}," \"",[1207,11111,11112],{"class":1224},"Expected an exception for non-existent user",[1207,11114,11115],{"class":1964},"\"\n",[1207,11117,11118,11121,11124,11127,11130],{"class":1209,"line":6050},[1207,11119,11120],{"class":1616},"        except",[1207,11122,11123],{"class":1620}," UserNotFoundError ",[1207,11125,11126],{"class":1616},"as",[1207,11128,11129],{"class":1620}," e",[1207,11131,1743],{"class":1632},[1207,11133,11134,11136,11138,11140,11142,11144,11146,11148],{"class":1209,"line":6070},[1207,11135,5862],{"class":1616},[1207,11137,11129],{"class":1620},[1207,11139,1633],{"class":1632},[1207,11141,1204],{"class":1942},[1207,11143,2164],{"class":2163},[1207,11145,2188],{"class":1964},[1207,11147,10935],{"class":1224},[1207,11149,2006],{"class":1964},[1207,11151,11152],{"class":1209,"line":6089},[1207,11153,1527],{"emptyLinePlaceholder":1526},[1207,11155,11156,11158,11161,11163,11165,11167,11169],{"class":1209,"line":6102},[1207,11157,9532],{"class":1735},[1207,11159,11160],{"class":1794}," test_user_list_with_pagination_contract",[1207,11162,1811],{"class":1632},[1207,11164,9700],{"class":2051},[1207,11166,1644],{"class":1632},[1207,11168,9637],{"class":2051},[1207,11170,1818],{"class":1632},[1207,11172,11173],{"class":1209,"line":6122},[1207,11174,1750],{"class":1749},[1207,11176,11177],{"class":1209,"line":6140},[1207,11178,11179],{"class":1756},"    Test contract for paginated user list\n",[1207,11181,11182],{"class":1209,"line":6145},[1207,11183,1763],{"class":1756},[1207,11185,11186],{"class":1209,"line":6151},[1207,11187,11188],{"class":1756},"    This shows how to test more complex response structures\n",[1207,11190,11191],{"class":1209,"line":6156},[1207,11192,11193],{"class":1756},"    like paginated lists.\n",[1207,11195,11196],{"class":1209,"line":6162},[1207,11197,1750],{"class":1749},[1207,11199,11200,11202,11204],{"class":1209,"line":6189},[1207,11201,10416],{"class":1620},[1207,11203,1961],{"class":1632},[1207,11205,2445],{"class":1632},[1207,11207,11208,11210,11212,11214,11216,11218,11220,11223,11225],{"class":1209,"line":6208},[1207,11209,9762],{"class":1964},[1207,11211,7992],{"class":1224},[1207,11213,1965],{"class":1964},[1207,11215,2458],{"class":1632},[1207,11217,9470],{"class":1862},[1207,11219,1811],{"class":1632},[1207,11221,11222],{"class":1231},"100",[1207,11224,9777],{"class":1632},[1207,11226,11227],{"class":1213},"               # Total number of users\n",[1207,11229,11230,11232,11234,11236,11238,11240,11242,11244,11247,11249],{"class":1209,"line":6228},[1207,11231,9762],{"class":1964},[1207,11233,8771],{"class":1224},[1207,11235,1965],{"class":1964},[1207,11237,2458],{"class":1632},[1207,11239,9470],{"class":1862},[1207,11241,1811],{"class":1632},[1207,11243,1965],{"class":1964},[1207,11245,11246],{"class":1224},"http://example.com/api/users/?page=2",[1207,11248,1965],{"class":1964},[1207,11250,7386],{"class":1632},[1207,11252,11253,11255,11257,11259,11261,11263,11265],{"class":1209,"line":6241},[1207,11254,9762],{"class":1964},[1207,11256,8787],{"class":1224},[1207,11258,1965],{"class":1964},[1207,11260,2458],{"class":1632},[1207,11262,8877],{"class":2813},[1207,11264,1644],{"class":1632},[1207,11266,11267],{"class":1213},"                 # First page has no previous\n",[1207,11269,11270,11272,11274,11276,11278],{"class":1209,"line":6261},[1207,11271,9762],{"class":1964},[1207,11273,7042],{"class":1224},[1207,11275,1965],{"class":1964},[1207,11277,2458],{"class":1632},[1207,11279,5664],{"class":1632},[1207,11281,11282],{"class":1209,"line":6279},[1207,11283,5669],{"class":1632},[1207,11285,11286,11288,11290,11292,11294,11296,11298,11300],{"class":1209,"line":6284},[1207,11287,4969],{"class":1964},[1207,11289,2133],{"class":1224},[1207,11291,1965],{"class":1964},[1207,11293,2458],{"class":1632},[1207,11295,9470],{"class":1862},[1207,11297,1811],{"class":1632},[1207,11299,2998],{"class":1231},[1207,11301,7386],{"class":1632},[1207,11303,11304,11306,11308,11310,11312,11314,11316,11318,11321,11323],{"class":1209,"line":6289},[1207,11305,4969],{"class":1964},[1207,11307,2183],{"class":1224},[1207,11309,1965],{"class":1964},[1207,11311,2458],{"class":1632},[1207,11313,9470],{"class":1862},[1207,11315,1811],{"class":1632},[1207,11317,1965],{"class":1964},[1207,11319,11320],{"class":1224},"user1",[1207,11322,1965],{"class":1964},[1207,11324,7386],{"class":1632},[1207,11326,11327,11329,11331,11333,11335,11337,11339,11341,11344,11346],{"class":1209,"line":6294},[1207,11328,4969],{"class":1964},[1207,11330,2204],{"class":1224},[1207,11332,1965],{"class":1964},[1207,11334,2458],{"class":1632},[1207,11336,9470],{"class":1862},[1207,11338,1811],{"class":1632},[1207,11340,1965],{"class":1964},[1207,11342,11343],{"class":1224},"user1@example.com",[1207,11345,1965],{"class":1964},[1207,11347,7386],{"class":1632},[1207,11349,11350,11352,11354,11356,11358,11360,11362,11364],{"class":1209,"line":6300},[1207,11351,4969],{"class":1964},[1207,11353,9888],{"class":1224},[1207,11355,1965],{"class":1964},[1207,11357,2458],{"class":1632},[1207,11359,9470],{"class":1862},[1207,11361,1811],{"class":1632},[1207,11363,9899],{"class":2813},[1207,11365,2136],{"class":1632},[1207,11367,11368],{"class":1209,"line":6320},[1207,11369,11370],{"class":1632},"            },\n",[1207,11372,11373],{"class":1209,"line":6339},[1207,11374,5669],{"class":1632},[1207,11376,11377,11379,11381,11383,11385,11387,11389,11391],{"class":1209,"line":6344},[1207,11378,4969],{"class":1964},[1207,11380,2133],{"class":1224},[1207,11382,1965],{"class":1964},[1207,11384,2458],{"class":1632},[1207,11386,9470],{"class":1862},[1207,11388,1811],{"class":1632},[1207,11390,10437],{"class":1231},[1207,11392,7386],{"class":1632},[1207,11394,11395,11397,11399,11401,11403,11405,11407,11409,11412,11414],{"class":1209,"line":6350},[1207,11396,4969],{"class":1964},[1207,11398,2183],{"class":1224},[1207,11400,1965],{"class":1964},[1207,11402,2458],{"class":1632},[1207,11404,9470],{"class":1862},[1207,11406,1811],{"class":1632},[1207,11408,1965],{"class":1964},[1207,11410,11411],{"class":1224},"user2",[1207,11413,1965],{"class":1964},[1207,11415,7386],{"class":1632},[1207,11417,11418,11420,11422,11424,11426,11428,11430,11432,11435,11437],{"class":1209,"line":6366},[1207,11419,4969],{"class":1964},[1207,11421,2204],{"class":1224},[1207,11423,1965],{"class":1964},[1207,11425,2458],{"class":1632},[1207,11427,9470],{"class":1862},[1207,11429,1811],{"class":1632},[1207,11431,1965],{"class":1964},[1207,11433,11434],{"class":1224},"user2@example.com",[1207,11436,1965],{"class":1964},[1207,11438,7386],{"class":1632},[1207,11440,11441,11443,11445,11447,11449,11451,11453,11455],{"class":1209,"line":6389},[1207,11442,4969],{"class":1964},[1207,11444,9888],{"class":1224},[1207,11446,1965],{"class":1964},[1207,11448,2458],{"class":1632},[1207,11450,9470],{"class":1862},[1207,11452,1811],{"class":1632},[1207,11454,9899],{"class":2813},[1207,11456,2136],{"class":1632},[1207,11458,11459],{"class":1209,"line":6412},[1207,11460,5006],{"class":1632},[1207,11462,11463],{"class":1209,"line":6417},[1207,11464,5766],{"class":1632},[1207,11466,11467],{"class":1209,"line":6423},[1207,11468,10004],{"class":1632},[1207,11470,11471],{"class":1209,"line":6468},[1207,11472,1763],{"class":1620},[1207,11474,11475,11477],{"class":1209,"line":6487},[1207,11476,10018],{"class":1632},[1207,11478,10021],{"class":1620},[1207,11480,11481,11483,11485,11487,11489,11492,11494],{"class":1209,"line":8226},[1207,11482,10026],{"class":1632},[1207,11484,10029],{"class":1862},[1207,11486,1811],{"class":1632},[1207,11488,1965],{"class":1964},[1207,11490,11491],{"class":1224},"Multiple users exist",[1207,11493,1965],{"class":1964},[1207,11495,2136],{"class":1632},[1207,11497,11498,11500,11502,11504,11506,11509,11511],{"class":1209,"line":8239},[1207,11499,10026],{"class":1632},[1207,11501,10050],{"class":1862},[1207,11503,1811],{"class":1632},[1207,11505,1965],{"class":1964},[1207,11507,11508],{"class":1224},"a request for user list",[1207,11510,1965],{"class":1964},[1207,11512,2136],{"class":1632},[1207,11514,11515,11517,11519,11521,11523,11525,11527,11529,11531,11533,11535,11537,11540,11542,11544,11547,11549,11551,11553,11555,11557,11559,11561,11564,11566,11568,11570,11573,11575],{"class":1209,"line":8244},[1207,11516,10026],{"class":1632},[1207,11518,10071],{"class":1862},[1207,11520,1811],{"class":1632},[1207,11522,1965],{"class":1964},[1207,11524,10078],{"class":1224},[1207,11526,1965],{"class":1964},[1207,11528,1644],{"class":1632},[1207,11530,2188],{"class":1964},[1207,11532,10693],{"class":1224},[1207,11534,1965],{"class":1964},[1207,11536,1644],{"class":1632},[1207,11538,11539],{"class":1957}," query",[1207,11541,8186],{"class":1632},[1207,11543,1965],{"class":1964},[1207,11545,11546],{"class":1224},"page",[1207,11548,1965],{"class":1964},[1207,11550,2458],{"class":1632},[1207,11552,2188],{"class":1964},[1207,11554,2998],{"class":1224},[1207,11556,1965],{"class":1964},[1207,11558,1644],{"class":1632},[1207,11560,2188],{"class":1964},[1207,11562,11563],{"class":1224},"page_size",[1207,11565,1965],{"class":1964},[1207,11567,2458],{"class":1632},[1207,11569,2188],{"class":1964},[1207,11571,11572],{"class":1224},"20",[1207,11574,1965],{"class":1964},[1207,11576,8531],{"class":1632},[1207,11578,11579,11581,11583,11585,11587,11589,11591,11593,11595],{"class":1209,"line":8249},[1207,11580,10026],{"class":1632},[1207,11582,10101],{"class":1862},[1207,11584,1811],{"class":1632},[1207,11586,3564],{"class":1231},[1207,11588,1644],{"class":1632},[1207,11590,10110],{"class":1957},[1207,11592,1961],{"class":1632},[1207,11594,10728],{"class":1862},[1207,11596,6978],{"class":1632},[1207,11598,11599],{"class":1209,"line":8255},[1207,11600,1763],{"class":1620},[1207,11602,11603,11605,11607],{"class":1209,"line":8274},[1207,11604,10135],{"class":1616},[1207,11606,9535],{"class":1620},[1207,11608,1743],{"class":1632},[1207,11610,11611,11613,11615,11617,11619,11622,11624,11626,11628,11630,11632,11635,11637,11639],{"class":1209,"line":8279},[1207,11612,6953],{"class":1620},[1207,11614,1961],{"class":1632},[1207,11616,9637],{"class":1620},[1207,11618,1633],{"class":1632},[1207,11620,11621],{"class":1862},"get_users",[1207,11623,1811],{"class":1632},[1207,11625,11546],{"class":1957},[1207,11627,1961],{"class":1632},[1207,11629,2998],{"class":1231},[1207,11631,1644],{"class":1632},[1207,11633,11634],{"class":1957}," page_size",[1207,11636,1961],{"class":1632},[1207,11638,11572],{"class":1231},[1207,11640,2136],{"class":1632},[1207,11642,11643],{"class":1209,"line":8294},[1207,11644,1836],{"class":1620},[1207,11646,11647,11649,11651,11653,11655,11657],{"class":1209,"line":8319},[1207,11648,2153],{"class":1616},[1207,11650,2188],{"class":1964},[1207,11652,7042],{"class":1224},[1207,11654,1965],{"class":1964},[1207,11656,2983],{"class":2163},[1207,11658,11659],{"class":1620}," response\n",[1207,11661,11662,11664,11666,11668,11670,11672],{"class":1209,"line":8344},[1207,11663,2153],{"class":1616},[1207,11665,2188],{"class":1964},[1207,11667,7992],{"class":1224},[1207,11669,1965],{"class":1964},[1207,11671,2983],{"class":2163},[1207,11673,11659],{"class":1620},[1207,11675,11676,11678,11680,11682,11685,11687,11689,11691,11693,11695,11698],{"class":1209,"line":8349},[1207,11677,2153],{"class":1616},[1207,11679,5812],{"class":5160},[1207,11681,1811],{"class":1632},[1207,11683,11684],{"class":1862},"response",[1207,11686,2989],{"class":1632},[1207,11688,1965],{"class":1964},[1207,11690,7042],{"class":1224},[1207,11692,1965],{"class":1964},[1207,11694,7074],{"class":1632},[1207,11696,11697],{"class":2163}," >=",[1207,11699,11700],{"class":1231}," 1\n",[1026,11702,11703],{},[1045,11704,11705],{},"Key Contract Testing Concepts:",[1123,11707,11708,11714,11720,11726,11732],{},[1084,11709,11710,11713],{},[1045,11711,11712],{},"Like() vs Exact Values",": Use Like() for values that can vary (IDs, timestamps) and exact values for fixed data",[1084,11715,11716,11719],{},[1045,11717,11718],{},"Provider States",": Describe the state the provider should be in for the test",[1084,11721,11722,11725],{},[1045,11723,11724],{},"Request Matching",": Define exactly what request format you expect",[1084,11727,11728,11731],{},[1045,11729,11730],{},"Response Validation",": Verify the response structure and types",[1084,11733,11734,11737],{},[1045,11735,11736],{},"Error Scenarios",": Test error cases to ensure consistent error handling",[1038,11739,11741],{"id":11740},"provider-side-contract-verification","Provider Side Contract Verification",[1026,11743,11744],{},"The provider side (User Service) needs to verify that it can fulfill all the contracts that consumers have defined. This ensures that when you make changes to your service, you don't break existing consumers.",[1197,11746,11748],{"className":1602,"code":11747,"language":1604,"meta":1202,"style":1202},"# user_service/tests/test_contract_provider.py\nimport pytest\nfrom pact import Verifier\nfrom django.test import override_settings\nfrom django.contrib.auth.models import User\nfrom user_service.tests.factories import UserFactory\n\ndef test_user_service_provider_contract():\n    \"\"\"\n    Verify that User Service fulfills the contract\n    \n    This test runs on the provider side (User Service) and verifies\n    that the service can fulfill all the contracts that consumers\n    have defined.\n    \"\"\"\n    # Create a Pact verifier\n    verifier = Verifier(\n        provider='UserService',                    # Name of this service\n        provider_base_url='http://localhost:8000'  # URL where service is running\n    )\n    \n    # Define provider states - these set up the data needed for each test\n    provider_states = {\n        'User with ID 1 exists': setup_user_exists,\n        'User service is available': setup_service_available,\n        'Multiple users exist': setup_multiple_users,\n        'User with ID 999 does not exist': setup_user_not_exists\n    }\n    \n    # Verify the contracts\n    # This will:\n    # 1. Read the contract file generated by consumer tests\n    # 2. Make requests to your running service\n    # 3. Verify the responses match what consumers expect\n    success, logs = verifier.verify_pacts(\n        './pacts/orderservice-userservice.json',  # Contract file location\n        provider_states_setup_url='http://localhost:8000/api/provider-states/',\n        provider_states=provider_states,\n        verbose=True  # Show detailed logs\n    )\n    \n    # Assert that all contract verifications passed\n    assert success, f\"Contract verification failed: {logs}\"\n\ndef setup_user_exists():\n    \"\"\"\n    Set up test data for 'User with ID 1 exists' state\n    \n    This function is called before tests that require a user with ID 1.\n    It ensures the database is in the correct state for the test.\n    \"\"\"\n    # Clean up any existing data\n    User.objects.filter(id=1).delete()\n    \n    # Create the required user\n    UserFactory(\n        id=1, \n        username='testuser', \n        email='test@example.com',\n        first_name='Test',\n        last_name='User',\n        is_active=True\n    )\n    \n    return {'message': 'User with ID 1 created'}\n\ndef setup_service_available():\n    \"\"\"\n    Set up test data for 'User service is available' state\n    \n    This ensures the service is ready to handle user creation requests.\n    \"\"\"\n    # Ensure database is clean and ready\n    # You might want to clear any test data that could interfere\n    return {'message': 'Service is ready'}\n\ndef setup_multiple_users():\n    \"\"\"\n    Set up test data for 'Multiple users exist' state\n    \n    This creates multiple users for pagination tests.\n    \"\"\"\n    # Clear existing users\n    User.objects.all().delete()\n    \n    # Create multiple users\n    users = []\n    for i in range(1, 101):  # Create 100 users\n        user = UserFactory(\n            username=f'user{i}',\n            email=f'user{i}@example.com',\n            is_active=True\n        )\n        users.append(user)\n    \n    return {'message': f'Created {len(users)} users'}\n\ndef setup_user_not_exists():\n    \"\"\"\n    Set up test data for 'User with ID 999 does not exist' state\n    \n    This ensures that user with ID 999 doesn't exist for error testing.\n    \"\"\"\n    # Make sure user 999 doesn't exist\n    User.objects.filter(id=999).delete()\n    \n    return {'message': 'User with ID 999 does not exist'}\n\n# Provider states endpoint\n# This is a special endpoint that Pact calls to set up test data\nfrom django.http import JsonResponse\nfrom django.views.decorators.csrf import csrf_exempt\nfrom django.views.decorators.http import require_http_methods\nimport json\n\n@csrf_exempt\n@require_http_methods([\"POST\"])\ndef provider_states_endpoint(request):\n    \"\"\"\n    Endpoint for setting up provider states during contract verification\n    \n    Pact calls this endpoint before each test to set up the required\n    data state. The request contains the state name, and this endpoint\n    calls the appropriate setup function.\n    \"\"\"\n    try:\n        data = json.loads(request.body)\n        state = data.get('state')\n        \n        # Map of state names to setup functions\n        state_handlers = {\n            'User with ID 1 exists': setup_user_exists,\n            'User service is available': setup_service_available,\n            'Multiple users exist': setup_multiple_users,\n            'User with ID 999 does not exist': setup_user_not_exists,\n        }\n        \n        handler = state_handlers.get(state)\n        if handler:\n            result = handler()\n            return JsonResponse(result)\n        else:\n            return JsonResponse(\n                {'error': f'Unknown state: {state}'}, \n                status=400\n            )\n            \n    except Exception as e:\n        return JsonResponse(\n            {'error': str(e)}, \n            status=500\n        )\n\n# Add this to your URLs\n# urls.py\nfrom django.urls import path\nfrom . import views\n\nurlpatterns = [\n    # ... your other URLs\n    path('api/provider-states/', views.provider_states_endpoint, name='provider-states'),\n]\n",[1204,11749,11750,11755,11761,11772,11787,11809,11827,11831,11840,11844,11849,11853,11858,11863,11868,11872,11877,11889,11907,11924,11929,11933,11938,11947,11962,11977,11992,12005,12009,12013,12018,12023,12028,12033,12038,12060,12074,12090,12102,12114,12118,12122,12127,12151,12155,12163,12167,12172,12176,12181,12186,12190,12195,12223,12227,12232,12239,12252,12269,12284,12299,12314,12324,12328,12332,12356,12360,12368,12372,12377,12381,12386,12390,12395,12400,12423,12427,12435,12439,12444,12448,12453,12457,12462,12482,12486,12491,12501,12527,12537,12559,12579,12588,12592,12608,12612,12650,12654,12663,12667,12672,12676,12681,12685,12690,12716,12720,12742,12746,12751,12756,12772,12798,12821,12827,12831,12838,12857,12871,12875,12880,12884,12889,12894,12899,12903,12910,12935,12959,12963,12968,12977,12991,13005,13019,13033,13037,13041,13061,13071,13082,13097,13104,13112,13143,13153,13158,13163,13178,13186,13210,13220,13224,13228,13233,13238,13253,13266,13270,13279,13284,13324],{"__ignoreMap":1202},[1207,11751,11752],{"class":1209,"line":1210},[1207,11753,11754],{"class":1213},"# user_service/tests/test_contract_provider.py\n",[1207,11756,11757,11759],{"class":1209,"line":1217},[1207,11758,1617],{"class":1616},[1207,11760,1621],{"class":1620},[1207,11762,11763,11765,11767,11769],{"class":1209,"line":1238},[1207,11764,1626],{"class":1616},[1207,11766,9455],{"class":1620},[1207,11768,1617],{"class":1616},[1207,11770,11771],{"class":1620}," Verifier\n",[1207,11773,11774,11776,11778,11780,11782,11784],{"class":1209,"line":1254},[1207,11775,1626],{"class":1616},[1207,11777,1654],{"class":1620},[1207,11779,1633],{"class":1632},[1207,11781,1659],{"class":1620},[1207,11783,1617],{"class":1616},[1207,11785,11786],{"class":1620}," override_settings\n",[1207,11788,11789,11791,11793,11795,11797,11799,11801,11803,11805,11807],{"class":1209,"line":1270},[1207,11790,1626],{"class":1616},[1207,11792,1654],{"class":1620},[1207,11794,1633],{"class":1632},[1207,11796,1675],{"class":1620},[1207,11798,1633],{"class":1632},[1207,11800,1680],{"class":1620},[1207,11802,1633],{"class":1632},[1207,11804,1685],{"class":1620},[1207,11806,1617],{"class":1616},[1207,11808,1690],{"class":1620},[1207,11810,11811,11813,11815,11817,11819,11821,11823,11825],{"class":1209,"line":1535},[1207,11812,1626],{"class":1616},[1207,11814,1697],{"class":1620},[1207,11816,1633],{"class":1632},[1207,11818,3684],{"class":1620},[1207,11820,1633],{"class":1632},[1207,11822,3689],{"class":1620},[1207,11824,1617],{"class":1616},[1207,11826,6674],{"class":1620},[1207,11828,11829],{"class":1209,"line":1710},[1207,11830,1527],{"emptyLinePlaceholder":1526},[1207,11832,11833,11835,11838],{"class":1209,"line":1727},[1207,11834,9532],{"class":1735},[1207,11836,11837],{"class":1794}," test_user_service_provider_contract",[1207,11839,9538],{"class":1632},[1207,11841,11842],{"class":1209,"line":1732},[1207,11843,1750],{"class":1749},[1207,11845,11846],{"class":1209,"line":1746},[1207,11847,11848],{"class":1756},"    Verify that User Service fulfills the contract\n",[1207,11850,11851],{"class":1209,"line":1753},[1207,11852,1763],{"class":1756},[1207,11854,11855],{"class":1209,"line":1760},[1207,11856,11857],{"class":1756},"    This test runs on the provider side (User Service) and verifies\n",[1207,11859,11860],{"class":1209,"line":1766},[1207,11861,11862],{"class":1756},"    that the service can fulfill all the contracts that consumers\n",[1207,11864,11865],{"class":1209,"line":1772},[1207,11866,11867],{"class":1756},"    have defined.\n",[1207,11869,11870],{"class":1209,"line":1778},[1207,11871,1750],{"class":1749},[1207,11873,11874],{"class":1209,"line":1783},[1207,11875,11876],{"class":1213},"    # Create a Pact verifier\n",[1207,11878,11879,11882,11884,11887],{"class":1209,"line":1788},[1207,11880,11881],{"class":1620},"    verifier ",[1207,11883,1961],{"class":1632},[1207,11885,11886],{"class":1862}," Verifier",[1207,11888,1951],{"class":1632},[1207,11890,11891,11894,11896,11898,11900,11902,11904],{"class":1209,"line":1803},[1207,11892,11893],{"class":1957},"        provider",[1207,11895,1961],{"class":1632},[1207,11897,1965],{"class":1964},[1207,11899,9598],{"class":1224},[1207,11901,1965],{"class":1964},[1207,11903,1644],{"class":1632},[1207,11905,11906],{"class":1213},"                    # Name of this service\n",[1207,11908,11909,11912,11914,11916,11919,11921],{"class":1209,"line":1821},[1207,11910,11911],{"class":1957},"        provider_base_url",[1207,11913,1961],{"class":1632},[1207,11915,1965],{"class":1964},[1207,11917,11918],{"class":1224},"http://localhost:8000",[1207,11920,1965],{"class":1964},[1207,11922,11923],{"class":1213},"  # URL where service is running\n",[1207,11925,11926],{"class":1209,"line":1827},[1207,11927,11928],{"class":1632},"    )\n",[1207,11930,11931],{"class":1209,"line":1833},[1207,11932,1763],{"class":1620},[1207,11934,11935],{"class":1209,"line":1839},[1207,11936,11937],{"class":1213},"    # Define provider states - these set up the data needed for each test\n",[1207,11939,11940,11943,11945],{"class":1209,"line":1845},[1207,11941,11942],{"class":1620},"    provider_states ",[1207,11944,1961],{"class":1632},[1207,11946,2445],{"class":1632},[1207,11948,11949,11951,11953,11955,11957,11960],{"class":1209,"line":1851},[1207,11950,9762],{"class":1964},[1207,11952,10036],{"class":1224},[1207,11954,1965],{"class":1964},[1207,11956,2458],{"class":1632},[1207,11958,11959],{"class":1620}," setup_user_exists",[1207,11961,1973],{"class":1632},[1207,11963,11964,11966,11968,11970,11972,11975],{"class":1209,"line":1856},[1207,11965,9762],{"class":1964},[1207,11967,10644],{"class":1224},[1207,11969,1965],{"class":1964},[1207,11971,2458],{"class":1632},[1207,11973,11974],{"class":1620}," setup_service_available",[1207,11976,1973],{"class":1632},[1207,11978,11979,11981,11983,11985,11987,11990],{"class":1209,"line":1869},[1207,11980,9762],{"class":1964},[1207,11982,11491],{"class":1224},[1207,11984,1965],{"class":1964},[1207,11986,2458],{"class":1632},[1207,11988,11989],{"class":1620}," setup_multiple_users",[1207,11991,1973],{"class":1632},[1207,11993,11994,11996,11998,12000,12002],{"class":1209,"line":1874},[1207,11995,9762],{"class":1964},[1207,11997,10959],{"class":1224},[1207,11999,1965],{"class":1964},[1207,12001,2458],{"class":1632},[1207,12003,12004],{"class":1620}," setup_user_not_exists\n",[1207,12006,12007],{"class":1209,"line":1885},[1207,12008,10004],{"class":1632},[1207,12010,12011],{"class":1209,"line":1899},[1207,12012,1763],{"class":1620},[1207,12014,12015],{"class":1209,"line":1904},[1207,12016,12017],{"class":1213},"    # Verify the contracts\n",[1207,12019,12020],{"class":1209,"line":1910},[1207,12021,12022],{"class":1213},"    # This will:\n",[1207,12024,12025],{"class":1209,"line":1915},[1207,12026,12027],{"class":1213},"    # 1. Read the contract file generated by consumer tests\n",[1207,12029,12030],{"class":1209,"line":1921},[1207,12031,12032],{"class":1213},"    # 2. Make requests to your running service\n",[1207,12034,12035],{"class":1209,"line":1927},[1207,12036,12037],{"class":1213},"    # 3. Verify the responses match what consumers expect\n",[1207,12039,12040,12043,12045,12048,12050,12053,12055,12058],{"class":1209,"line":1932},[1207,12041,12042],{"class":1620},"    success",[1207,12044,1644],{"class":1632},[1207,12046,12047],{"class":1620}," logs ",[1207,12049,1961],{"class":1632},[1207,12051,12052],{"class":1620}," verifier",[1207,12054,1633],{"class":1632},[1207,12056,12057],{"class":1862},"verify_pacts",[1207,12059,1951],{"class":1632},[1207,12061,12062,12064,12067,12069,12071],{"class":1209,"line":1954},[1207,12063,9762],{"class":1964},[1207,12065,12066],{"class":1224},"./pacts/orderservice-userservice.json",[1207,12068,1965],{"class":1964},[1207,12070,1644],{"class":1632},[1207,12072,12073],{"class":1213},"  # Contract file location\n",[1207,12075,12076,12079,12081,12083,12086,12088],{"class":1209,"line":1976},[1207,12077,12078],{"class":1957},"        provider_states_setup_url",[1207,12080,1961],{"class":1632},[1207,12082,1965],{"class":1964},[1207,12084,12085],{"class":1224},"http://localhost:8000/api/provider-states/",[1207,12087,1965],{"class":1964},[1207,12089,1973],{"class":1632},[1207,12091,12092,12095,12097,12100],{"class":1209,"line":1993},[1207,12093,12094],{"class":1957},"        provider_states",[1207,12096,1961],{"class":1632},[1207,12098,12099],{"class":1862},"provider_states",[1207,12101,1973],{"class":1632},[1207,12103,12104,12107,12109,12111],{"class":1209,"line":2009},[1207,12105,12106],{"class":1957},"        verbose",[1207,12108,1961],{"class":1632},[1207,12110,9899],{"class":2813},[1207,12112,12113],{"class":1213},"  # Show detailed logs\n",[1207,12115,12116],{"class":1209,"line":2015},[1207,12117,11928],{"class":1632},[1207,12119,12120],{"class":1209,"line":2020},[1207,12121,1763],{"class":1620},[1207,12123,12124],{"class":1209,"line":2037},[1207,12125,12126],{"class":1213},"    # Assert that all contract verifications passed\n",[1207,12128,12129,12132,12135,12137,12139,12142,12144,12147,12149],{"class":1209,"line":2060},[1207,12130,12131],{"class":1616},"    assert",[1207,12133,12134],{"class":1620}," success",[1207,12136,1644],{"class":1632},[1207,12138,3281],{"class":1735},[1207,12140,12141],{"class":1224},"\"Contract verification failed: ",[1207,12143,3288],{"class":3287},[1207,12145,12146],{"class":1620},"logs",[1207,12148,3294],{"class":3287},[1207,12150,11115],{"class":1224},[1207,12152,12153],{"class":1209,"line":2065},[1207,12154,1527],{"emptyLinePlaceholder":1526},[1207,12156,12157,12159,12161],{"class":1209,"line":2071},[1207,12158,9532],{"class":1735},[1207,12160,11959],{"class":1794},[1207,12162,9538],{"class":1632},[1207,12164,12165],{"class":1209,"line":2076},[1207,12166,1750],{"class":1749},[1207,12168,12169],{"class":1209,"line":2082},[1207,12170,12171],{"class":1756},"    Set up test data for 'User with ID 1 exists' state\n",[1207,12173,12174],{"class":1209,"line":2088},[1207,12175,1763],{"class":1756},[1207,12177,12178],{"class":1209,"line":2094},[1207,12179,12180],{"class":1756},"    This function is called before tests that require a user with ID 1.\n",[1207,12182,12183],{"class":1209,"line":2100},[1207,12184,12185],{"class":1756},"    It ensures the database is in the correct state for the test.\n",[1207,12187,12188],{"class":1209,"line":2105},[1207,12189,1750],{"class":1749},[1207,12191,12192],{"class":1209,"line":2111},[1207,12193,12194],{"class":1213},"    # Clean up any existing data\n",[1207,12196,12197,12200,12202,12204,12206,12208,12210,12212,12214,12216,12218,12221],{"class":1209,"line":2139},[1207,12198,12199],{"class":1620},"    User",[1207,12201,1633],{"class":1632},[1207,12203,1943],{"class":1942},[1207,12205,1633],{"class":1632},[1207,12207,5528],{"class":1862},[1207,12209,1811],{"class":1632},[1207,12211,2133],{"class":1957},[1207,12213,1961],{"class":1632},[1207,12215,2998],{"class":1231},[1207,12217,5543],{"class":1632},[1207,12219,12220],{"class":1862},"delete",[1207,12222,1866],{"class":1632},[1207,12224,12225],{"class":1209,"line":2144},[1207,12226,1763],{"class":1620},[1207,12228,12229],{"class":1209,"line":2150},[1207,12230,12231],{"class":1213},"    # Create the required user\n",[1207,12233,12234,12237],{"class":1209,"line":2174},[1207,12235,12236],{"class":1862},"    UserFactory",[1207,12238,1951],{"class":1632},[1207,12240,12241,12244,12246,12248,12250],{"class":1209,"line":2195},[1207,12242,12243],{"class":1957},"        id",[1207,12245,1961],{"class":1632},[1207,12247,2998],{"class":1231},[1207,12249,1644],{"class":1632},[1207,12251,2858],{"class":1862},[1207,12253,12254,12257,12259,12261,12263,12265,12267],{"class":1209,"line":2215},[1207,12255,12256],{"class":1957},"        username",[1207,12258,1961],{"class":1632},[1207,12260,1965],{"class":1964},[1207,12262,1968],{"class":1224},[1207,12264,1965],{"class":1964},[1207,12266,1644],{"class":1632},[1207,12268,2858],{"class":1862},[1207,12270,12271,12274,12276,12278,12280,12282],{"class":1209,"line":2220},[1207,12272,12273],{"class":1957},"        email",[1207,12275,1961],{"class":1632},[1207,12277,1965],{"class":1964},[1207,12279,1986],{"class":1224},[1207,12281,1965],{"class":1964},[1207,12283,1973],{"class":1632},[1207,12285,12286,12289,12291,12293,12295,12297],{"class":1209,"line":2235},[1207,12287,12288],{"class":1957},"        first_name",[1207,12290,1961],{"class":1632},[1207,12292,1965],{"class":1964},[1207,12294,9849],{"class":1224},[1207,12296,1965],{"class":1964},[1207,12298,1973],{"class":1632},[1207,12300,12301,12304,12306,12308,12310,12312],{"class":1209,"line":2253},[1207,12302,12303],{"class":1957},"        last_name",[1207,12305,1961],{"class":1632},[1207,12307,1965],{"class":1964},[1207,12309,2546],{"class":1224},[1207,12311,1965],{"class":1964},[1207,12313,1973],{"class":1632},[1207,12315,12316,12319,12321],{"class":1209,"line":2258},[1207,12317,12318],{"class":1957},"        is_active",[1207,12320,1961],{"class":1632},[1207,12322,12323],{"class":2813},"True\n",[1207,12325,12326],{"class":1209,"line":2264},[1207,12327,11928],{"class":1632},[1207,12329,12330],{"class":1209,"line":2269},[1207,12331,1763],{"class":1620},[1207,12333,12334,12336,12338,12340,12343,12345,12347,12349,12352,12354],{"class":1209,"line":2275},[1207,12335,9570],{"class":1616},[1207,12337,2801],{"class":1632},[1207,12339,1965],{"class":1964},[1207,12341,12342],{"class":1224},"message",[1207,12344,1965],{"class":1964},[1207,12346,2458],{"class":1632},[1207,12348,2188],{"class":1964},[1207,12350,12351],{"class":1224},"User with ID 1 created",[1207,12353,1965],{"class":1964},[1207,12355,2817],{"class":1632},[1207,12357,12358],{"class":1209,"line":2281},[1207,12359,1527],{"emptyLinePlaceholder":1526},[1207,12361,12362,12364,12366],{"class":1209,"line":2286},[1207,12363,9532],{"class":1735},[1207,12365,11974],{"class":1794},[1207,12367,9538],{"class":1632},[1207,12369,12370],{"class":1209,"line":2292},[1207,12371,1750],{"class":1749},[1207,12373,12374],{"class":1209,"line":2313},[1207,12375,12376],{"class":1756},"    Set up test data for 'User service is available' state\n",[1207,12378,12379],{"class":1209,"line":2334},[1207,12380,1763],{"class":1756},[1207,12382,12383],{"class":1209,"line":2339},[1207,12384,12385],{"class":1756},"    This ensures the service is ready to handle user creation requests.\n",[1207,12387,12388],{"class":1209,"line":2358},[1207,12389,1750],{"class":1749},[1207,12391,12392],{"class":1209,"line":2381},[1207,12393,12394],{"class":1213},"    # Ensure database is clean and ready\n",[1207,12396,12397],{"class":1209,"line":2386},[1207,12398,12399],{"class":1213},"    # You might want to clear any test data that could interfere\n",[1207,12401,12402,12404,12406,12408,12410,12412,12414,12416,12419,12421],{"class":1209,"line":2392},[1207,12403,9570],{"class":1616},[1207,12405,2801],{"class":1632},[1207,12407,1965],{"class":1964},[1207,12409,12342],{"class":1224},[1207,12411,1965],{"class":1964},[1207,12413,2458],{"class":1632},[1207,12415,2188],{"class":1964},[1207,12417,12418],{"class":1224},"Service is ready",[1207,12420,1965],{"class":1964},[1207,12422,2817],{"class":1632},[1207,12424,12425],{"class":1209,"line":2397},[1207,12426,1527],{"emptyLinePlaceholder":1526},[1207,12428,12429,12431,12433],{"class":1209,"line":2403},[1207,12430,9532],{"class":1735},[1207,12432,11989],{"class":1794},[1207,12434,9538],{"class":1632},[1207,12436,12437],{"class":1209,"line":2409},[1207,12438,1750],{"class":1749},[1207,12440,12441],{"class":1209,"line":2414},[1207,12442,12443],{"class":1756},"    Set up test data for 'Multiple users exist' state\n",[1207,12445,12446],{"class":1209,"line":2420},[1207,12447,1763],{"class":1756},[1207,12449,12450],{"class":1209,"line":2426},[1207,12451,12452],{"class":1756},"    This creates multiple users for pagination tests.\n",[1207,12454,12455],{"class":1209,"line":2431},[1207,12456,1750],{"class":1749},[1207,12458,12459],{"class":1209,"line":2437},[1207,12460,12461],{"class":1213},"    # Clear existing users\n",[1207,12463,12464,12466,12468,12470,12472,12475,12478,12480],{"class":1209,"line":2448},[1207,12465,12199],{"class":1620},[1207,12467,1633],{"class":1632},[1207,12469,1943],{"class":1942},[1207,12471,1633],{"class":1632},[1207,12473,12474],{"class":1862},"all",[1207,12476,12477],{"class":1632},"().",[1207,12479,12220],{"class":1862},[1207,12481,1866],{"class":1632},[1207,12483,12484],{"class":1209,"line":2470},[1207,12485,1763],{"class":1620},[1207,12487,12488],{"class":1209,"line":2490},[1207,12489,12490],{"class":1213},"    # Create multiple users\n",[1207,12492,12493,12496,12498],{"class":1209,"line":2511},[1207,12494,12495],{"class":1620},"    users ",[1207,12497,1961],{"class":1632},[1207,12499,12500],{"class":1632}," []\n",[1207,12502,12503,12506,12508,12510,12512,12514,12516,12518,12521,12524],{"class":1209,"line":2532},[1207,12504,12505],{"class":1616},"    for",[1207,12507,5749],{"class":1620},[1207,12509,5752],{"class":1616},[1207,12511,5755],{"class":5160},[1207,12513,1811],{"class":1632},[1207,12515,2998],{"class":1231},[1207,12517,1644],{"class":1632},[1207,12519,12520],{"class":1231}," 101",[1207,12522,12523],{"class":1632},"):",[1207,12525,12526],{"class":1213},"  # Create 100 users\n",[1207,12528,12529,12531,12533,12535],{"class":1209,"line":2551},[1207,12530,2570],{"class":1620},[1207,12532,1961],{"class":1632},[1207,12534,3172],{"class":1862},[1207,12536,1951],{"class":1632},[1207,12538,12539,12541,12543,12546,12549,12551,12553,12555,12557],{"class":1209,"line":2557},[1207,12540,1958],{"class":1957},[1207,12542,1961],{"class":1632},[1207,12544,12545],{"class":1735},"f",[1207,12547,12548],{"class":1224},"'user",[1207,12550,3288],{"class":3287},[1207,12552,5689],{"class":1862},[1207,12554,3294],{"class":3287},[1207,12556,1965],{"class":1224},[1207,12558,1973],{"class":1632},[1207,12560,12561,12563,12565,12567,12569,12571,12573,12575,12577],{"class":1209,"line":2562},[1207,12562,1979],{"class":1957},[1207,12564,1961],{"class":1632},[1207,12566,12545],{"class":1735},[1207,12568,12548],{"class":1224},[1207,12570,3288],{"class":3287},[1207,12572,5689],{"class":1862},[1207,12574,3294],{"class":3287},[1207,12576,5719],{"class":1224},[1207,12578,1973],{"class":1632},[1207,12580,12581,12584,12586],{"class":1209,"line":2567},[1207,12582,12583],{"class":1957},"            is_active",[1207,12585,1961],{"class":1632},[1207,12587,12323],{"class":2813},[1207,12589,12590],{"class":1209,"line":2588},[1207,12591,2012],{"class":1632},[1207,12593,12594,12597,12599,12602,12604,12606],{"class":1209,"line":2593},[1207,12595,12596],{"class":1620},"        users",[1207,12598,1633],{"class":1632},[1207,12600,12601],{"class":1862},"append",[1207,12603,1811],{"class":1632},[1207,12605,2643],{"class":1862},[1207,12607,2136],{"class":1632},[1207,12609,12610],{"class":1209,"line":2599},[1207,12611,1763],{"class":1620},[1207,12613,12614,12616,12618,12620,12622,12624,12626,12628,12631,12633,12636,12638,12641,12643,12645,12648],{"class":1209,"line":2619},[1207,12615,9570],{"class":1616},[1207,12617,2801],{"class":1632},[1207,12619,1965],{"class":1964},[1207,12621,12342],{"class":1224},[1207,12623,1965],{"class":1964},[1207,12625,2458],{"class":1632},[1207,12627,3281],{"class":1735},[1207,12629,12630],{"class":1224},"'Created ",[1207,12632,3288],{"class":3287},[1207,12634,12635],{"class":5160},"len",[1207,12637,1811],{"class":1632},[1207,12639,12640],{"class":1862},"users",[1207,12642,2328],{"class":1632},[1207,12644,3294],{"class":3287},[1207,12646,12647],{"class":1224}," users'",[1207,12649,2817],{"class":1632},[1207,12651,12652],{"class":1209,"line":2624},[1207,12653,1527],{"emptyLinePlaceholder":1526},[1207,12655,12656,12658,12661],{"class":1209,"line":2630},[1207,12657,9532],{"class":1735},[1207,12659,12660],{"class":1794}," setup_user_not_exists",[1207,12662,9538],{"class":1632},[1207,12664,12665],{"class":1209,"line":2652},[1207,12666,1750],{"class":1749},[1207,12668,12669],{"class":1209,"line":2657},[1207,12670,12671],{"class":1756},"    Set up test data for 'User with ID 999 does not exist' state\n",[1207,12673,12674],{"class":1209,"line":2675},[1207,12675,1763],{"class":1756},[1207,12677,12678],{"class":1209,"line":2702},[1207,12679,12680],{"class":1756},"    This ensures that user with ID 999 doesn't exist for error testing.\n",[1207,12682,12683],{"class":1209,"line":2707},[1207,12684,1750],{"class":1749},[1207,12686,12687],{"class":1209,"line":2713},[1207,12688,12689],{"class":1213},"    # Make sure user 999 doesn't exist\n",[1207,12691,12692,12694,12696,12698,12700,12702,12704,12706,12708,12710,12712,12714],{"class":1209,"line":2718},[1207,12693,12199],{"class":1620},[1207,12695,1633],{"class":1632},[1207,12697,1943],{"class":1942},[1207,12699,1633],{"class":1632},[1207,12701,5528],{"class":1862},[1207,12703,1811],{"class":1632},[1207,12705,2133],{"class":1957},[1207,12707,1961],{"class":1632},[1207,12709,11095],{"class":1231},[1207,12711,5543],{"class":1632},[1207,12713,12220],{"class":1862},[1207,12715,1866],{"class":1632},[1207,12717,12718],{"class":1209,"line":2724},[1207,12719,1763],{"class":1620},[1207,12721,12722,12724,12726,12728,12730,12732,12734,12736,12738,12740],{"class":1209,"line":2730},[1207,12723,9570],{"class":1616},[1207,12725,2801],{"class":1632},[1207,12727,1965],{"class":1964},[1207,12729,12342],{"class":1224},[1207,12731,1965],{"class":1964},[1207,12733,2458],{"class":1632},[1207,12735,2188],{"class":1964},[1207,12737,10959],{"class":1224},[1207,12739,1965],{"class":1964},[1207,12741,2817],{"class":1632},[1207,12743,12744],{"class":1209,"line":2736},[1207,12745,1527],{"emptyLinePlaceholder":1526},[1207,12747,12748],{"class":1209,"line":2742},[1207,12749,12750],{"class":1213},"# Provider states endpoint\n",[1207,12752,12753],{"class":1209,"line":2748},[1207,12754,12755],{"class":1213},"# This is a special endpoint that Pact calls to set up test data\n",[1207,12757,12758,12760,12762,12764,12767,12769],{"class":1209,"line":2753},[1207,12759,1626],{"class":1616},[1207,12761,1654],{"class":1620},[1207,12763,1633],{"class":1632},[1207,12765,12766],{"class":1620},"http ",[1207,12768,1617],{"class":1616},[1207,12770,12771],{"class":1620}," JsonResponse\n",[1207,12773,12774,12776,12778,12780,12783,12785,12788,12790,12793,12795],{"class":1209,"line":2759},[1207,12775,1626],{"class":1616},[1207,12777,1654],{"class":1620},[1207,12779,1633],{"class":1632},[1207,12781,12782],{"class":1620},"views",[1207,12784,1633],{"class":1632},[1207,12786,12787],{"class":1620},"decorators",[1207,12789,1633],{"class":1632},[1207,12791,12792],{"class":1620},"csrf ",[1207,12794,1617],{"class":1616},[1207,12796,12797],{"class":1620}," csrf_exempt\n",[1207,12799,12800,12802,12804,12806,12808,12810,12812,12814,12816,12818],{"class":1209,"line":2781},[1207,12801,1626],{"class":1616},[1207,12803,1654],{"class":1620},[1207,12805,1633],{"class":1632},[1207,12807,12782],{"class":1620},[1207,12809,1633],{"class":1632},[1207,12811,12787],{"class":1620},[1207,12813,1633],{"class":1632},[1207,12815,12766],{"class":1620},[1207,12817,1617],{"class":1616},[1207,12819,12820],{"class":1620}," require_http_methods\n",[1207,12822,12823,12825],{"class":1209,"line":2820},[1207,12824,1617],{"class":1616},[1207,12826,6574],{"class":1620},[1207,12828,12829],{"class":1209,"line":2825},[1207,12830,1527],{"emptyLinePlaceholder":1526},[1207,12832,12833,12835],{"class":1209,"line":2830},[1207,12834,3707],{"class":1632},[1207,12836,12837],{"class":1794},"csrf_exempt\n",[1207,12839,12840,12842,12845,12848,12850,12852,12854],{"class":1209,"line":2846},[1207,12841,3707],{"class":1632},[1207,12843,12844],{"class":1794},"require_http_methods",[1207,12846,12847],{"class":1632},"([",[1207,12849,3297],{"class":1964},[1207,12851,10684],{"class":1224},[1207,12853,3297],{"class":1964},[1207,12855,12856],{"class":1632},"])\n",[1207,12858,12859,12861,12864,12866,12869],{"class":1209,"line":2861},[1207,12860,9532],{"class":1735},[1207,12862,12863],{"class":1794}," provider_states_endpoint",[1207,12865,1811],{"class":1632},[1207,12867,12868],{"class":2051},"request",[1207,12870,1818],{"class":1632},[1207,12872,12873],{"class":1209,"line":2884},[1207,12874,1750],{"class":1749},[1207,12876,12877],{"class":1209,"line":2889},[1207,12878,12879],{"class":1756},"    Endpoint for setting up provider states during contract verification\n",[1207,12881,12882],{"class":1209,"line":2894},[1207,12883,1763],{"class":1756},[1207,12885,12886],{"class":1209,"line":2900},[1207,12887,12888],{"class":1756},"    Pact calls this endpoint before each test to set up the required\n",[1207,12890,12891],{"class":1209,"line":2914},[1207,12892,12893],{"class":1756},"    data state. The request contains the state name, and this endpoint\n",[1207,12895,12896],{"class":1209,"line":2919},[1207,12897,12898],{"class":1756},"    calls the appropriate setup function.\n",[1207,12900,12901],{"class":1209,"line":2925},[1207,12902,1750],{"class":1749},[1207,12904,12905,12908],{"class":1209,"line":2945},[1207,12906,12907],{"class":1616},"    try",[1207,12909,1743],{"class":1632},[1207,12911,12912,12914,12916,12919,12921,12924,12926,12928,12930,12933],{"class":1209,"line":2950},[1207,12913,7023],{"class":1620},[1207,12915,1961],{"class":1632},[1207,12917,12918],{"class":1620}," json",[1207,12920,1633],{"class":1632},[1207,12922,12923],{"class":1862},"loads",[1207,12925,1811],{"class":1632},[1207,12927,12868],{"class":1862},[1207,12929,1633],{"class":1632},[1207,12931,12932],{"class":1942},"body",[1207,12934,2136],{"class":1632},[1207,12936,12937,12940,12942,12944,12946,12948,12950,12952,12955,12957],{"class":1209,"line":2956},[1207,12938,12939],{"class":1620},"        state ",[1207,12941,1961],{"class":1632},[1207,12943,7100],{"class":1620},[1207,12945,1633],{"class":1632},[1207,12947,5111],{"class":1862},[1207,12949,1811],{"class":1632},[1207,12951,1965],{"class":1964},[1207,12953,12954],{"class":1224},"state",[1207,12956,1965],{"class":1964},[1207,12958,2136],{"class":1632},[1207,12960,12961],{"class":1209,"line":2971},[1207,12962,1836],{"class":1620},[1207,12964,12965],{"class":1209,"line":3016},[1207,12966,12967],{"class":1213},"        # Map of state names to setup functions\n",[1207,12969,12970,12973,12975],{"class":1209,"line":5981},[1207,12971,12972],{"class":1620},"        state_handlers ",[1207,12974,1961],{"class":1632},[1207,12976,2445],{"class":1632},[1207,12978,12979,12981,12983,12985,12987,12989],{"class":1209,"line":5987},[1207,12980,2451],{"class":1964},[1207,12982,10036],{"class":1224},[1207,12984,1965],{"class":1964},[1207,12986,2458],{"class":1632},[1207,12988,11959],{"class":1620},[1207,12990,1973],{"class":1632},[1207,12992,12993,12995,12997,12999,13001,13003],{"class":1209,"line":5992},[1207,12994,2451],{"class":1964},[1207,12996,10644],{"class":1224},[1207,12998,1965],{"class":1964},[1207,13000,2458],{"class":1632},[1207,13002,11974],{"class":1620},[1207,13004,1973],{"class":1632},[1207,13006,13007,13009,13011,13013,13015,13017],{"class":1209,"line":6003},[1207,13008,2451],{"class":1964},[1207,13010,11491],{"class":1224},[1207,13012,1965],{"class":1964},[1207,13014,2458],{"class":1632},[1207,13016,11989],{"class":1620},[1207,13018,1973],{"class":1632},[1207,13020,13021,13023,13025,13027,13029,13031],{"class":1209,"line":6008},[1207,13022,2451],{"class":1964},[1207,13024,10959],{"class":1224},[1207,13026,1965],{"class":1964},[1207,13028,2458],{"class":1632},[1207,13030,12660],{"class":1620},[1207,13032,1973],{"class":1632},[1207,13034,13035],{"class":1209,"line":6014},[1207,13036,2554],{"class":1632},[1207,13038,13039],{"class":1209,"line":6030},[1207,13040,1836],{"class":1620},[1207,13042,13043,13046,13048,13051,13053,13055,13057,13059],{"class":1209,"line":6050},[1207,13044,13045],{"class":1620},"        handler ",[1207,13047,1961],{"class":1632},[1207,13049,13050],{"class":1620}," state_handlers",[1207,13052,1633],{"class":1632},[1207,13054,5111],{"class":1862},[1207,13056,1811],{"class":1632},[1207,13058,12954],{"class":1862},[1207,13060,2136],{"class":1632},[1207,13062,13063,13066,13069],{"class":1209,"line":6070},[1207,13064,13065],{"class":1616},"        if",[1207,13067,13068],{"class":1620}," handler",[1207,13070,1743],{"class":1632},[1207,13072,13073,13076,13078,13080],{"class":1209,"line":6089},[1207,13074,13075],{"class":1620},"            result ",[1207,13077,1961],{"class":1632},[1207,13079,13068],{"class":1862},[1207,13081,1866],{"class":1632},[1207,13083,13084,13087,13090,13092,13095],{"class":1209,"line":6102},[1207,13085,13086],{"class":1616},"            return",[1207,13088,13089],{"class":1862}," JsonResponse",[1207,13091,1811],{"class":1632},[1207,13093,13094],{"class":1862},"result",[1207,13096,2136],{"class":1632},[1207,13098,13099,13102],{"class":1209,"line":6122},[1207,13100,13101],{"class":1616},"        else",[1207,13103,1743],{"class":1632},[1207,13105,13106,13108,13110],{"class":1209,"line":6140},[1207,13107,13086],{"class":1616},[1207,13109,13089],{"class":1862},[1207,13111,1951],{"class":1632},[1207,13113,13114,13117,13119,13121,13123,13125,13127,13130,13132,13134,13136,13138,13141],{"class":1209,"line":6145},[1207,13115,13116],{"class":1632},"                {",[1207,13118,1965],{"class":1964},[1207,13120,10907],{"class":1224},[1207,13122,1965],{"class":1964},[1207,13124,2458],{"class":1632},[1207,13126,3281],{"class":1735},[1207,13128,13129],{"class":1224},"'Unknown state: ",[1207,13131,3288],{"class":3287},[1207,13133,12954],{"class":1862},[1207,13135,3294],{"class":3287},[1207,13137,1965],{"class":1224},[1207,13139,13140],{"class":1632},"},",[1207,13142,2858],{"class":1862},[1207,13144,13145,13148,13150],{"class":1209,"line":6151},[1207,13146,13147],{"class":1957},"                status",[1207,13149,1961],{"class":1632},[1207,13151,13152],{"class":1231},"400\n",[1207,13154,13155],{"class":1209,"line":6156},[1207,13156,13157],{"class":1632},"            )\n",[1207,13159,13160],{"class":1209,"line":6162},[1207,13161,13162],{"class":1620},"            \n",[1207,13164,13165,13168,13171,13174,13176],{"class":1209,"line":6189},[1207,13166,13167],{"class":1616},"    except",[1207,13169,13170],{"class":4020}," Exception",[1207,13172,13173],{"class":1616}," as",[1207,13175,11129],{"class":1620},[1207,13177,1743],{"class":1632},[1207,13179,13180,13182,13184],{"class":1209,"line":6208},[1207,13181,1859],{"class":1616},[1207,13183,13089],{"class":1862},[1207,13185,1951],{"class":1632},[1207,13187,13188,13190,13192,13194,13196,13198,13200,13202,13205,13208],{"class":1209,"line":6228},[1207,13189,2864],{"class":1632},[1207,13191,1965],{"class":1964},[1207,13193,10907],{"class":1224},[1207,13195,1965],{"class":1964},[1207,13197,2458],{"class":1632},[1207,13199,4021],{"class":4020},[1207,13201,1811],{"class":1632},[1207,13203,13204],{"class":1862},"e",[1207,13206,13207],{"class":1632},")},",[1207,13209,2858],{"class":1862},[1207,13211,13212,13215,13217],{"class":1209,"line":6241},[1207,13213,13214],{"class":1957},"            status",[1207,13216,1961],{"class":1632},[1207,13218,13219],{"class":1231},"500\n",[1207,13221,13222],{"class":1209,"line":6261},[1207,13223,2012],{"class":1632},[1207,13225,13226],{"class":1209,"line":6279},[1207,13227,1527],{"emptyLinePlaceholder":1526},[1207,13229,13230],{"class":1209,"line":6284},[1207,13231,13232],{"class":1213},"# Add this to your URLs\n",[1207,13234,13235],{"class":1209,"line":6289},[1207,13236,13237],{"class":1213},"# urls.py\n",[1207,13239,13240,13242,13244,13246,13248,13250],{"class":1209,"line":6294},[1207,13241,1626],{"class":1616},[1207,13243,1654],{"class":1620},[1207,13245,1633],{"class":1632},[1207,13247,6600],{"class":1620},[1207,13249,1617],{"class":1616},[1207,13251,13252],{"class":1620}," path\n",[1207,13254,13255,13257,13260,13263],{"class":1209,"line":6300},[1207,13256,1626],{"class":1616},[1207,13258,13259],{"class":1632}," .",[1207,13261,13262],{"class":1616}," import",[1207,13264,13265],{"class":1620}," views\n",[1207,13267,13268],{"class":1209,"line":6320},[1207,13269,1527],{"emptyLinePlaceholder":1526},[1207,13271,13272,13275,13277],{"class":1209,"line":6339},[1207,13273,13274],{"class":1620},"urlpatterns ",[1207,13276,1961],{"class":1632},[1207,13278,5664],{"class":1632},[1207,13280,13281],{"class":1209,"line":6344},[1207,13282,13283],{"class":1213},"    # ... your other URLs\n",[1207,13285,13286,13289,13291,13293,13296,13298,13300,13303,13305,13308,13310,13313,13315,13317,13320,13322],{"class":1209,"line":6350},[1207,13287,13288],{"class":1862},"    path",[1207,13290,1811],{"class":1632},[1207,13292,1965],{"class":1964},[1207,13294,13295],{"class":1224},"api/provider-states/",[1207,13297,1965],{"class":1964},[1207,13299,1644],{"class":1632},[1207,13301,13302],{"class":1862}," views",[1207,13304,1633],{"class":1632},[1207,13306,13307],{"class":1942},"provider_states_endpoint",[1207,13309,1644],{"class":1632},[1207,13311,13312],{"class":1957}," name",[1207,13314,1961],{"class":1632},[1207,13316,1965],{"class":1964},[1207,13318,13319],{"class":1224},"provider-states",[1207,13321,1965],{"class":1964},[1207,13323,7386],{"class":1632},[1207,13325,13326],{"class":1209,"line":6366},[1207,13327,13328],{"class":1632},"]\n",[1026,13330,13331],{},[1045,13332,13333],{},"Running Contract Tests:",[1197,13335,13337],{"className":1199,"code":13336,"language":1201,"meta":1202,"style":1202},"# 1. Consumer side (Order Service)\n# Run consumer tests to generate contract files\npytest tests/contract/\n\n# This generates: ./pacts/orderservice-userservice.json\n\n# 2. Provider side (User Service)\n# Start your Django service\npython manage.py runserver 8000\n\n# In another terminal, run provider verification\npytest user_service/tests/test_contract_provider.py\n\n# Or use Pact CLI directly\npact-verifier --provider-base-url=http://localhost:8000 \\\n              --pact-urls=./pacts/orderservice-userservice.json \\\n              --provider-states-setup-url=http://localhost:8000/api/provider-states/\n",[1204,13338,13339,13344,13349,13356,13360,13365,13369,13374,13379,13392,13396,13401,13408,13412,13417,13430,13437],{"__ignoreMap":1202},[1207,13340,13341],{"class":1209,"line":1210},[1207,13342,13343],{"class":1213},"# 1. Consumer side (Order Service)\n",[1207,13345,13346],{"class":1209,"line":1217},[1207,13347,13348],{"class":1213},"# Run consumer tests to generate contract files\n",[1207,13350,13351,13353],{"class":1209,"line":1238},[1207,13352,1795],{"class":1220},[1207,13354,13355],{"class":1224}," tests/contract/\n",[1207,13357,13358],{"class":1209,"line":1254},[1207,13359,1527],{"emptyLinePlaceholder":1526},[1207,13361,13362],{"class":1209,"line":1270},[1207,13363,13364],{"class":1213},"# This generates: ./pacts/orderservice-userservice.json\n",[1207,13366,13367],{"class":1209,"line":1535},[1207,13368,1527],{"emptyLinePlaceholder":1526},[1207,13370,13371],{"class":1209,"line":1710},[1207,13372,13373],{"class":1213},"# 2. Provider side (User Service)\n",[1207,13375,13376],{"class":1209,"line":1727},[1207,13377,13378],{"class":1213},"# Start your Django service\n",[1207,13380,13381,13383,13386,13389],{"class":1209,"line":1732},[1207,13382,1604],{"class":1220},[1207,13384,13385],{"class":1224}," manage.py",[1207,13387,13388],{"class":1224}," runserver",[1207,13390,13391],{"class":1231}," 8000\n",[1207,13393,13394],{"class":1209,"line":1746},[1207,13395,1527],{"emptyLinePlaceholder":1526},[1207,13397,13398],{"class":1209,"line":1753},[1207,13399,13400],{"class":1213},"# In another terminal, run provider verification\n",[1207,13402,13403,13405],{"class":1209,"line":1760},[1207,13404,1795],{"class":1220},[1207,13406,13407],{"class":1224}," user_service/tests/test_contract_provider.py\n",[1207,13409,13410],{"class":1209,"line":1766},[1207,13411,1527],{"emptyLinePlaceholder":1526},[1207,13413,13414],{"class":1209,"line":1772},[1207,13415,13416],{"class":1213},"# Or use Pact CLI directly\n",[1207,13418,13419,13422,13426],{"class":1209,"line":1778},[1207,13420,13421],{"class":1220},"pact-verifier",[1207,13423,13425],{"class":13424},"sz9Cv"," --provider-base-url=http://localhost:8000",[1207,13427,13429],{"class":13428},"se3Ec"," \\\n",[1207,13431,13432,13435],{"class":1209,"line":1783},[1207,13433,13434],{"class":13424},"              --pact-urls=./pacts/orderservice-userservice.json",[1207,13436,13429],{"class":13428},[1207,13438,13439],{"class":1209,"line":1788},[1207,13440,13441],{"class":13424},"              --provider-states-setup-url=http://localhost:8000/api/provider-states/\n",[1026,13443,13444],{},[1045,13445,13446],{},"Benefits of Contract Testing:",[1123,13448,13449,13455,13461,13467,13473],{},[1084,13450,13451,13454],{},[1045,13452,13453],{},"Independent Development",": Teams can develop and test independently",[1084,13456,13457,13460],{},[1045,13458,13459],{},"Early Detection",": API changes that break consumers are caught early",[1084,13462,13463,13466],{},[1045,13464,13465],{},"Documentation",": Contracts serve as living documentation of APIs",[1084,13468,13469,13472],{},[1045,13470,13471],{},"Confidence",": Deploy with confidence knowing your APIs are compatible",[1084,13474,13475,13478],{},[1045,13476,13477],{},"Faster Feedback",": No need to run full integration test suites",[1026,13480,13481],{},[1045,13482,13483],{},"Best Practices:",[1123,13485,13486,13492,13498,13504,13510],{},[1084,13487,13488,13491],{},[1045,13489,13490],{},"Version Your Contracts",": Use semantic versioning for contract changes",[1084,13493,13494,13497],{},[1045,13495,13496],{},"Automate in CI/CD",": Run contract tests in your build pipeline",[1084,13499,13500,13503],{},[1045,13501,13502],{},"Use Pact Broker",": Store contracts centrally for team collaboration",[1084,13505,13506,13509],{},[1045,13507,13508],{},"Test Error Cases",": Include error scenarios in your contracts",[1084,13511,13512,13515],{},[1045,13513,13514],{},"Keep Contracts Simple",": Focus on the data structure, not business logic",[1030,13517,13519],{"id":13518},"component-testing","Component Testing",[1026,13521,13522],{},"Component testing treats an individual service as a black box and tests it in isolation with all external dependencies mocked or stubbed. Think of it as testing a complete microservice as if it were a single component, without worrying about other services.",[1038,13524,13526],{"id":13525},"understanding-component-vs-integration-testing","Understanding Component vs Integration Testing",[1026,13528,13529,13531,13532,13534],{},[1045,13530,4630],{},": Tests how components within a service work together (database + service layer + views)\n",[1045,13533,13519],{},": Tests an entire service as a unit, with external services mocked",[1026,13536,13537],{},"Component testing is particularly valuable in microservices because it:",[1081,13539,13540,13543,13546,13549],{},[1084,13541,13542],{},"Verifies your service works correctly in isolation",[1084,13544,13545],{},"Doesn't require other services to be running",[1084,13547,13548],{},"Catches issues that unit tests might miss",[1084,13550,13551],{},"Runs faster than end-to-end tests",[1038,13553,13555],{"id":13554},"service-component-tests","Service Component Tests",[1197,13557,13559],{"className":1602,"code":13558,"language":1604,"meta":1202,"style":1202},"# user_service/tests/test_component.py\nimport pytest\nimport responses\nfrom django.test import override_settings\nfrom django.urls import reverse\nfrom rest_framework.test import APIClient\nfrom rest_framework import status\nfrom user_service.services import UserService\nfrom user_service.tests.factories import UserFactory\n\n@pytest.mark.django_db\nclass TestUserServiceComponent:\n    \"\"\"\n    Component tests for the entire User Service\n    \n    These tests verify that the User Service works correctly as a complete unit,\n    with all external dependencies mocked. We test the service through its\n    public interfaces (APIs) while controlling all external interactions.\n    \"\"\"\n    \n    @pytest.fixture\n    def api_client(self):\n        \"\"\"API client for making HTTP requests to the service\"\"\"\n        return APIClient()\n    \n    @responses.activate\n    def test_user_creation_with_external_notifications(self, api_client):\n        \"\"\"\n        Test user creation with mocked external service calls\n        \n        This test verifies that when a user is created:\n        1. The user is saved to the database\n        2. External services are notified correctly\n        3. The API returns the expected response\n        4. All external calls are made with correct data\n        \n        We use @responses.activate to mock HTTP calls to external services.\n        \"\"\"\n        # Arrange: Mock external service calls\n        # Mock notification service\n        responses.add(\n            responses.POST,\n            'http://notification-service:8002/api/user-created/',\n            json={'success': True, 'notification_id': 'notif_123'},\n            status=200\n        )\n        \n        # Mock analytics service\n        responses.add(\n            responses.POST,\n            'http://analytics-service:8003/api/track-event/',\n            json={'tracked': True, 'event_id': 'event_456'},\n            status=200\n        )\n        \n        # Mock email service\n        responses.add(\n            responses.POST,\n            'http://email-service:8004/api/send-welcome/',\n            json={'sent': True, 'message_id': 'msg_789'},\n            status=200\n        )\n        \n        # Prepare user creation data\n        user_data = {\n            'username': 'componentuser',\n            'email': 'component@example.com',\n            'password': 'testpass123',\n            'first_name': 'Component',\n            'last_name': 'Test'\n        }\n        \n        # Act: Create user through the API\n        response = api_client.post(\n            reverse('user-list'),\n            data=user_data,\n            format='json'\n        )\n        \n        # Assert: Verify the API response\n        assert response.status_code == status.HTTP_201_CREATED\n        response_data = response.json()\n        assert response_data['username'] == 'componentuser'\n        assert response_data['email'] == 'component@example.com'\n        \n        # Assert: Verify user was saved to database\n        from django.contrib.auth.models import User\n        created_user = User.objects.get(username='componentuser')\n        assert created_user.email == 'component@example.com'\n        \n        # Assert: Verify external service calls were made\n        assert len(responses.calls) == 3  # Should have called all 3 services\n        \n        # Verify specific service calls\n        notification_call = next(\n            call for call in responses.calls \n            if 'notification-service' in call.request.url\n        )\n        assert notification_call.request.url == 'http://notification-service:8002/api/user-created/'\n        \n        analytics_call = next(\n            call for call in responses.calls \n            if 'analytics-service' in call.request.url\n        )\n        assert analytics_call.request.url == 'http://analytics-service:8003/api/track-event/'\n    \n    @responses.activate\n    def test_user_service_handles_external_service_failure(self, api_client):\n        \"\"\"\n        Test graceful handling of external service failures\n        \n        This test verifies that the User Service continues to work correctly\n        even when external services are unavailable. The user should still\n        be created successfully, but external notifications might fail.\n        \"\"\"\n        # Arrange: Mock external service failure\n        responses.add(\n            responses.POST,\n            'http://notification-service:8002/api/user-created/',\n            json={'error': 'Service unavailable'},\n            status=503  # Service unavailable\n        )\n        \n        # Mock analytics service success (to test partial failure)\n        responses.add(\n            responses.POST,\n            'http://analytics-service:8003/api/track-event/',\n            json={'tracked': True},\n            status=200\n        )\n        \n        user_data = {\n            'username': 'failureuser',\n            'email': 'failure@example.com',\n            'password': 'testpass123'\n        }\n        \n        # Act: Create user despite external service failure\n        response = api_client.post(\n            reverse('user-list'),\n            data=user_data,\n            format='json'\n        )\n        \n        # Assert: User creation should still succeed\n        # The service should be resilient to external failures\n        assert response.status_code == status.HTTP_201_CREATED\n        \n        # Verify user was created in database\n        from django.contrib.auth.models import User\n        user = User.objects.get(username='failureuser')\n        assert user.email == 'failure@example.com'\n        \n        # Verify both services were called (even though one failed)\n        assert len(responses.calls) == 2\n    \n    @responses.activate\n    def test_user_profile_update_workflow(self, api_client):\n        \"\"\"\n        Test complete user profile update workflow\n        \n        This test verifies the entire workflow when a user updates their profile:\n        1. Profile is updated in database\n        2. Cache is invalidated\n        3. Other services are notified\n        4. Audit log is created\n        \"\"\"\n        # Arrange: Create a user first\n        user = UserFactory(username='updateuser')\n        api_client.force_authenticate(user=user)\n        \n        # Mock external service calls for profile update\n        responses.add(\n            responses.POST,\n            'http://cache-service:8005/api/invalidate/',\n            json={'invalidated': True},\n            status=200\n        )\n        \n        responses.add(\n            responses.POST,\n            'http://audit-service:8006/api/log-event/',\n            json={'logged': True, 'audit_id': 'audit_123'},\n            status=200\n        )\n        \n        responses.add(\n            responses.POST,\n            'http://recommendation-service:8007/api/user-updated/',\n            json={'updated': True},\n            status=200\n        )\n        \n        # Prepare update data\n        update_data = {\n            'first_name': 'Updated',\n            'last_name': 'Name',\n            'bio': 'Updated bio information'\n        }\n        \n        # Act: Update user profile\n        response = api_client.patch(\n            reverse('user-detail', kwargs={'pk': user.id}),\n            data=update_data,\n            format='json'\n        )\n        \n        # Assert: Verify API response\n        assert response.status_code == status.HTTP_200_OK\n        response_data = response.json()\n        assert response_data['first_name'] == 'Updated'\n        assert response_data['last_name'] == 'Name'\n        \n        # Verify database was updated\n        user.refresh_from_db()\n        assert user.first_name == 'Updated'\n        assert user.last_name == 'Name'\n        \n        # Verify external services were notified\n        assert len(responses.calls) == 3\n        \n        # Verify cache invalidation was called\n        cache_call = next(\n            call for call in responses.calls \n            if 'cache-service' in call.request.url\n        )\n        assert cache_call is not None\n    \n    def test_user_authentication_workflow(self, api_client):\n        \"\"\"\n        Test user authentication workflow without external dependencies\n        \n        This test verifies the authentication process works correctly\n        within the service boundaries.\n        \"\"\"\n        # Arrange: Create a user\n        user = UserFactory(username='authuser', email='auth@example.com')\n        user.set_password('testpass123')\n        user.save()\n        \n        # Act: Attempt to authenticate\n        login_data = {\n            'username': 'authuser',\n            'password': 'testpass123'\n        }\n        \n        response = api_client.post(\n            reverse('auth-login'),\n            data=login_data,\n            format='json'\n        )\n        \n        # Assert: Verify successful authentication\n        assert response.status_code == status.HTTP_200_OK\n        response_data = response.json()\n        assert 'token' in response_data or 'access_token' in response_data\n        \n        # Test invalid credentials\n        invalid_data = {\n            'username': 'authuser',\n            'password': 'wrongpassword'\n        }\n        \n        response = api_client.post(\n            reverse('auth-login'),\n            data=invalid_data,\n            format='json'\n        )\n        \n        assert response.status_code == status.HTTP_401_UNAUTHORIZED\n    \n    @pytest.mark.parametrize(\"user_data,expected_error\", [\n        # Test various validation scenarios\n        ({'username': '', 'email': 'test@example.com', 'password': 'pass123'}, 'username'),\n        ({'username': 'test', 'email': 'invalid-email', 'password': 'pass123'}, 'email'),\n        ({'username': 'test', 'email': 'test@example.com', 'password': '123'}, 'password'),\n        ({'username': 'test', 'email': 'test@example.com'}, 'password'),  # Missing password\n    ])\n    def test_user_validation_scenarios(self, api_client, user_data, expected_error):\n        \"\"\"\n        Test various user validation scenarios\n        \n        This parameterized test verifies that the service correctly validates\n        user input and returns appropriate error messages.\n        \"\"\"\n        # Act: Attempt to create user with invalid data\n        response = api_client.post(\n            reverse('user-list'),\n            data=user_data,\n            format='json'\n        )\n        \n        # Assert: Verify validation error\n        assert response.status_code == status.HTTP_400_BAD_REQUEST\n        error_data = response.json()\n        assert expected_error in error_data\n",[1204,13560,13561,13566,13572,13579,13593,13607,13621,13631,13645,13663,13667,13681,13690,13694,13699,13703,13708,13713,13718,13722,13726,13736,13748,13757,13765,13769,13780,13797,13801,13806,13810,13815,13820,13825,13830,13835,13839,13844,13848,13853,13858,13870,13881,13892,13930,13939,13943,13947,13952,13962,13972,13983,14020,14028,14032,14036,14041,14051,14061,14072,14109,14117,14121,14125,14130,14138,14157,14176,14194,14213,14229,14233,14237,14242,14256,14270,14280,14293,14297,14301,14306,14324,14338,14362,14386,14390,14395,14418,14448,14466,14470,14475,14500,14504,14509,14521,14543,14568,14572,14595,14599,14610,14628,14651,14655,14678,14682,14692,14709,14713,14718,14722,14727,14732,14737,14741,14746,14756,14766,14776,14799,14811,14815,14819,14824,14834,14844,14854,14872,14880,14884,14888,14896,14915,14934,14950,14954,14958,14963,14977,14991,15001,15013,15017,15021,15026,15031,15049,15053,15058,15080,15110,15128,15132,15137,15158,15162,15172,15189,15193,15198,15202,15207,15212,15217,15222,15227,15231,15236,15258,15276,15280,15285,15295,15305,15316,15335,15343,15347,15351,15361,15371,15382,15419,15427,15431,15435,15445,15455,15466,15485,15493,15497,15501,15506,15514,15532,15550,15567,15571,15575,15580,15594,15628,15638,15650,15654,15658,15663,15681,15695,15719,15743,15747,15752,15763,15781,15799,15803,15808,15828,15832,15837,15848,15866,15889,15893,15906,15910,15927,15931,15936,15940,15945,15950,15954,15959,15995,16014,16025,16029,16034,16043,16061,16077,16081,16085,16099,16114,16125,16137,16141,16145,16150,16169,16184,16215,16220,16226,16235,16254,16272,16277,16282,16297,16312,16323,16336,16341,16346,16365,16370,16399,16405,16464,16526,16588,16636,16642,16670,16675,16681,16686,16692,16698,16703,16709,16724,16739,16750,16763,16768,16773,16779,16798,16813],{"__ignoreMap":1202},[1207,13562,13563],{"class":1209,"line":1210},[1207,13564,13565],{"class":1213},"# user_service/tests/test_component.py\n",[1207,13567,13568,13570],{"class":1209,"line":1217},[1207,13569,1617],{"class":1616},[1207,13571,1621],{"class":1620},[1207,13573,13574,13576],{"class":1209,"line":1238},[1207,13575,1617],{"class":1616},[1207,13577,13578],{"class":1620}," responses\n",[1207,13580,13581,13583,13585,13587,13589,13591],{"class":1209,"line":1254},[1207,13582,1626],{"class":1616},[1207,13584,1654],{"class":1620},[1207,13586,1633],{"class":1632},[1207,13588,1659],{"class":1620},[1207,13590,1617],{"class":1616},[1207,13592,11786],{"class":1620},[1207,13594,13595,13597,13599,13601,13603,13605],{"class":1209,"line":1270},[1207,13596,1626],{"class":1616},[1207,13598,1654],{"class":1620},[1207,13600,1633],{"class":1632},[1207,13602,6600],{"class":1620},[1207,13604,1617],{"class":1616},[1207,13606,6605],{"class":1620},[1207,13608,13609,13611,13613,13615,13617,13619],{"class":1209,"line":1535},[1207,13610,1626],{"class":1616},[1207,13612,6624],{"class":1620},[1207,13614,1633],{"class":1632},[1207,13616,1659],{"class":1620},[1207,13618,1617],{"class":1616},[1207,13620,6633],{"class":1620},[1207,13622,13623,13625,13627,13629],{"class":1209,"line":1710},[1207,13624,1626],{"class":1616},[1207,13626,6612],{"class":1620},[1207,13628,1617],{"class":1616},[1207,13630,6617],{"class":1620},[1207,13632,13633,13635,13637,13639,13641,13643],{"class":1209,"line":1727},[1207,13634,1626],{"class":1616},[1207,13636,1697],{"class":1620},[1207,13638,1633],{"class":1632},[1207,13640,1702],{"class":1620},[1207,13642,1617],{"class":1616},[1207,13644,1707],{"class":1620},[1207,13646,13647,13649,13651,13653,13655,13657,13659,13661],{"class":1209,"line":1732},[1207,13648,1626],{"class":1616},[1207,13650,1697],{"class":1620},[1207,13652,1633],{"class":1632},[1207,13654,3684],{"class":1620},[1207,13656,1633],{"class":1632},[1207,13658,3689],{"class":1620},[1207,13660,1617],{"class":1616},[1207,13662,6674],{"class":1620},[1207,13664,13665],{"class":1209,"line":1746},[1207,13666,1527],{"emptyLinePlaceholder":1526},[1207,13668,13669,13671,13673,13675,13677,13679],{"class":1209,"line":1753},[1207,13670,3707],{"class":1632},[1207,13672,1795],{"class":1794},[1207,13674,1633],{"class":1632},[1207,13676,2029],{"class":1794},[1207,13678,1633],{"class":1632},[1207,13680,2034],{"class":1794},[1207,13682,13683,13685,13688],{"class":1209,"line":1760},[1207,13684,1736],{"class":1735},[1207,13686,13687],{"class":1739}," TestUserServiceComponent",[1207,13689,1743],{"class":1632},[1207,13691,13692],{"class":1209,"line":1766},[1207,13693,1750],{"class":1749},[1207,13695,13696],{"class":1209,"line":1772},[1207,13697,13698],{"class":1756},"    Component tests for the entire User Service\n",[1207,13700,13701],{"class":1209,"line":1778},[1207,13702,1763],{"class":1756},[1207,13704,13705],{"class":1209,"line":1783},[1207,13706,13707],{"class":1756},"    These tests verify that the User Service works correctly as a complete unit,\n",[1207,13709,13710],{"class":1209,"line":1788},[1207,13711,13712],{"class":1756},"    with all external dependencies mocked. We test the service through its\n",[1207,13714,13715],{"class":1209,"line":1803},[1207,13716,13717],{"class":1756},"    public interfaces (APIs) while controlling all external interactions.\n",[1207,13719,13720],{"class":1209,"line":1821},[1207,13721,1750],{"class":1749},[1207,13723,13724],{"class":1209,"line":1827},[1207,13725,1763],{"class":1620},[1207,13727,13728,13730,13732,13734],{"class":1209,"line":1833},[1207,13729,1791],{"class":1632},[1207,13731,1795],{"class":1794},[1207,13733,1633],{"class":1632},[1207,13735,1800],{"class":1794},[1207,13737,13738,13740,13742,13744,13746],{"class":1209,"line":1839},[1207,13739,1806],{"class":1735},[1207,13741,6769],{"class":1794},[1207,13743,1811],{"class":1632},[1207,13745,1815],{"class":1814},[1207,13747,1818],{"class":1632},[1207,13749,13750,13752,13755],{"class":1209,"line":1845},[1207,13751,6843],{"class":1749},[1207,13753,13754],{"class":1756},"API client for making HTTP requests to the service",[1207,13756,6849],{"class":1749},[1207,13758,13759,13761,13763],{"class":1209,"line":1851},[1207,13760,1859],{"class":1616},[1207,13762,6809],{"class":1862},[1207,13764,1866],{"class":1632},[1207,13766,13767],{"class":1209,"line":1856},[1207,13768,1763],{"class":1620},[1207,13770,13771,13773,13775,13777],{"class":1209,"line":1869},[1207,13772,1791],{"class":1632},[1207,13774,1385],{"class":1794},[1207,13776,1633],{"class":1632},[1207,13778,13779],{"class":1794},"activate\n",[1207,13781,13782,13784,13787,13789,13791,13793,13795],{"class":1209,"line":1874},[1207,13783,1806],{"class":1735},[1207,13785,13786],{"class":1794}," test_user_creation_with_external_notifications",[1207,13788,1811],{"class":1632},[1207,13790,1815],{"class":1814},[1207,13792,1644],{"class":1632},[1207,13794,6769],{"class":2051},[1207,13796,1818],{"class":1632},[1207,13798,13799],{"class":1209,"line":1885},[1207,13800,1824],{"class":1749},[1207,13802,13803],{"class":1209,"line":1899},[1207,13804,13805],{"class":1756},"        Test user creation with mocked external service calls\n",[1207,13807,13808],{"class":1209,"line":1904},[1207,13809,1836],{"class":1756},[1207,13811,13812],{"class":1209,"line":1910},[1207,13813,13814],{"class":1756},"        This test verifies that when a user is created:\n",[1207,13816,13817],{"class":1209,"line":1915},[1207,13818,13819],{"class":1756},"        1. The user is saved to the database\n",[1207,13821,13822],{"class":1209,"line":1921},[1207,13823,13824],{"class":1756},"        2. External services are notified correctly\n",[1207,13826,13827],{"class":1209,"line":1927},[1207,13828,13829],{"class":1756},"        3. The API returns the expected response\n",[1207,13831,13832],{"class":1209,"line":1932},[1207,13833,13834],{"class":1756},"        4. All external calls are made with correct data\n",[1207,13836,13837],{"class":1209,"line":1954},[1207,13838,1836],{"class":1756},[1207,13840,13841],{"class":1209,"line":1976},[1207,13842,13843],{"class":1756},"        We use @responses.activate to mock HTTP calls to external services.\n",[1207,13845,13846],{"class":1209,"line":1993},[1207,13847,1824],{"class":1749},[1207,13849,13850],{"class":1209,"line":2009},[1207,13851,13852],{"class":1213},"        # Arrange: Mock external service calls\n",[1207,13854,13855],{"class":1209,"line":2015},[1207,13856,13857],{"class":1213},"        # Mock notification service\n",[1207,13859,13860,13863,13865,13868],{"class":1209,"line":2020},[1207,13861,13862],{"class":1620},"        responses",[1207,13864,1633],{"class":1632},[1207,13866,13867],{"class":1862},"add",[1207,13869,1951],{"class":1632},[1207,13871,13872,13875,13877,13879],{"class":1209,"line":2037},[1207,13873,13874],{"class":1862},"            responses",[1207,13876,1633],{"class":1632},[1207,13878,10684],{"class":7008},[1207,13880,1973],{"class":1632},[1207,13882,13883,13885,13888,13890],{"class":1209,"line":2060},[1207,13884,2451],{"class":1964},[1207,13886,13887],{"class":1224},"http://notification-service:8002/api/user-created/",[1207,13889,1965],{"class":1964},[1207,13891,1973],{"class":1632},[1207,13893,13894,13897,13899,13901,13903,13905,13907,13909,13911,13913,13916,13918,13920,13922,13925,13927],{"class":1209,"line":2065},[1207,13895,13896],{"class":1957},"            json",[1207,13898,8186],{"class":1632},[1207,13900,1965],{"class":1964},[1207,13902,2806],{"class":1224},[1207,13904,1965],{"class":1964},[1207,13906,2458],{"class":1632},[1207,13908,2814],{"class":2813},[1207,13910,1644],{"class":1632},[1207,13912,2188],{"class":1964},[1207,13914,13915],{"class":1224},"notification_id",[1207,13917,1965],{"class":1964},[1207,13919,2458],{"class":1632},[1207,13921,2188],{"class":1964},[1207,13923,13924],{"class":1224},"notif_123",[1207,13926,1965],{"class":1964},[1207,13928,13929],{"class":1632},"},\n",[1207,13931,13932,13934,13936],{"class":1209,"line":2071},[1207,13933,13214],{"class":1957},[1207,13935,1961],{"class":1632},[1207,13937,13938],{"class":1231},"200\n",[1207,13940,13941],{"class":1209,"line":2076},[1207,13942,2012],{"class":1632},[1207,13944,13945],{"class":1209,"line":2082},[1207,13946,1836],{"class":1620},[1207,13948,13949],{"class":1209,"line":2088},[1207,13950,13951],{"class":1213},"        # Mock analytics service\n",[1207,13953,13954,13956,13958,13960],{"class":1209,"line":2094},[1207,13955,13862],{"class":1620},[1207,13957,1633],{"class":1632},[1207,13959,13867],{"class":1862},[1207,13961,1951],{"class":1632},[1207,13963,13964,13966,13968,13970],{"class":1209,"line":2100},[1207,13965,13874],{"class":1862},[1207,13967,1633],{"class":1632},[1207,13969,10684],{"class":7008},[1207,13971,1973],{"class":1632},[1207,13973,13974,13976,13979,13981],{"class":1209,"line":2105},[1207,13975,2451],{"class":1964},[1207,13977,13978],{"class":1224},"http://analytics-service:8003/api/track-event/",[1207,13980,1965],{"class":1964},[1207,13982,1973],{"class":1632},[1207,13984,13985,13987,13989,13991,13994,13996,13998,14000,14002,14004,14007,14009,14011,14013,14016,14018],{"class":1209,"line":2111},[1207,13986,13896],{"class":1957},[1207,13988,8186],{"class":1632},[1207,13990,1965],{"class":1964},[1207,13992,13993],{"class":1224},"tracked",[1207,13995,1965],{"class":1964},[1207,13997,2458],{"class":1632},[1207,13999,2814],{"class":2813},[1207,14001,1644],{"class":1632},[1207,14003,2188],{"class":1964},[1207,14005,14006],{"class":1224},"event_id",[1207,14008,1965],{"class":1964},[1207,14010,2458],{"class":1632},[1207,14012,2188],{"class":1964},[1207,14014,14015],{"class":1224},"event_456",[1207,14017,1965],{"class":1964},[1207,14019,13929],{"class":1632},[1207,14021,14022,14024,14026],{"class":1209,"line":2139},[1207,14023,13214],{"class":1957},[1207,14025,1961],{"class":1632},[1207,14027,13938],{"class":1231},[1207,14029,14030],{"class":1209,"line":2144},[1207,14031,2012],{"class":1632},[1207,14033,14034],{"class":1209,"line":2150},[1207,14035,1836],{"class":1620},[1207,14037,14038],{"class":1209,"line":2174},[1207,14039,14040],{"class":1213},"        # Mock email service\n",[1207,14042,14043,14045,14047,14049],{"class":1209,"line":2195},[1207,14044,13862],{"class":1620},[1207,14046,1633],{"class":1632},[1207,14048,13867],{"class":1862},[1207,14050,1951],{"class":1632},[1207,14052,14053,14055,14057,14059],{"class":1209,"line":2215},[1207,14054,13874],{"class":1862},[1207,14056,1633],{"class":1632},[1207,14058,10684],{"class":7008},[1207,14060,1973],{"class":1632},[1207,14062,14063,14065,14068,14070],{"class":1209,"line":2220},[1207,14064,2451],{"class":1964},[1207,14066,14067],{"class":1224},"http://email-service:8004/api/send-welcome/",[1207,14069,1965],{"class":1964},[1207,14071,1973],{"class":1632},[1207,14073,14074,14076,14078,14080,14083,14085,14087,14089,14091,14093,14096,14098,14100,14102,14105,14107],{"class":1209,"line":2235},[1207,14075,13896],{"class":1957},[1207,14077,8186],{"class":1632},[1207,14079,1965],{"class":1964},[1207,14081,14082],{"class":1224},"sent",[1207,14084,1965],{"class":1964},[1207,14086,2458],{"class":1632},[1207,14088,2814],{"class":2813},[1207,14090,1644],{"class":1632},[1207,14092,2188],{"class":1964},[1207,14094,14095],{"class":1224},"message_id",[1207,14097,1965],{"class":1964},[1207,14099,2458],{"class":1632},[1207,14101,2188],{"class":1964},[1207,14103,14104],{"class":1224},"msg_789",[1207,14106,1965],{"class":1964},[1207,14108,13929],{"class":1632},[1207,14110,14111,14113,14115],{"class":1209,"line":2253},[1207,14112,13214],{"class":1957},[1207,14114,1961],{"class":1632},[1207,14116,13938],{"class":1231},[1207,14118,14119],{"class":1209,"line":2258},[1207,14120,2012],{"class":1632},[1207,14122,14123],{"class":1209,"line":2264},[1207,14124,1836],{"class":1620},[1207,14126,14127],{"class":1209,"line":2269},[1207,14128,14129],{"class":1213},"        # Prepare user creation data\n",[1207,14131,14132,14134,14136],{"class":1209,"line":2275},[1207,14133,2440],{"class":1620},[1207,14135,1961],{"class":1632},[1207,14137,2445],{"class":1632},[1207,14139,14140,14142,14144,14146,14148,14150,14153,14155],{"class":1209,"line":2281},[1207,14141,2451],{"class":1964},[1207,14143,2183],{"class":1224},[1207,14145,1965],{"class":1964},[1207,14147,2458],{"class":1632},[1207,14149,2188],{"class":1964},[1207,14151,14152],{"class":1224},"componentuser",[1207,14154,1965],{"class":1964},[1207,14156,1973],{"class":1632},[1207,14158,14159,14161,14163,14165,14167,14169,14172,14174],{"class":1209,"line":2286},[1207,14160,2451],{"class":1964},[1207,14162,2204],{"class":1224},[1207,14164,1965],{"class":1964},[1207,14166,2458],{"class":1632},[1207,14168,2188],{"class":1964},[1207,14170,14171],{"class":1224},"component@example.com",[1207,14173,1965],{"class":1964},[1207,14175,1973],{"class":1632},[1207,14177,14178,14180,14182,14184,14186,14188,14190,14192],{"class":1209,"line":2292},[1207,14179,2451],{"class":1964},[1207,14181,2495],{"class":1224},[1207,14183,1965],{"class":1964},[1207,14185,2458],{"class":1632},[1207,14187,2188],{"class":1964},[1207,14189,2003],{"class":1224},[1207,14191,1965],{"class":1964},[1207,14193,1973],{"class":1632},[1207,14195,14196,14198,14200,14202,14204,14206,14209,14211],{"class":1209,"line":2313},[1207,14197,2451],{"class":1964},[1207,14199,2516],{"class":1224},[1207,14201,1965],{"class":1964},[1207,14203,2458],{"class":1632},[1207,14205,2188],{"class":1964},[1207,14207,14208],{"class":1224},"Component",[1207,14210,1965],{"class":1964},[1207,14212,1973],{"class":1632},[1207,14214,14215,14217,14219,14221,14223,14225,14227],{"class":1209,"line":2334},[1207,14216,2451],{"class":1964},[1207,14218,2537],{"class":1224},[1207,14220,1965],{"class":1964},[1207,14222,2458],{"class":1632},[1207,14224,2188],{"class":1964},[1207,14226,9849],{"class":1224},[1207,14228,2006],{"class":1964},[1207,14230,14231],{"class":1209,"line":2339},[1207,14232,2554],{"class":1632},[1207,14234,14235],{"class":1209,"line":2358},[1207,14236,1836],{"class":1620},[1207,14238,14239],{"class":1209,"line":2381},[1207,14240,14241],{"class":1213},"        # Act: Create user through the API\n",[1207,14243,14244,14246,14248,14250,14252,14254],{"class":1209,"line":2386},[1207,14245,6953],{"class":1620},[1207,14247,1961],{"class":1632},[1207,14249,6769],{"class":1620},[1207,14251,1633],{"class":1632},[1207,14253,7368],{"class":1862},[1207,14255,1951],{"class":1632},[1207,14257,14258,14260,14262,14264,14266,14268],{"class":1209,"line":2392},[1207,14259,7375],{"class":1862},[1207,14261,1811],{"class":1632},[1207,14263,1965],{"class":1964},[1207,14265,6973],{"class":1224},[1207,14267,1965],{"class":1964},[1207,14269,7386],{"class":1632},[1207,14271,14272,14274,14276,14278],{"class":1209,"line":2397},[1207,14273,7391],{"class":1957},[1207,14275,1961],{"class":1632},[1207,14277,2583],{"class":1862},[1207,14279,1973],{"class":1632},[1207,14281,14282,14285,14287,14289,14291],{"class":1209,"line":2403},[1207,14283,14284],{"class":1957},"            format",[1207,14286,1961],{"class":1632},[1207,14288,1965],{"class":1964},[1207,14290,2792],{"class":1224},[1207,14292,2006],{"class":1964},[1207,14294,14295],{"class":1209,"line":2409},[1207,14296,2012],{"class":1632},[1207,14298,14299],{"class":1209,"line":2414},[1207,14300,1836],{"class":1620},[1207,14302,14303],{"class":1209,"line":2420},[1207,14304,14305],{"class":1213},"        # Assert: Verify the API response\n",[1207,14307,14308,14310,14312,14314,14316,14318,14320,14322],{"class":1209,"line":2426},[1207,14309,2153],{"class":1616},[1207,14311,6994],{"class":1620},[1207,14313,1633],{"class":1632},[1207,14315,2772],{"class":1942},[1207,14317,2164],{"class":2163},[1207,14319,7003],{"class":1620},[1207,14321,1633],{"class":1632},[1207,14323,7451],{"class":7008},[1207,14325,14326,14328,14330,14332,14334,14336],{"class":1209,"line":2431},[1207,14327,7464],{"class":1620},[1207,14329,1961],{"class":1632},[1207,14331,6994],{"class":1620},[1207,14333,1633],{"class":1632},[1207,14335,2792],{"class":1862},[1207,14337,1866],{"class":1632},[1207,14339,14340,14342,14344,14346,14348,14350,14352,14354,14356,14358,14360],{"class":1209,"line":2437},[1207,14341,2153],{"class":1616},[1207,14343,7481],{"class":1620},[1207,14345,2989],{"class":1632},[1207,14347,1965],{"class":1964},[1207,14349,2183],{"class":1224},[1207,14351,1965],{"class":1964},[1207,14353,3010],{"class":1632},[1207,14355,2164],{"class":2163},[1207,14357,2188],{"class":1964},[1207,14359,14152],{"class":1224},[1207,14361,2006],{"class":1964},[1207,14363,14364,14366,14368,14370,14372,14374,14376,14378,14380,14382,14384],{"class":1209,"line":2448},[1207,14365,2153],{"class":1616},[1207,14367,7481],{"class":1620},[1207,14369,2989],{"class":1632},[1207,14371,1965],{"class":1964},[1207,14373,2204],{"class":1224},[1207,14375,1965],{"class":1964},[1207,14377,3010],{"class":1632},[1207,14379,2164],{"class":2163},[1207,14381,2188],{"class":1964},[1207,14383,14171],{"class":1224},[1207,14385,2006],{"class":1964},[1207,14387,14388],{"class":1209,"line":2470},[1207,14389,1836],{"class":1620},[1207,14391,14392],{"class":1209,"line":2490},[1207,14393,14394],{"class":1213},"        # Assert: Verify user was saved to database\n",[1207,14396,14397,14400,14402,14404,14406,14408,14410,14412,14414,14416],{"class":1209,"line":2511},[1207,14398,14399],{"class":1616},"        from",[1207,14401,1654],{"class":1620},[1207,14403,1633],{"class":1632},[1207,14405,1675],{"class":1620},[1207,14407,1633],{"class":1632},[1207,14409,1680],{"class":1620},[1207,14411,1633],{"class":1632},[1207,14413,1685],{"class":1620},[1207,14415,1617],{"class":1616},[1207,14417,1690],{"class":1620},[1207,14419,14420,14422,14424,14426,14428,14430,14432,14434,14436,14438,14440,14442,14444,14446],{"class":1209,"line":2532},[1207,14421,7611],{"class":1620},[1207,14423,1961],{"class":1632},[1207,14425,1937],{"class":1620},[1207,14427,1633],{"class":1632},[1207,14429,1943],{"class":1942},[1207,14431,1633],{"class":1632},[1207,14433,5111],{"class":1862},[1207,14435,1811],{"class":1632},[1207,14437,2183],{"class":1957},[1207,14439,1961],{"class":1632},[1207,14441,1965],{"class":1964},[1207,14443,14152],{"class":1224},[1207,14445,1965],{"class":1964},[1207,14447,2136],{"class":1632},[1207,14449,14450,14452,14454,14456,14458,14460,14462,14464],{"class":1209,"line":2551},[1207,14451,2153],{"class":1616},[1207,14453,7644],{"class":1620},[1207,14455,1633],{"class":1632},[1207,14457,2204],{"class":1942},[1207,14459,2164],{"class":2163},[1207,14461,2188],{"class":1964},[1207,14463,14171],{"class":1224},[1207,14465,2006],{"class":1964},[1207,14467,14468],{"class":1209,"line":2557},[1207,14469,1836],{"class":1620},[1207,14471,14472],{"class":1209,"line":2562},[1207,14473,14474],{"class":1213},"        # Assert: Verify external service calls were made\n",[1207,14476,14477,14479,14481,14483,14485,14487,14490,14492,14494,14497],{"class":1209,"line":2567},[1207,14478,2153],{"class":1616},[1207,14480,5812],{"class":5160},[1207,14482,1811],{"class":1632},[1207,14484,1385],{"class":1862},[1207,14486,1633],{"class":1632},[1207,14488,14489],{"class":1942},"calls",[1207,14491,2328],{"class":1632},[1207,14493,2164],{"class":2163},[1207,14495,14496],{"class":1231}," 3",[1207,14498,14499],{"class":1213},"  # Should have called all 3 services\n",[1207,14501,14502],{"class":1209,"line":2588},[1207,14503,1836],{"class":1620},[1207,14505,14506],{"class":1209,"line":2593},[1207,14507,14508],{"class":1213},"        # Verify specific service calls\n",[1207,14510,14511,14514,14516,14519],{"class":1209,"line":2599},[1207,14512,14513],{"class":1620},"        notification_call ",[1207,14515,1961],{"class":1632},[1207,14517,14518],{"class":5160}," next",[1207,14520,1951],{"class":1632},[1207,14522,14523,14526,14529,14532,14534,14537,14539,14541],{"class":1209,"line":2619},[1207,14524,14525],{"class":1862},"            call ",[1207,14527,14528],{"class":1616},"for",[1207,14530,14531],{"class":1862}," call ",[1207,14533,5752],{"class":1616},[1207,14535,14536],{"class":1862}," responses",[1207,14538,1633],{"class":1632},[1207,14540,14489],{"class":1942},[1207,14542,2858],{"class":1862},[1207,14544,14545,14548,14550,14552,14554,14556,14559,14561,14563,14565],{"class":1209,"line":2624},[1207,14546,14547],{"class":1616},"            if",[1207,14549,2188],{"class":1964},[1207,14551,3023],{"class":1224},[1207,14553,1965],{"class":1964},[1207,14555,2983],{"class":1616},[1207,14557,14558],{"class":1862}," call",[1207,14560,1633],{"class":1632},[1207,14562,12868],{"class":1942},[1207,14564,1633],{"class":1632},[1207,14566,14567],{"class":1942},"url\n",[1207,14569,14570],{"class":1209,"line":2630},[1207,14571,2012],{"class":1632},[1207,14573,14574,14576,14579,14581,14583,14585,14587,14589,14591,14593],{"class":1209,"line":2652},[1207,14575,2153],{"class":1616},[1207,14577,14578],{"class":1620}," notification_call",[1207,14580,1633],{"class":1632},[1207,14582,12868],{"class":1942},[1207,14584,1633],{"class":1632},[1207,14586,3005],{"class":1942},[1207,14588,2164],{"class":2163},[1207,14590,2188],{"class":1964},[1207,14592,13887],{"class":1224},[1207,14594,2006],{"class":1964},[1207,14596,14597],{"class":1209,"line":2657},[1207,14598,1836],{"class":1620},[1207,14600,14601,14604,14606,14608],{"class":1209,"line":2675},[1207,14602,14603],{"class":1620},"        analytics_call ",[1207,14605,1961],{"class":1632},[1207,14607,14518],{"class":5160},[1207,14609,1951],{"class":1632},[1207,14611,14612,14614,14616,14618,14620,14622,14624,14626],{"class":1209,"line":2702},[1207,14613,14525],{"class":1862},[1207,14615,14528],{"class":1616},[1207,14617,14531],{"class":1862},[1207,14619,5752],{"class":1616},[1207,14621,14536],{"class":1862},[1207,14623,1633],{"class":1632},[1207,14625,14489],{"class":1942},[1207,14627,2858],{"class":1862},[1207,14629,14630,14632,14634,14637,14639,14641,14643,14645,14647,14649],{"class":1209,"line":2707},[1207,14631,14547],{"class":1616},[1207,14633,2188],{"class":1964},[1207,14635,14636],{"class":1224},"analytics-service",[1207,14638,1965],{"class":1964},[1207,14640,2983],{"class":1616},[1207,14642,14558],{"class":1862},[1207,14644,1633],{"class":1632},[1207,14646,12868],{"class":1942},[1207,14648,1633],{"class":1632},[1207,14650,14567],{"class":1942},[1207,14652,14653],{"class":1209,"line":2713},[1207,14654,2012],{"class":1632},[1207,14656,14657,14659,14662,14664,14666,14668,14670,14672,14674,14676],{"class":1209,"line":2718},[1207,14658,2153],{"class":1616},[1207,14660,14661],{"class":1620}," analytics_call",[1207,14663,1633],{"class":1632},[1207,14665,12868],{"class":1942},[1207,14667,1633],{"class":1632},[1207,14669,3005],{"class":1942},[1207,14671,2164],{"class":2163},[1207,14673,2188],{"class":1964},[1207,14675,13978],{"class":1224},[1207,14677,2006],{"class":1964},[1207,14679,14680],{"class":1209,"line":2724},[1207,14681,1763],{"class":1620},[1207,14683,14684,14686,14688,14690],{"class":1209,"line":2730},[1207,14685,1791],{"class":1632},[1207,14687,1385],{"class":1794},[1207,14689,1633],{"class":1632},[1207,14691,13779],{"class":1794},[1207,14693,14694,14696,14699,14701,14703,14705,14707],{"class":1209,"line":2736},[1207,14695,1806],{"class":1735},[1207,14697,14698],{"class":1794}," test_user_service_handles_external_service_failure",[1207,14700,1811],{"class":1632},[1207,14702,1815],{"class":1814},[1207,14704,1644],{"class":1632},[1207,14706,6769],{"class":2051},[1207,14708,1818],{"class":1632},[1207,14710,14711],{"class":1209,"line":2742},[1207,14712,1824],{"class":1749},[1207,14714,14715],{"class":1209,"line":2748},[1207,14716,14717],{"class":1756},"        Test graceful handling of external service failures\n",[1207,14719,14720],{"class":1209,"line":2753},[1207,14721,1836],{"class":1756},[1207,14723,14724],{"class":1209,"line":2759},[1207,14725,14726],{"class":1756},"        This test verifies that the User Service continues to work correctly\n",[1207,14728,14729],{"class":1209,"line":2781},[1207,14730,14731],{"class":1756},"        even when external services are unavailable. The user should still\n",[1207,14733,14734],{"class":1209,"line":2820},[1207,14735,14736],{"class":1756},"        be created successfully, but external notifications might fail.\n",[1207,14738,14739],{"class":1209,"line":2825},[1207,14740,1824],{"class":1749},[1207,14742,14743],{"class":1209,"line":2830},[1207,14744,14745],{"class":1213},"        # Arrange: Mock external service failure\n",[1207,14747,14748,14750,14752,14754],{"class":1209,"line":2846},[1207,14749,13862],{"class":1620},[1207,14751,1633],{"class":1632},[1207,14753,13867],{"class":1862},[1207,14755,1951],{"class":1632},[1207,14757,14758,14760,14762,14764],{"class":1209,"line":2861},[1207,14759,13874],{"class":1862},[1207,14761,1633],{"class":1632},[1207,14763,10684],{"class":7008},[1207,14765,1973],{"class":1632},[1207,14767,14768,14770,14772,14774],{"class":1209,"line":2884},[1207,14769,2451],{"class":1964},[1207,14771,13887],{"class":1224},[1207,14773,1965],{"class":1964},[1207,14775,1973],{"class":1632},[1207,14777,14778,14780,14782,14784,14786,14788,14790,14792,14795,14797],{"class":1209,"line":2889},[1207,14779,13896],{"class":1957},[1207,14781,8186],{"class":1632},[1207,14783,1965],{"class":1964},[1207,14785,10907],{"class":1224},[1207,14787,1965],{"class":1964},[1207,14789,2458],{"class":1632},[1207,14791,2188],{"class":1964},[1207,14793,14794],{"class":1224},"Service unavailable",[1207,14796,1965],{"class":1964},[1207,14798,13929],{"class":1632},[1207,14800,14801,14803,14805,14808],{"class":1209,"line":2894},[1207,14802,13214],{"class":1957},[1207,14804,1961],{"class":1632},[1207,14806,14807],{"class":1231},"503",[1207,14809,14810],{"class":1213},"  # Service unavailable\n",[1207,14812,14813],{"class":1209,"line":2900},[1207,14814,2012],{"class":1632},[1207,14816,14817],{"class":1209,"line":2914},[1207,14818,1836],{"class":1620},[1207,14820,14821],{"class":1209,"line":2919},[1207,14822,14823],{"class":1213},"        # Mock analytics service success (to test partial failure)\n",[1207,14825,14826,14828,14830,14832],{"class":1209,"line":2925},[1207,14827,13862],{"class":1620},[1207,14829,1633],{"class":1632},[1207,14831,13867],{"class":1862},[1207,14833,1951],{"class":1632},[1207,14835,14836,14838,14840,14842],{"class":1209,"line":2945},[1207,14837,13874],{"class":1862},[1207,14839,1633],{"class":1632},[1207,14841,10684],{"class":7008},[1207,14843,1973],{"class":1632},[1207,14845,14846,14848,14850,14852],{"class":1209,"line":2950},[1207,14847,2451],{"class":1964},[1207,14849,13978],{"class":1224},[1207,14851,1965],{"class":1964},[1207,14853,1973],{"class":1632},[1207,14855,14856,14858,14860,14862,14864,14866,14868,14870],{"class":1209,"line":2956},[1207,14857,13896],{"class":1957},[1207,14859,8186],{"class":1632},[1207,14861,1965],{"class":1964},[1207,14863,13993],{"class":1224},[1207,14865,1965],{"class":1964},[1207,14867,2458],{"class":1632},[1207,14869,2814],{"class":2813},[1207,14871,13929],{"class":1632},[1207,14873,14874,14876,14878],{"class":1209,"line":2971},[1207,14875,13214],{"class":1957},[1207,14877,1961],{"class":1632},[1207,14879,13938],{"class":1231},[1207,14881,14882],{"class":1209,"line":3016},[1207,14883,2012],{"class":1632},[1207,14885,14886],{"class":1209,"line":5981},[1207,14887,1836],{"class":1620},[1207,14889,14890,14892,14894],{"class":1209,"line":5987},[1207,14891,2440],{"class":1620},[1207,14893,1961],{"class":1632},[1207,14895,2445],{"class":1632},[1207,14897,14898,14900,14902,14904,14906,14908,14911,14913],{"class":1209,"line":5992},[1207,14899,2451],{"class":1964},[1207,14901,2183],{"class":1224},[1207,14903,1965],{"class":1964},[1207,14905,2458],{"class":1632},[1207,14907,2188],{"class":1964},[1207,14909,14910],{"class":1224},"failureuser",[1207,14912,1965],{"class":1964},[1207,14914,1973],{"class":1632},[1207,14916,14917,14919,14921,14923,14925,14927,14930,14932],{"class":1209,"line":6003},[1207,14918,2451],{"class":1964},[1207,14920,2204],{"class":1224},[1207,14922,1965],{"class":1964},[1207,14924,2458],{"class":1632},[1207,14926,2188],{"class":1964},[1207,14928,14929],{"class":1224},"failure@example.com",[1207,14931,1965],{"class":1964},[1207,14933,1973],{"class":1632},[1207,14935,14936,14938,14940,14942,14944,14946,14948],{"class":1209,"line":6008},[1207,14937,2451],{"class":1964},[1207,14939,2495],{"class":1224},[1207,14941,1965],{"class":1964},[1207,14943,2458],{"class":1632},[1207,14945,2188],{"class":1964},[1207,14947,2003],{"class":1224},[1207,14949,2006],{"class":1964},[1207,14951,14952],{"class":1209,"line":6014},[1207,14953,2554],{"class":1632},[1207,14955,14956],{"class":1209,"line":6030},[1207,14957,1836],{"class":1620},[1207,14959,14960],{"class":1209,"line":6050},[1207,14961,14962],{"class":1213},"        # Act: Create user despite external service failure\n",[1207,14964,14965,14967,14969,14971,14973,14975],{"class":1209,"line":6070},[1207,14966,6953],{"class":1620},[1207,14968,1961],{"class":1632},[1207,14970,6769],{"class":1620},[1207,14972,1633],{"class":1632},[1207,14974,7368],{"class":1862},[1207,14976,1951],{"class":1632},[1207,14978,14979,14981,14983,14985,14987,14989],{"class":1209,"line":6089},[1207,14980,7375],{"class":1862},[1207,14982,1811],{"class":1632},[1207,14984,1965],{"class":1964},[1207,14986,6973],{"class":1224},[1207,14988,1965],{"class":1964},[1207,14990,7386],{"class":1632},[1207,14992,14993,14995,14997,14999],{"class":1209,"line":6102},[1207,14994,7391],{"class":1957},[1207,14996,1961],{"class":1632},[1207,14998,2583],{"class":1862},[1207,15000,1973],{"class":1632},[1207,15002,15003,15005,15007,15009,15011],{"class":1209,"line":6122},[1207,15004,14284],{"class":1957},[1207,15006,1961],{"class":1632},[1207,15008,1965],{"class":1964},[1207,15010,2792],{"class":1224},[1207,15012,2006],{"class":1964},[1207,15014,15015],{"class":1209,"line":6140},[1207,15016,2012],{"class":1632},[1207,15018,15019],{"class":1209,"line":6145},[1207,15020,1836],{"class":1620},[1207,15022,15023],{"class":1209,"line":6151},[1207,15024,15025],{"class":1213},"        # Assert: User creation should still succeed\n",[1207,15027,15028],{"class":1209,"line":6156},[1207,15029,15030],{"class":1213},"        # The service should be resilient to external failures\n",[1207,15032,15033,15035,15037,15039,15041,15043,15045,15047],{"class":1209,"line":6162},[1207,15034,2153],{"class":1616},[1207,15036,6994],{"class":1620},[1207,15038,1633],{"class":1632},[1207,15040,2772],{"class":1942},[1207,15042,2164],{"class":2163},[1207,15044,7003],{"class":1620},[1207,15046,1633],{"class":1632},[1207,15048,7451],{"class":7008},[1207,15050,15051],{"class":1209,"line":6189},[1207,15052,1836],{"class":1620},[1207,15054,15055],{"class":1209,"line":6208},[1207,15056,15057],{"class":1213},"        # Verify user was created in database\n",[1207,15059,15060,15062,15064,15066,15068,15070,15072,15074,15076,15078],{"class":1209,"line":6228},[1207,15061,14399],{"class":1616},[1207,15063,1654],{"class":1620},[1207,15065,1633],{"class":1632},[1207,15067,1675],{"class":1620},[1207,15069,1633],{"class":1632},[1207,15071,1680],{"class":1620},[1207,15073,1633],{"class":1632},[1207,15075,1685],{"class":1620},[1207,15077,1617],{"class":1616},[1207,15079,1690],{"class":1620},[1207,15081,15082,15084,15086,15088,15090,15092,15094,15096,15098,15100,15102,15104,15106,15108],{"class":1209,"line":6241},[1207,15083,2570],{"class":1620},[1207,15085,1961],{"class":1632},[1207,15087,1937],{"class":1620},[1207,15089,1633],{"class":1632},[1207,15091,1943],{"class":1942},[1207,15093,1633],{"class":1632},[1207,15095,5111],{"class":1862},[1207,15097,1811],{"class":1632},[1207,15099,2183],{"class":1957},[1207,15101,1961],{"class":1632},[1207,15103,1965],{"class":1964},[1207,15105,14910],{"class":1224},[1207,15107,1965],{"class":1964},[1207,15109,2136],{"class":1632},[1207,15111,15112,15114,15116,15118,15120,15122,15124,15126],{"class":1209,"line":6261},[1207,15113,2153],{"class":1616},[1207,15115,2604],{"class":1620},[1207,15117,1633],{"class":1632},[1207,15119,2204],{"class":1942},[1207,15121,2164],{"class":2163},[1207,15123,2188],{"class":1964},[1207,15125,14929],{"class":1224},[1207,15127,2006],{"class":1964},[1207,15129,15130],{"class":1209,"line":6279},[1207,15131,1836],{"class":1620},[1207,15133,15134],{"class":1209,"line":6284},[1207,15135,15136],{"class":1213},"        # Verify both services were called (even though one failed)\n",[1207,15138,15139,15141,15143,15145,15147,15149,15151,15153,15155],{"class":1209,"line":6289},[1207,15140,2153],{"class":1616},[1207,15142,5812],{"class":5160},[1207,15144,1811],{"class":1632},[1207,15146,1385],{"class":1862},[1207,15148,1633],{"class":1632},[1207,15150,14489],{"class":1942},[1207,15152,2328],{"class":1632},[1207,15154,2164],{"class":2163},[1207,15156,15157],{"class":1231}," 2\n",[1207,15159,15160],{"class":1209,"line":6294},[1207,15161,1763],{"class":1620},[1207,15163,15164,15166,15168,15170],{"class":1209,"line":6300},[1207,15165,1791],{"class":1632},[1207,15167,1385],{"class":1794},[1207,15169,1633],{"class":1632},[1207,15171,13779],{"class":1794},[1207,15173,15174,15176,15179,15181,15183,15185,15187],{"class":1209,"line":6320},[1207,15175,1806],{"class":1735},[1207,15177,15178],{"class":1794}," test_user_profile_update_workflow",[1207,15180,1811],{"class":1632},[1207,15182,1815],{"class":1814},[1207,15184,1644],{"class":1632},[1207,15186,6769],{"class":2051},[1207,15188,1818],{"class":1632},[1207,15190,15191],{"class":1209,"line":6339},[1207,15192,1824],{"class":1749},[1207,15194,15195],{"class":1209,"line":6344},[1207,15196,15197],{"class":1756},"        Test complete user profile update workflow\n",[1207,15199,15200],{"class":1209,"line":6350},[1207,15201,1836],{"class":1756},[1207,15203,15204],{"class":1209,"line":6366},[1207,15205,15206],{"class":1756},"        This test verifies the entire workflow when a user updates their profile:\n",[1207,15208,15209],{"class":1209,"line":6389},[1207,15210,15211],{"class":1756},"        1. Profile is updated in database\n",[1207,15213,15214],{"class":1209,"line":6412},[1207,15215,15216],{"class":1756},"        2. Cache is invalidated\n",[1207,15218,15219],{"class":1209,"line":6417},[1207,15220,15221],{"class":1756},"        3. Other services are notified\n",[1207,15223,15224],{"class":1209,"line":6423},[1207,15225,15226],{"class":1756},"        4. Audit log is created\n",[1207,15228,15229],{"class":1209,"line":6468},[1207,15230,1824],{"class":1749},[1207,15232,15233],{"class":1209,"line":6487},[1207,15234,15235],{"class":1213},"        # Arrange: Create a user first\n",[1207,15237,15238,15240,15242,15244,15246,15248,15250,15252,15254,15256],{"class":1209,"line":8226},[1207,15239,2570],{"class":1620},[1207,15241,1961],{"class":1632},[1207,15243,3172],{"class":1862},[1207,15245,1811],{"class":1632},[1207,15247,2183],{"class":1957},[1207,15249,1961],{"class":1632},[1207,15251,1965],{"class":1964},[1207,15253,6043],{"class":1224},[1207,15255,1965],{"class":1964},[1207,15257,2136],{"class":1632},[1207,15259,15260,15262,15264,15266,15268,15270,15272,15274],{"class":1209,"line":8239},[1207,15261,8070],{"class":1620},[1207,15263,1633],{"class":1632},[1207,15265,8075],{"class":1862},[1207,15267,1811],{"class":1632},[1207,15269,2643],{"class":1957},[1207,15271,1961],{"class":1632},[1207,15273,2643],{"class":1862},[1207,15275,2136],{"class":1632},[1207,15277,15278],{"class":1209,"line":8244},[1207,15279,1836],{"class":1620},[1207,15281,15282],{"class":1209,"line":8249},[1207,15283,15284],{"class":1213},"        # Mock external service calls for profile update\n",[1207,15286,15287,15289,15291,15293],{"class":1209,"line":8255},[1207,15288,13862],{"class":1620},[1207,15290,1633],{"class":1632},[1207,15292,13867],{"class":1862},[1207,15294,1951],{"class":1632},[1207,15296,15297,15299,15301,15303],{"class":1209,"line":8274},[1207,15298,13874],{"class":1862},[1207,15300,1633],{"class":1632},[1207,15302,10684],{"class":7008},[1207,15304,1973],{"class":1632},[1207,15306,15307,15309,15312,15314],{"class":1209,"line":8279},[1207,15308,2451],{"class":1964},[1207,15310,15311],{"class":1224},"http://cache-service:8005/api/invalidate/",[1207,15313,1965],{"class":1964},[1207,15315,1973],{"class":1632},[1207,15317,15318,15320,15322,15324,15327,15329,15331,15333],{"class":1209,"line":8294},[1207,15319,13896],{"class":1957},[1207,15321,8186],{"class":1632},[1207,15323,1965],{"class":1964},[1207,15325,15326],{"class":1224},"invalidated",[1207,15328,1965],{"class":1964},[1207,15330,2458],{"class":1632},[1207,15332,2814],{"class":2813},[1207,15334,13929],{"class":1632},[1207,15336,15337,15339,15341],{"class":1209,"line":8319},[1207,15338,13214],{"class":1957},[1207,15340,1961],{"class":1632},[1207,15342,13938],{"class":1231},[1207,15344,15345],{"class":1209,"line":8344},[1207,15346,2012],{"class":1632},[1207,15348,15349],{"class":1209,"line":8349},[1207,15350,1836],{"class":1620},[1207,15352,15353,15355,15357,15359],{"class":1209,"line":8355},[1207,15354,13862],{"class":1620},[1207,15356,1633],{"class":1632},[1207,15358,13867],{"class":1862},[1207,15360,1951],{"class":1632},[1207,15362,15363,15365,15367,15369],{"class":1209,"line":8367},[1207,15364,13874],{"class":1862},[1207,15366,1633],{"class":1632},[1207,15368,10684],{"class":7008},[1207,15370,1973],{"class":1632},[1207,15372,15373,15375,15378,15380],{"class":1209,"line":8386},[1207,15374,2451],{"class":1964},[1207,15376,15377],{"class":1224},"http://audit-service:8006/api/log-event/",[1207,15379,1965],{"class":1964},[1207,15381,1973],{"class":1632},[1207,15383,15384,15386,15388,15390,15393,15395,15397,15399,15401,15403,15406,15408,15410,15412,15415,15417],{"class":1209,"line":8405},[1207,15385,13896],{"class":1957},[1207,15387,8186],{"class":1632},[1207,15389,1965],{"class":1964},[1207,15391,15392],{"class":1224},"logged",[1207,15394,1965],{"class":1964},[1207,15396,2458],{"class":1632},[1207,15398,2814],{"class":2813},[1207,15400,1644],{"class":1632},[1207,15402,2188],{"class":1964},[1207,15404,15405],{"class":1224},"audit_id",[1207,15407,1965],{"class":1964},[1207,15409,2458],{"class":1632},[1207,15411,2188],{"class":1964},[1207,15413,15414],{"class":1224},"audit_123",[1207,15416,1965],{"class":1964},[1207,15418,13929],{"class":1632},[1207,15420,15421,15423,15425],{"class":1209,"line":8410},[1207,15422,13214],{"class":1957},[1207,15424,1961],{"class":1632},[1207,15426,13938],{"class":1231},[1207,15428,15429],{"class":1209,"line":8428},[1207,15430,2012],{"class":1632},[1207,15432,15433],{"class":1209,"line":8433},[1207,15434,1836],{"class":1620},[1207,15436,15437,15439,15441,15443],{"class":1209,"line":8439},[1207,15438,13862],{"class":1620},[1207,15440,1633],{"class":1632},[1207,15442,13867],{"class":1862},[1207,15444,1951],{"class":1632},[1207,15446,15447,15449,15451,15453],{"class":1209,"line":8444},[1207,15448,13874],{"class":1862},[1207,15450,1633],{"class":1632},[1207,15452,10684],{"class":7008},[1207,15454,1973],{"class":1632},[1207,15456,15457,15459,15462,15464],{"class":1209,"line":8450},[1207,15458,2451],{"class":1964},[1207,15460,15461],{"class":1224},"http://recommendation-service:8007/api/user-updated/",[1207,15463,1965],{"class":1964},[1207,15465,1973],{"class":1632},[1207,15467,15468,15470,15472,15474,15477,15479,15481,15483],{"class":1209,"line":8455},[1207,15469,13896],{"class":1957},[1207,15471,8186],{"class":1632},[1207,15473,1965],{"class":1964},[1207,15475,15476],{"class":1224},"updated",[1207,15478,1965],{"class":1964},[1207,15480,2458],{"class":1632},[1207,15482,2814],{"class":2813},[1207,15484,13929],{"class":1632},[1207,15486,15487,15489,15491],{"class":1209,"line":8461},[1207,15488,13214],{"class":1957},[1207,15490,1961],{"class":1632},[1207,15492,13938],{"class":1231},[1207,15494,15495],{"class":1209,"line":8472},[1207,15496,2012],{"class":1632},[1207,15498,15499],{"class":1209,"line":8477},[1207,15500,1836],{"class":1620},[1207,15502,15503],{"class":1209,"line":8483},[1207,15504,15505],{"class":1213},"        # Prepare update data\n",[1207,15507,15508,15510,15512],{"class":1209,"line":8498},[1207,15509,8100],{"class":1620},[1207,15511,1961],{"class":1632},[1207,15513,2445],{"class":1632},[1207,15515,15516,15518,15520,15522,15524,15526,15528,15530],{"class":1209,"line":8534},[1207,15517,2451],{"class":1964},[1207,15519,2516],{"class":1224},[1207,15521,1965],{"class":1964},[1207,15523,2458],{"class":1632},[1207,15525,2188],{"class":1964},[1207,15527,2877],{"class":1224},[1207,15529,1965],{"class":1964},[1207,15531,1973],{"class":1632},[1207,15533,15534,15536,15538,15540,15542,15544,15546,15548],{"class":1209,"line":8539},[1207,15535,2451],{"class":1964},[1207,15537,2537],{"class":1224},[1207,15539,1965],{"class":1964},[1207,15541,2458],{"class":1632},[1207,15543,2188],{"class":1964},[1207,15545,6221],{"class":1224},[1207,15547,1965],{"class":1964},[1207,15549,1973],{"class":1632},[1207,15551,15552,15554,15556,15558,15560,15562,15565],{"class":1209,"line":8544},[1207,15553,2451],{"class":1964},[1207,15555,3867],{"class":1224},[1207,15557,1965],{"class":1964},[1207,15559,2458],{"class":1632},[1207,15561,2188],{"class":1964},[1207,15563,15564],{"class":1224},"Updated bio information",[1207,15566,2006],{"class":1964},[1207,15568,15569],{"class":1209,"line":8550},[1207,15570,2554],{"class":1632},[1207,15572,15573],{"class":1209,"line":8570},[1207,15574,1836],{"class":1620},[1207,15576,15577],{"class":1209,"line":8575},[1207,15578,15579],{"class":1213},"        # Act: Update user profile\n",[1207,15581,15582,15584,15586,15588,15590,15592],{"class":1209,"line":8593},[1207,15583,6953],{"class":1620},[1207,15585,1961],{"class":1632},[1207,15587,6769],{"class":1620},[1207,15589,1633],{"class":1632},[1207,15591,2344],{"class":1862},[1207,15593,1951],{"class":1632},[1207,15595,15596,15598,15600,15602,15604,15606,15608,15610,15612,15614,15616,15618,15620,15622,15624,15626],{"class":1209,"line":8598},[1207,15597,7375],{"class":1862},[1207,15599,1811],{"class":1632},[1207,15601,1965],{"class":1964},[1207,15603,8176],{"class":1224},[1207,15605,1965],{"class":1964},[1207,15607,1644],{"class":1632},[1207,15609,8183],{"class":1957},[1207,15611,8186],{"class":1632},[1207,15613,1965],{"class":1964},[1207,15615,8191],{"class":1224},[1207,15617,1965],{"class":1964},[1207,15619,2458],{"class":1632},[1207,15621,2604],{"class":1862},[1207,15623,1633],{"class":1632},[1207,15625,2133],{"class":1942},[1207,15627,8204],{"class":1632},[1207,15629,15630,15632,15634,15636],{"class":1209,"line":8604},[1207,15631,7391],{"class":1957},[1207,15633,1961],{"class":1632},[1207,15635,8221],{"class":1862},[1207,15637,1973],{"class":1632},[1207,15639,15640,15642,15644,15646,15648],{"class":1209,"line":8609},[1207,15641,14284],{"class":1957},[1207,15643,1961],{"class":1632},[1207,15645,1965],{"class":1964},[1207,15647,2792],{"class":1224},[1207,15649,2006],{"class":1964},[1207,15651,15652],{"class":1209,"line":8615},[1207,15653,2012],{"class":1632},[1207,15655,15656],{"class":1209,"line":8620},[1207,15657,1836],{"class":1620},[1207,15659,15660],{"class":1209,"line":8626},[1207,15661,15662],{"class":1213},"        # Assert: Verify API response\n",[1207,15664,15665,15667,15669,15671,15673,15675,15677,15679],{"class":1209,"line":8645},[1207,15666,2153],{"class":1616},[1207,15668,6994],{"class":1620},[1207,15670,1633],{"class":1632},[1207,15672,2772],{"class":1942},[1207,15674,2164],{"class":2163},[1207,15676,7003],{"class":1620},[1207,15678,1633],{"class":1632},[1207,15680,7009],{"class":7008},[1207,15682,15683,15685,15687,15689,15691,15693],{"class":1209,"line":8650},[1207,15684,7464],{"class":1620},[1207,15686,1961],{"class":1632},[1207,15688,6994],{"class":1620},[1207,15690,1633],{"class":1632},[1207,15692,2792],{"class":1862},[1207,15694,1866],{"class":1632},[1207,15696,15697,15699,15701,15703,15705,15707,15709,15711,15713,15715,15717],{"class":1209,"line":8656},[1207,15698,2153],{"class":1616},[1207,15700,7481],{"class":1620},[1207,15702,2989],{"class":1632},[1207,15704,1965],{"class":1964},[1207,15706,2516],{"class":1224},[1207,15708,1965],{"class":1964},[1207,15710,3010],{"class":1632},[1207,15712,2164],{"class":2163},[1207,15714,2188],{"class":1964},[1207,15716,2877],{"class":1224},[1207,15718,2006],{"class":1964},[1207,15720,15721,15723,15725,15727,15729,15731,15733,15735,15737,15739,15741],{"class":1209,"line":8683},[1207,15722,2153],{"class":1616},[1207,15724,7481],{"class":1620},[1207,15726,2989],{"class":1632},[1207,15728,1965],{"class":1964},[1207,15730,2537],{"class":1224},[1207,15732,1965],{"class":1964},[1207,15734,3010],{"class":1632},[1207,15736,2164],{"class":2163},[1207,15738,2188],{"class":1964},[1207,15740,6221],{"class":1224},[1207,15742,2006],{"class":1964},[1207,15744,15745],{"class":1209,"line":8688},[1207,15746,1836],{"class":1620},[1207,15748,15749],{"class":1209,"line":8694},[1207,15750,15751],{"class":1213},"        # Verify database was updated\n",[1207,15753,15754,15757,15759,15761],{"class":1209,"line":8713},[1207,15755,15756],{"class":1620},"        user",[1207,15758,1633],{"class":1632},[1207,15760,6358],{"class":1862},[1207,15762,1866],{"class":1632},[1207,15764,15765,15767,15769,15771,15773,15775,15777,15779],{"class":1209,"line":8718},[1207,15766,2153],{"class":1616},[1207,15768,2604],{"class":1620},[1207,15770,1633],{"class":1632},[1207,15772,2516],{"class":1942},[1207,15774,2164],{"class":2163},[1207,15776,2188],{"class":1964},[1207,15778,2877],{"class":1224},[1207,15780,2006],{"class":1964},[1207,15782,15783,15785,15787,15789,15791,15793,15795,15797],{"class":1209,"line":8733},[1207,15784,2153],{"class":1616},[1207,15786,2604],{"class":1620},[1207,15788,1633],{"class":1632},[1207,15790,2537],{"class":1942},[1207,15792,2164],{"class":2163},[1207,15794,2188],{"class":1964},[1207,15796,6221],{"class":1224},[1207,15798,2006],{"class":1964},[1207,15800,15801],{"class":1209,"line":8749},[1207,15802,1836],{"class":1620},[1207,15804,15805],{"class":1209,"line":8764},[1207,15806,15807],{"class":1213},"        # Verify external services were notified\n",[1207,15809,15810,15812,15814,15816,15818,15820,15822,15824,15826],{"class":1209,"line":8780},[1207,15811,2153],{"class":1616},[1207,15813,5812],{"class":5160},[1207,15815,1811],{"class":1632},[1207,15817,1385],{"class":1862},[1207,15819,1633],{"class":1632},[1207,15821,14489],{"class":1942},[1207,15823,2328],{"class":1632},[1207,15825,2164],{"class":2163},[1207,15827,7079],{"class":1231},[1207,15829,15830],{"class":1209,"line":8796},[1207,15831,1836],{"class":1620},[1207,15833,15834],{"class":1209,"line":8801},[1207,15835,15836],{"class":1213},"        # Verify cache invalidation was called\n",[1207,15838,15839,15842,15844,15846],{"class":1209,"line":8826},[1207,15840,15841],{"class":1620},"        cache_call ",[1207,15843,1961],{"class":1632},[1207,15845,14518],{"class":5160},[1207,15847,1951],{"class":1632},[1207,15849,15850,15852,15854,15856,15858,15860,15862,15864],{"class":1209,"line":8856},[1207,15851,14525],{"class":1862},[1207,15853,14528],{"class":1616},[1207,15855,14531],{"class":1862},[1207,15857,5752],{"class":1616},[1207,15859,14536],{"class":1862},[1207,15861,1633],{"class":1632},[1207,15863,14489],{"class":1942},[1207,15865,2858],{"class":1862},[1207,15867,15868,15870,15872,15875,15877,15879,15881,15883,15885,15887],{"class":1209,"line":8883},[1207,15869,14547],{"class":1616},[1207,15871,2188],{"class":1964},[1207,15873,15874],{"class":1224},"cache-service",[1207,15876,1965],{"class":1964},[1207,15878,2983],{"class":1616},[1207,15880,14558],{"class":1862},[1207,15882,1633],{"class":1632},[1207,15884,12868],{"class":1942},[1207,15886,1633],{"class":1632},[1207,15888,14567],{"class":1942},[1207,15890,15891],{"class":1209,"line":8907},[1207,15892,2012],{"class":1632},[1207,15894,15895,15897,15900,15902,15904],{"class":1209,"line":8912},[1207,15896,2153],{"class":1616},[1207,15898,15899],{"class":1620}," cache_call ",[1207,15901,2908],{"class":2163},[1207,15903,3853],{"class":2163},[1207,15905,3856],{"class":2813},[1207,15907,15908],{"class":1209,"line":8930},[1207,15909,1763],{"class":1620},[1207,15911,15912,15914,15917,15919,15921,15923,15925],{"class":1209,"line":8935},[1207,15913,1806],{"class":1735},[1207,15915,15916],{"class":1794}," test_user_authentication_workflow",[1207,15918,1811],{"class":1632},[1207,15920,1815],{"class":1814},[1207,15922,1644],{"class":1632},[1207,15924,6769],{"class":2051},[1207,15926,1818],{"class":1632},[1207,15928,15929],{"class":1209,"line":8941},[1207,15930,1824],{"class":1749},[1207,15932,15933],{"class":1209,"line":8946},[1207,15934,15935],{"class":1756},"        Test user authentication workflow without external dependencies\n",[1207,15937,15938],{"class":1209,"line":8952},[1207,15939,1836],{"class":1756},[1207,15941,15942],{"class":1209,"line":8957},[1207,15943,15944],{"class":1756},"        This test verifies the authentication process works correctly\n",[1207,15946,15947],{"class":1209,"line":8963},[1207,15948,15949],{"class":1756},"        within the service boundaries.\n",[1207,15951,15952],{"class":1209,"line":8997},[1207,15953,1824],{"class":1749},[1207,15955,15956],{"class":1209,"line":9030},[1207,15957,15958],{"class":1213},"        # Arrange: Create a user\n",[1207,15960,15961,15963,15965,15967,15969,15971,15973,15975,15978,15980,15982,15984,15986,15988,15991,15993],{"class":1209,"line":9063},[1207,15962,2570],{"class":1620},[1207,15964,1961],{"class":1632},[1207,15966,3172],{"class":1862},[1207,15968,1811],{"class":1632},[1207,15970,2183],{"class":1957},[1207,15972,1961],{"class":1632},[1207,15974,1965],{"class":1964},[1207,15976,15977],{"class":1224},"authuser",[1207,15979,1965],{"class":1964},[1207,15981,1644],{"class":1632},[1207,15983,4522],{"class":1957},[1207,15985,1961],{"class":1632},[1207,15987,1965],{"class":1964},[1207,15989,15990],{"class":1224},"auth@example.com",[1207,15992,1965],{"class":1964},[1207,15994,2136],{"class":1632},[1207,15996,15997,15999,16001,16004,16006,16008,16010,16012],{"class":1209,"line":9068},[1207,15998,15756],{"class":1620},[1207,16000,1633],{"class":1632},[1207,16002,16003],{"class":1862},"set_password",[1207,16005,1811],{"class":1632},[1207,16007,1965],{"class":1964},[1207,16009,2003],{"class":1224},[1207,16011,1965],{"class":1964},[1207,16013,2136],{"class":1632},[1207,16015,16016,16018,16020,16023],{"class":1209,"line":9074},[1207,16017,15756],{"class":1620},[1207,16019,1633],{"class":1632},[1207,16021,16022],{"class":1862},"save",[1207,16024,1866],{"class":1632},[1207,16026,16027],{"class":1209,"line":9089},[1207,16028,1836],{"class":1620},[1207,16030,16031],{"class":1209,"line":9104},[1207,16032,16033],{"class":1213},"        # Act: Attempt to authenticate\n",[1207,16035,16036,16039,16041],{"class":1209,"line":9130},[1207,16037,16038],{"class":1620},"        login_data ",[1207,16040,1961],{"class":1632},[1207,16042,2445],{"class":1632},[1207,16044,16045,16047,16049,16051,16053,16055,16057,16059],{"class":1209,"line":9135},[1207,16046,2451],{"class":1964},[1207,16048,2183],{"class":1224},[1207,16050,1965],{"class":1964},[1207,16052,2458],{"class":1632},[1207,16054,2188],{"class":1964},[1207,16056,15977],{"class":1224},[1207,16058,1965],{"class":1964},[1207,16060,1973],{"class":1632},[1207,16062,16063,16065,16067,16069,16071,16073,16075],{"class":1209,"line":9140},[1207,16064,2451],{"class":1964},[1207,16066,2495],{"class":1224},[1207,16068,1965],{"class":1964},[1207,16070,2458],{"class":1632},[1207,16072,2188],{"class":1964},[1207,16074,2003],{"class":1224},[1207,16076,2006],{"class":1964},[1207,16078,16079],{"class":1209,"line":9146},[1207,16080,2554],{"class":1632},[1207,16082,16083],{"class":1209,"line":9165},[1207,16084,1836],{"class":1620},[1207,16086,16087,16089,16091,16093,16095,16097],{"class":1209,"line":9170},[1207,16088,6953],{"class":1620},[1207,16090,1961],{"class":1632},[1207,16092,6769],{"class":1620},[1207,16094,1633],{"class":1632},[1207,16096,7368],{"class":1862},[1207,16098,1951],{"class":1632},[1207,16100,16101,16103,16105,16107,16110,16112],{"class":1209,"line":9185},[1207,16102,7375],{"class":1862},[1207,16104,1811],{"class":1632},[1207,16106,1965],{"class":1964},[1207,16108,16109],{"class":1224},"auth-login",[1207,16111,1965],{"class":1964},[1207,16113,7386],{"class":1632},[1207,16115,16116,16118,16120,16123],{"class":1209,"line":9213},[1207,16117,7391],{"class":1957},[1207,16119,1961],{"class":1632},[1207,16121,16122],{"class":1862},"login_data",[1207,16124,1973],{"class":1632},[1207,16126,16127,16129,16131,16133,16135],{"class":1209,"line":9218},[1207,16128,14284],{"class":1957},[1207,16130,1961],{"class":1632},[1207,16132,1965],{"class":1964},[1207,16134,2792],{"class":1224},[1207,16136,2006],{"class":1964},[1207,16138,16139],{"class":1209,"line":9261},[1207,16140,2012],{"class":1632},[1207,16142,16143],{"class":1209,"line":9277},[1207,16144,1836],{"class":1620},[1207,16146,16147],{"class":1209,"line":9292},[1207,16148,16149],{"class":1213},"        # Assert: Verify successful authentication\n",[1207,16151,16153,16155,16157,16159,16161,16163,16165,16167],{"class":1209,"line":16152},254,[1207,16154,2153],{"class":1616},[1207,16156,6994],{"class":1620},[1207,16158,1633],{"class":1632},[1207,16160,2772],{"class":1942},[1207,16162,2164],{"class":2163},[1207,16164,7003],{"class":1620},[1207,16166,1633],{"class":1632},[1207,16168,7009],{"class":7008},[1207,16170,16172,16174,16176,16178,16180,16182],{"class":1209,"line":16171},255,[1207,16173,7464],{"class":1620},[1207,16175,1961],{"class":1632},[1207,16177,6994],{"class":1620},[1207,16179,1633],{"class":1632},[1207,16181,2792],{"class":1862},[1207,16183,1866],{"class":1632},[1207,16185,16187,16189,16191,16194,16196,16198,16201,16204,16206,16209,16211,16213],{"class":1209,"line":16186},256,[1207,16188,2153],{"class":1616},[1207,16190,2188],{"class":1964},[1207,16192,16193],{"class":1224},"token",[1207,16195,1965],{"class":1964},[1207,16197,2983],{"class":2163},[1207,16199,16200],{"class":1620}," response_data ",[1207,16202,16203],{"class":2163},"or",[1207,16205,2188],{"class":1964},[1207,16207,16208],{"class":1224},"access_token",[1207,16210,1965],{"class":1964},[1207,16212,2983],{"class":2163},[1207,16214,7597],{"class":1620},[1207,16216,16218],{"class":1209,"line":16217},257,[1207,16219,1836],{"class":1620},[1207,16221,16223],{"class":1209,"line":16222},258,[1207,16224,16225],{"class":1213},"        # Test invalid credentials\n",[1207,16227,16229,16231,16233],{"class":1209,"line":16228},259,[1207,16230,7738],{"class":1620},[1207,16232,1961],{"class":1632},[1207,16234,2445],{"class":1632},[1207,16236,16238,16240,16242,16244,16246,16248,16250,16252],{"class":1209,"line":16237},260,[1207,16239,2451],{"class":1964},[1207,16241,2183],{"class":1224},[1207,16243,1965],{"class":1964},[1207,16245,2458],{"class":1632},[1207,16247,2188],{"class":1964},[1207,16249,15977],{"class":1224},[1207,16251,1965],{"class":1964},[1207,16253,1973],{"class":1632},[1207,16255,16257,16259,16261,16263,16265,16267,16270],{"class":1209,"line":16256},261,[1207,16258,2451],{"class":1964},[1207,16260,2495],{"class":1224},[1207,16262,1965],{"class":1964},[1207,16264,2458],{"class":1632},[1207,16266,2188],{"class":1964},[1207,16268,16269],{"class":1224},"wrongpassword",[1207,16271,2006],{"class":1964},[1207,16273,16275],{"class":1209,"line":16274},262,[1207,16276,2554],{"class":1632},[1207,16278,16280],{"class":1209,"line":16279},263,[1207,16281,1836],{"class":1620},[1207,16283,16285,16287,16289,16291,16293,16295],{"class":1209,"line":16284},264,[1207,16286,6953],{"class":1620},[1207,16288,1961],{"class":1632},[1207,16290,6769],{"class":1620},[1207,16292,1633],{"class":1632},[1207,16294,7368],{"class":1862},[1207,16296,1951],{"class":1632},[1207,16298,16300,16302,16304,16306,16308,16310],{"class":1209,"line":16299},265,[1207,16301,7375],{"class":1862},[1207,16303,1811],{"class":1632},[1207,16305,1965],{"class":1964},[1207,16307,16109],{"class":1224},[1207,16309,1965],{"class":1964},[1207,16311,7386],{"class":1632},[1207,16313,16315,16317,16319,16321],{"class":1209,"line":16314},266,[1207,16316,7391],{"class":1957},[1207,16318,1961],{"class":1632},[1207,16320,7845],{"class":1862},[1207,16322,1973],{"class":1632},[1207,16324,16326,16328,16330,16332,16334],{"class":1209,"line":16325},267,[1207,16327,14284],{"class":1957},[1207,16329,1961],{"class":1632},[1207,16331,1965],{"class":1964},[1207,16333,2792],{"class":1224},[1207,16335,2006],{"class":1964},[1207,16337,16339],{"class":1209,"line":16338},268,[1207,16340,2012],{"class":1632},[1207,16342,16344],{"class":1209,"line":16343},269,[1207,16345,1836],{"class":1620},[1207,16347,16349,16351,16353,16355,16357,16359,16361,16363],{"class":1209,"line":16348},270,[1207,16350,2153],{"class":1616},[1207,16352,6994],{"class":1620},[1207,16354,1633],{"class":1632},[1207,16356,2772],{"class":1942},[1207,16358,2164],{"class":2163},[1207,16360,7003],{"class":1620},[1207,16362,1633],{"class":1632},[1207,16364,8567],{"class":7008},[1207,16366,16368],{"class":1209,"line":16367},271,[1207,16369,1763],{"class":1620},[1207,16371,16373,16375,16377,16379,16381,16383,16386,16388,16390,16393,16395,16397],{"class":1209,"line":16372},272,[1207,16374,1791],{"class":1632},[1207,16376,1795],{"class":1794},[1207,16378,1633],{"class":1632},[1207,16380,2029],{"class":1794},[1207,16382,1633],{"class":1632},[1207,16384,16385],{"class":1794},"parametrize",[1207,16387,1811],{"class":1632},[1207,16389,3297],{"class":1964},[1207,16391,16392],{"class":1224},"user_data,expected_error",[1207,16394,3297],{"class":1964},[1207,16396,1644],{"class":1632},[1207,16398,5664],{"class":1632},[1207,16400,16402],{"class":1209,"line":16401},273,[1207,16403,16404],{"class":1213},"        # Test various validation scenarios\n",[1207,16406,16408,16411,16413,16415,16417,16419,16421,16423,16425,16427,16429,16431,16433,16435,16437,16439,16441,16443,16445,16447,16449,16452,16454,16456,16458,16460,16462],{"class":1209,"line":16407},274,[1207,16409,16410],{"class":1632},"        ({",[1207,16412,1965],{"class":1964},[1207,16414,2183],{"class":1224},[1207,16416,1965],{"class":1964},[1207,16418,2458],{"class":1632},[1207,16420,7755],{"class":1964},[1207,16422,1644],{"class":1632},[1207,16424,2188],{"class":1964},[1207,16426,2204],{"class":1224},[1207,16428,1965],{"class":1964},[1207,16430,2458],{"class":1632},[1207,16432,2188],{"class":1964},[1207,16434,1986],{"class":1224},[1207,16436,1965],{"class":1964},[1207,16438,1644],{"class":1632},[1207,16440,2188],{"class":1964},[1207,16442,2495],{"class":1224},[1207,16444,1965],{"class":1964},[1207,16446,2458],{"class":1632},[1207,16448,2188],{"class":1964},[1207,16450,16451],{"class":1224},"pass123",[1207,16453,1965],{"class":1964},[1207,16455,13140],{"class":1632},[1207,16457,2188],{"class":1964},[1207,16459,2183],{"class":1224},[1207,16461,1965],{"class":1964},[1207,16463,7386],{"class":1632},[1207,16465,16467,16469,16471,16473,16475,16477,16479,16482,16484,16486,16488,16490,16492,16494,16496,16498,16500,16502,16504,16506,16508,16510,16512,16514,16516,16518,16520,16522,16524],{"class":1209,"line":16466},275,[1207,16468,16410],{"class":1632},[1207,16470,1965],{"class":1964},[1207,16472,2183],{"class":1224},[1207,16474,1965],{"class":1964},[1207,16476,2458],{"class":1632},[1207,16478,2188],{"class":1964},[1207,16480,16481],{"class":1224},"test",[1207,16483,1965],{"class":1964},[1207,16485,1644],{"class":1632},[1207,16487,2188],{"class":1964},[1207,16489,2204],{"class":1224},[1207,16491,1965],{"class":1964},[1207,16493,2458],{"class":1632},[1207,16495,2188],{"class":1964},[1207,16497,7775],{"class":1224},[1207,16499,1965],{"class":1964},[1207,16501,1644],{"class":1632},[1207,16503,2188],{"class":1964},[1207,16505,2495],{"class":1224},[1207,16507,1965],{"class":1964},[1207,16509,2458],{"class":1632},[1207,16511,2188],{"class":1964},[1207,16513,16451],{"class":1224},[1207,16515,1965],{"class":1964},[1207,16517,13140],{"class":1632},[1207,16519,2188],{"class":1964},[1207,16521,2204],{"class":1224},[1207,16523,1965],{"class":1964},[1207,16525,7386],{"class":1632},[1207,16527,16529,16531,16533,16535,16537,16539,16541,16543,16545,16547,16549,16551,16553,16555,16557,16559,16561,16563,16565,16567,16569,16571,16573,16576,16578,16580,16582,16584,16586],{"class":1209,"line":16528},276,[1207,16530,16410],{"class":1632},[1207,16532,1965],{"class":1964},[1207,16534,2183],{"class":1224},[1207,16536,1965],{"class":1964},[1207,16538,2458],{"class":1632},[1207,16540,2188],{"class":1964},[1207,16542,16481],{"class":1224},[1207,16544,1965],{"class":1964},[1207,16546,1644],{"class":1632},[1207,16548,2188],{"class":1964},[1207,16550,2204],{"class":1224},[1207,16552,1965],{"class":1964},[1207,16554,2458],{"class":1632},[1207,16556,2188],{"class":1964},[1207,16558,1986],{"class":1224},[1207,16560,1965],{"class":1964},[1207,16562,1644],{"class":1632},[1207,16564,2188],{"class":1964},[1207,16566,2495],{"class":1224},[1207,16568,1965],{"class":1964},[1207,16570,2458],{"class":1632},[1207,16572,2188],{"class":1964},[1207,16574,16575],{"class":1224},"123",[1207,16577,1965],{"class":1964},[1207,16579,13140],{"class":1632},[1207,16581,2188],{"class":1964},[1207,16583,2495],{"class":1224},[1207,16585,1965],{"class":1964},[1207,16587,7386],{"class":1632},[1207,16589,16591,16593,16595,16597,16599,16601,16603,16605,16607,16609,16611,16613,16615,16617,16619,16621,16623,16625,16627,16629,16631,16633],{"class":1209,"line":16590},277,[1207,16592,16410],{"class":1632},[1207,16594,1965],{"class":1964},[1207,16596,2183],{"class":1224},[1207,16598,1965],{"class":1964},[1207,16600,2458],{"class":1632},[1207,16602,2188],{"class":1964},[1207,16604,16481],{"class":1224},[1207,16606,1965],{"class":1964},[1207,16608,1644],{"class":1632},[1207,16610,2188],{"class":1964},[1207,16612,2204],{"class":1224},[1207,16614,1965],{"class":1964},[1207,16616,2458],{"class":1632},[1207,16618,2188],{"class":1964},[1207,16620,1986],{"class":1224},[1207,16622,1965],{"class":1964},[1207,16624,13140],{"class":1632},[1207,16626,2188],{"class":1964},[1207,16628,2495],{"class":1224},[1207,16630,1965],{"class":1964},[1207,16632,9777],{"class":1632},[1207,16634,16635],{"class":1213},"  # Missing password\n",[1207,16637,16639],{"class":1209,"line":16638},278,[1207,16640,16641],{"class":1632},"    ])\n",[1207,16643,16645,16647,16650,16652,16654,16656,16658,16660,16663,16665,16668],{"class":1209,"line":16644},279,[1207,16646,1806],{"class":1735},[1207,16648,16649],{"class":1794}," test_user_validation_scenarios",[1207,16651,1811],{"class":1632},[1207,16653,1815],{"class":1814},[1207,16655,1644],{"class":1632},[1207,16657,6769],{"class":2051},[1207,16659,1644],{"class":1632},[1207,16661,16662],{"class":2051}," user_data",[1207,16664,1644],{"class":1632},[1207,16666,16667],{"class":2051}," expected_error",[1207,16669,1818],{"class":1632},[1207,16671,16673],{"class":1209,"line":16672},280,[1207,16674,1824],{"class":1749},[1207,16676,16678],{"class":1209,"line":16677},281,[1207,16679,16680],{"class":1756},"        Test various user validation scenarios\n",[1207,16682,16684],{"class":1209,"line":16683},282,[1207,16685,1836],{"class":1756},[1207,16687,16689],{"class":1209,"line":16688},283,[1207,16690,16691],{"class":1756},"        This parameterized test verifies that the service correctly validates\n",[1207,16693,16695],{"class":1209,"line":16694},284,[1207,16696,16697],{"class":1756},"        user input and returns appropriate error messages.\n",[1207,16699,16701],{"class":1209,"line":16700},285,[1207,16702,1824],{"class":1749},[1207,16704,16706],{"class":1209,"line":16705},286,[1207,16707,16708],{"class":1213},"        # Act: Attempt to create user with invalid data\n",[1207,16710,16712,16714,16716,16718,16720,16722],{"class":1209,"line":16711},287,[1207,16713,6953],{"class":1620},[1207,16715,1961],{"class":1632},[1207,16717,6769],{"class":1620},[1207,16719,1633],{"class":1632},[1207,16721,7368],{"class":1862},[1207,16723,1951],{"class":1632},[1207,16725,16727,16729,16731,16733,16735,16737],{"class":1209,"line":16726},288,[1207,16728,7375],{"class":1862},[1207,16730,1811],{"class":1632},[1207,16732,1965],{"class":1964},[1207,16734,6973],{"class":1224},[1207,16736,1965],{"class":1964},[1207,16738,7386],{"class":1632},[1207,16740,16742,16744,16746,16748],{"class":1209,"line":16741},289,[1207,16743,7391],{"class":1957},[1207,16745,1961],{"class":1632},[1207,16747,2583],{"class":1862},[1207,16749,1973],{"class":1632},[1207,16751,16753,16755,16757,16759,16761],{"class":1209,"line":16752},290,[1207,16754,14284],{"class":1957},[1207,16756,1961],{"class":1632},[1207,16758,1965],{"class":1964},[1207,16760,2792],{"class":1224},[1207,16762,2006],{"class":1964},[1207,16764,16766],{"class":1209,"line":16765},291,[1207,16767,2012],{"class":1632},[1207,16769,16771],{"class":1209,"line":16770},292,[1207,16772,1836],{"class":1620},[1207,16774,16776],{"class":1209,"line":16775},293,[1207,16777,16778],{"class":1213},"        # Assert: Verify validation error\n",[1207,16780,16782,16784,16786,16788,16790,16792,16794,16796],{"class":1209,"line":16781},294,[1207,16783,2153],{"class":1616},[1207,16785,6994],{"class":1620},[1207,16787,1633],{"class":1632},[1207,16789,2772],{"class":1942},[1207,16791,2164],{"class":2163},[1207,16793,7003],{"class":1620},[1207,16795,1633],{"class":1632},[1207,16797,7891],{"class":7008},[1207,16799,16801,16803,16805,16807,16809,16811],{"class":1209,"line":16800},295,[1207,16802,7905],{"class":1620},[1207,16804,1961],{"class":1632},[1207,16806,6994],{"class":1620},[1207,16808,1633],{"class":1632},[1207,16810,2792],{"class":1862},[1207,16812,1866],{"class":1632},[1207,16814,16816,16818,16821,16823],{"class":1209,"line":16815},296,[1207,16817,2153],{"class":1616},[1207,16819,16820],{"class":1620}," expected_error ",[1207,16822,5752],{"class":2163},[1207,16824,16825],{"class":1620}," error_data\n",[1026,16827,16828],{},[1045,16829,16830],{},"Key Component Testing Concepts:",[1123,16832,16833,16839,16845,16851,16856],{},[1084,16834,16835,16838],{},[1045,16836,16837],{},"Black Box Testing",": Test the service through its public interfaces without knowing internal implementation",[1084,16840,16841,16844],{},[1045,16842,16843],{},"External Dependency Mocking",": Mock all external services to test in isolation",[1084,16846,16847,16850],{},[1045,16848,16849],{},"Complete Workflows",": Test entire business processes from start to finish",[1084,16852,16853,16855],{},[1045,16854,11736],{},": Test how the service handles external failures",[1084,16857,16858,16861],{},[1045,16859,16860],{},"Parameterized Testing",": Test multiple scenarios efficiently with different inputs",[1038,16863,16865],{"id":16864},"testing-with-test-containers","Testing with Test Containers",[1026,16867,16868],{},"Test Containers is a powerful approach that uses Docker containers to provide real database and service instances for testing. Instead of mocking everything, you run actual databases, message queues, and other services in containers during tests.",[1026,16870,16871],{},[1045,16872,16873],{},"Benefits of Test Containers:",[1081,16875,16876,16882,16887,16893],{},[1084,16877,16878,16881],{},[1045,16879,16880],{},"Real Dependencies",": Test against actual databases, not mocks",[1084,16883,16884,16886],{},[1045,16885,1581],{},": Each test gets a fresh container",[1084,16888,16889,16892],{},[1045,16890,16891],{},"Consistency",": Same environment across development, CI, and production",[1084,16894,16895,16898],{},[1045,16896,16897],{},"Integration Confidence",": Higher confidence that your code works with real systems",[1197,16900,16902],{"className":1602,"code":16901,"language":1604,"meta":1202,"style":1202},"# user_service/tests/test_containers.py\nimport pytest\nimport psycopg2\nfrom testcontainers.postgres import PostgresContainer\nfrom testcontainers.redis import RedisContainer\nfrom testcontainers.compose import DockerCompose\nfrom django.test import override_settings\nfrom django.core.management import call_command\nfrom django.db import connections\nfrom user_service.services import UserService\n\n@pytest.fixture(scope='session')\ndef postgres_container():\n    \"\"\"\n    Provide a PostgreSQL container for testing\n    \n    This fixture starts a real PostgreSQL database in a Docker container.\n    The container is shared across all tests in the session for performance,\n    but each test should clean up its data.\n    \"\"\"\n    with PostgresContainer(\"postgres:13\") as postgres:\n        # The container is now running and accessible\n        yield postgres\n        # Container is automatically stopped and removed after tests\n\n@pytest.fixture(scope='session')\ndef redis_container():\n    \"\"\"\n    Provide a Redis container for testing\n    \n    This gives us a real Redis instance for testing caching and\n    session functionality.\n    \"\"\"\n    with RedisContainer(\"redis:6\") as redis:\n        yield redis\n\n@pytest.fixture(scope='session')\ndef test_database(postgres_container):\n    \"\"\"\n    Set up test database with migrations\n    \n    This fixture:\n    1. Configures Django to use the test PostgreSQL container\n    2. Runs database migrations\n    3. Provides a clean database for tests\n    \"\"\"\n    # Get connection details from the container\n    db_url = postgres_container.get_connection_url()\n    \n    # Override Django database settings to use the container\n    with override_settings(\n        DATABASES={\n            'default': {\n                'ENGINE': 'django.db.backends.postgresql',\n                'NAME': postgres_container.POSTGRES_DB,\n                'USER': postgres_container.POSTGRES_USER,\n                'PASSWORD': postgres_container.POSTGRES_PASSWORD,\n                'HOST': postgres_container.get_container_host_ip(),\n                'PORT': postgres_container.get_exposed_port(5432),\n            }\n        }\n    ):\n        # Run database migrations\n        call_command('migrate', verbosity=0, interactive=False)\n        yield\n        \n        # Cleanup: Drop all tables after tests\n        # This ensures a clean state for other test sessions\n        call_command('flush', verbosity=0, interactive=False)\n\n@pytest.fixture\ndef redis_cache(redis_container):\n    \"\"\"\n    Configure Django to use the Redis container for caching\n    \"\"\"\n    redis_url = f\"redis://{redis_container.get_container_host_ip()}:{redis_container.get_exposed_port(6379)}/0\"\n    \n    with override_settings(\n        CACHES={\n            'default': {\n                'BACKEND': 'django_redis.cache.RedisCache',\n                'LOCATION': redis_url,\n                'OPTIONS': {\n                    'CLIENT_CLASS': 'django_redis.client.DefaultClient',\n                }\n            }\n        }\n    ):\n        yield redis_url\n\n@pytest.mark.integration\ndef test_user_service_with_real_database(test_database, postgres_container):\n    \"\"\"\n    Test user service with real PostgreSQL database\n    \n    This test uses an actual PostgreSQL database running in a container,\n    giving us confidence that our code works with real database operations,\n    transactions, and constraints.\n    \"\"\"\n    service = UserService()\n    \n    # Test user creation with real database\n    user_data = {\n        'username': 'dbuser',\n        'email': 'db@example.com',\n        'password': 'testpass123',\n        'first_name': 'Database',\n        'last_name': 'User'\n    }\n    \n    # Act: Create user\n    user = service.create_user(user_data)\n    \n    # Assert: Verify user was created\n    assert user.id is not None\n    assert user.username == 'dbuser'\n    \n    # Verify user was actually saved to database by retrieving it\n    retrieved_user = service.get_user_by_id(user.id)\n    assert retrieved_user.username == 'dbuser'\n    assert retrieved_user.email == 'db@example.com'\n    \n    # Test database constraints (e.g., unique username)\n    duplicate_data = user_data.copy()\n    with pytest.raises(Exception):  # Should raise integrity error\n        service.create_user(duplicate_data)\n\n@pytest.mark.integration\ndef test_user_caching_with_real_redis(test_database, redis_cache):\n    \"\"\"\n    Test user caching with real Redis instance\n    \n    This test verifies that caching works correctly with a real Redis\n    instance, including cache hits, misses, and invalidation.\n    \"\"\"\n    from django.core.cache import cache\n    \n    service = UserService()\n    \n    # Create a user\n    user_data = {\n        'username': 'cacheuser',\n        'email': 'cache@example.com',\n        'password': 'testpass123'\n    }\n    user = service.create_user(user_data)\n    \n    # Test caching\n    cache_key = f'user:{user.id}'\n    \n    # First access - should be a cache miss\n    cached_user = cache.get(cache_key)\n    assert cached_user is None\n    \n    # Cache the user\n    cache.set(cache_key, user, 300)  # Cache for 5 minutes\n    \n    # Second access - should be a cache hit\n    cached_user = cache.get(cache_key)\n    assert cached_user is not None\n    assert cached_user.username == 'cacheuser'\n    \n    # Test cache invalidation\n    cache.delete(cache_key)\n    cached_user = cache.get(cache_key)\n    assert cached_user is None\n\n@pytest.fixture(scope='session')\ndef microservices_environment():\n    \"\"\"\n    Set up a complete microservices environment using Docker Compose\n    \n    This fixture starts multiple services (database, cache, message queue)\n    that your microservice depends on, creating a realistic test environment.\n    \"\"\"\n    with DockerCompose(\".\", compose_file_name=\"docker-compose.test.yml\") as compose:\n        # Wait for services to be ready\n        compose.wait_for(\"http://localhost:5432\")  # PostgreSQL\n        compose.wait_for(\"http://localhost:6379\")  # Redis\n        compose.wait_for(\"http://localhost:5672\")  # RabbitMQ\n        \n        yield compose\n\n@pytest.mark.integration\ndef test_complete_user_workflow_with_dependencies(microservices_environment):\n    \"\"\"\n    Test complete user workflow with all dependencies running\n    \n    This test runs against a complete microservices environment with\n    real databases, caches, and message queues.\n    \"\"\"\n    service = UserService()\n    \n    # Test user creation with all dependencies\n    user_data = {\n        'username': 'fullworkflow',\n        'email': 'workflow@example.com',\n        'password': 'testpass123'\n    }\n    \n    # This should:\n    # 1. Save user to PostgreSQL\n    # 2. Cache user data in Redis\n    # 3. Send message to RabbitMQ for notifications\n    user = service.create_user_with_full_workflow(user_data)\n    \n    assert user.username == 'fullworkflow'\n    \n    # Verify user is in database\n    from django.contrib.auth.models import User\n    db_user = User.objects.get(id=user.id)\n    assert db_user.username == 'fullworkflow'\n    \n    # Verify user is cached\n    from django.core.cache import cache\n    cached_user = cache.get(f'user:{user.id}')\n    assert cached_user is not None\n    \n    # Verify message was sent (you'd need to check RabbitMQ queue)\n    # This would require additional setup to inspect message queues\n\nclass TestUserServicePerformance:\n    \"\"\"\n    Performance tests using real databases\n    \n    These tests verify that your service performs well under load\n    with real database operations.\n    \"\"\"\n    \n    @pytest.mark.integration\n    @pytest.mark.slow\n    def test_bulk_user_creation_performance(self, test_database):\n        \"\"\"\n        Test performance of bulk user creation\n        \n        This test creates many users and measures performance,\n        helping identify bottlenecks in database operations.\n        \"\"\"\n        import time\n        \n        service = UserService()\n        \n        # Prepare data for 1000 users\n        users_data = [\n            {\n                'username': f'perfuser{i}',\n                'email': f'perf{i}@example.com',\n                'password': 'testpass123'\n            }\n            for i in range(1000)\n        ]\n        \n        # Measure time for bulk creation\n        start_time = time.time()\n        created_users = service.create_users_bulk(users_data)\n        end_time = time.time()\n        \n        # Assert performance expectations\n        creation_time = end_time - start_time\n        assert len(created_users) == 1000\n        assert creation_time \u003C 10.0  # Should complete in under 10 seconds\n        \n        # Verify all users were created correctly\n        from django.contrib.auth.models import User\n        assert User.objects.count() == 1000\n    \n    @pytest.mark.integration\n    def test_concurrent_user_operations(self, test_database):\n        \"\"\"\n        Test concurrent user operations for race conditions\n        \n        This test simulates multiple concurrent requests to identify\n        race conditions and database locking issues.\n        \"\"\"\n        import threading\n        import time\n        \n        service = UserService()\n        results = []\n        errors = []\n        \n        def create_user(index):\n            try:\n                user_data = {\n                    'username': f'concurrent{index}',\n                    'email': f'concurrent{index}@example.com',\n                    'password': 'testpass123'\n                }\n                user = service.create_user(user_data)\n                results.append(user)\n            except Exception as e:\n                errors.append(e)\n        \n        # Create 10 threads to simulate concurrent requests\n        threads = []\n        for i in range(10):\n            thread = threading.Thread(target=create_user, args=(i,))\n            threads.append(thread)\n        \n        # Start all threads\n        for thread in threads:\n            thread.start()\n        \n        # Wait for all threads to complete\n        for thread in threads:\n            thread.join()\n        \n        # Assert all operations completed successfully\n        assert len(results) == 10\n        assert len(errors) == 0\n        \n        # Verify all users were created with unique usernames\n        usernames = [user.username for user in results]\n        assert len(set(usernames)) == 10  # All unique\n",[1204,16903,16904,16909,16915,16922,16939,16955,16971,16985,17005,17020,17034,17038,17062,17071,17075,17080,17084,17089,17094,17099,17103,17128,17133,17141,17146,17150,17174,17183,17187,17192,17196,17201,17206,17210,17235,17242,17246,17270,17284,17288,17293,17297,17302,17307,17312,17317,17321,17326,17342,17346,17351,17360,17368,17381,17401,17421,17441,17461,17482,17507,17511,17515,17520,17525,17560,17565,17569,17574,17579,17610,17614,17624,17638,17642,17647,17651,17697,17701,17709,17716,17728,17748,17764,17777,17798,17803,17807,17811,17815,17822,17826,17841,17859,17863,17868,17872,17877,17882,17887,17891,17902,17906,17911,17919,17938,17957,17975,17994,18010,18014,18018,18023,18041,18045,18050,18066,18084,18088,18093,18116,18135,18153,18157,18162,18178,18198,18214,18218,18232,18249,18253,18258,18262,18267,18272,18276,18297,18301,18311,18315,18320,18328,18347,18366,18382,18386,18404,18408,18413,18437,18441,18446,18467,18478,18482,18487,18515,18519,18524,18542,18554,18573,18577,18582,18596,18614,18624,18628,18652,18661,18665,18670,18674,18679,18684,18688,18726,18731,18755,18777,18799,18803,18810,18814,18828,18842,18846,18851,18855,18860,18865,18869,18879,18883,18888,18896,18915,18934,18950,18954,18958,18963,18968,18973,18978,18997,19001,19019,19023,19028,19050,19081,19099,19103,19108,19126,19158,19170,19174,19179,19184,19188,19197,19201,19206,19210,19215,19220,19224,19228,19242,19257,19274,19278,19283,19287,19292,19297,19301,19309,19313,19323,19327,19332,19340,19344,19369,19394,19410,19414,19431,19435,19439,19444,19461,19479,19494,19498,19503,19518,19535,19551,19555,19560,19582,19602,19606,19620,19637,19641,19646,19650,19655,19660,19664,19671,19677,19681,19691,19700,19709,19713,19728,19735,19744,19769,19793,19809,19813,19832,19847,19860,19875,19879,19884,19893,19910,19948,19965,19970,19976,19991,20004,20009,20015,20028,20040,20045,20051,20069,20087,20092,20098,20124],{"__ignoreMap":1202},[1207,16905,16906],{"class":1209,"line":1210},[1207,16907,16908],{"class":1213},"# user_service/tests/test_containers.py\n",[1207,16910,16911,16913],{"class":1209,"line":1217},[1207,16912,1617],{"class":1616},[1207,16914,1621],{"class":1620},[1207,16916,16917,16919],{"class":1209,"line":1238},[1207,16918,1617],{"class":1616},[1207,16920,16921],{"class":1620}," psycopg2\n",[1207,16923,16924,16926,16929,16931,16934,16936],{"class":1209,"line":1254},[1207,16925,1626],{"class":1616},[1207,16927,16928],{"class":1620}," testcontainers",[1207,16930,1633],{"class":1632},[1207,16932,16933],{"class":1620},"postgres ",[1207,16935,1617],{"class":1616},[1207,16937,16938],{"class":1620}," PostgresContainer\n",[1207,16940,16941,16943,16945,16947,16950,16952],{"class":1209,"line":1270},[1207,16942,1626],{"class":1616},[1207,16944,16928],{"class":1620},[1207,16946,1633],{"class":1632},[1207,16948,16949],{"class":1620},"redis ",[1207,16951,1617],{"class":1616},[1207,16953,16954],{"class":1620}," RedisContainer\n",[1207,16956,16957,16959,16961,16963,16966,16968],{"class":1209,"line":1535},[1207,16958,1626],{"class":1616},[1207,16960,16928],{"class":1620},[1207,16962,1633],{"class":1632},[1207,16964,16965],{"class":1620},"compose ",[1207,16967,1617],{"class":1616},[1207,16969,16970],{"class":1620}," DockerCompose\n",[1207,16972,16973,16975,16977,16979,16981,16983],{"class":1209,"line":1710},[1207,16974,1626],{"class":1616},[1207,16976,1654],{"class":1620},[1207,16978,1633],{"class":1632},[1207,16980,1659],{"class":1620},[1207,16982,1617],{"class":1616},[1207,16984,11786],{"class":1620},[1207,16986,16987,16989,16991,16993,16995,16997,17000,17002],{"class":1209,"line":1727},[1207,16988,1626],{"class":1616},[1207,16990,1654],{"class":1620},[1207,16992,1633],{"class":1632},[1207,16994,3664],{"class":1620},[1207,16996,1633],{"class":1632},[1207,16998,16999],{"class":1620},"management ",[1207,17001,1617],{"class":1616},[1207,17003,17004],{"class":1620}," call_command\n",[1207,17006,17007,17009,17011,17013,17015,17017],{"class":1209,"line":1732},[1207,17008,1626],{"class":1616},[1207,17010,1654],{"class":1620},[1207,17012,1633],{"class":1632},[1207,17014,4699],{"class":1620},[1207,17016,1617],{"class":1616},[1207,17018,17019],{"class":1620}," connections\n",[1207,17021,17022,17024,17026,17028,17030,17032],{"class":1209,"line":1746},[1207,17023,1626],{"class":1616},[1207,17025,1697],{"class":1620},[1207,17027,1633],{"class":1632},[1207,17029,1702],{"class":1620},[1207,17031,1617],{"class":1616},[1207,17033,1707],{"class":1620},[1207,17035,17036],{"class":1209,"line":1753},[1207,17037,1527],{"emptyLinePlaceholder":1526},[1207,17039,17040,17042,17044,17046,17048,17050,17052,17054,17056,17058,17060],{"class":1209,"line":1760},[1207,17041,3707],{"class":1632},[1207,17043,1795],{"class":1794},[1207,17045,1633],{"class":1632},[1207,17047,9511],{"class":1794},[1207,17049,1811],{"class":1632},[1207,17051,9516],{"class":1957},[1207,17053,1961],{"class":1632},[1207,17055,1965],{"class":1964},[1207,17057,9523],{"class":1224},[1207,17059,1965],{"class":1964},[1207,17061,2136],{"class":1632},[1207,17063,17064,17066,17069],{"class":1209,"line":1766},[1207,17065,9532],{"class":1735},[1207,17067,17068],{"class":1794}," postgres_container",[1207,17070,9538],{"class":1632},[1207,17072,17073],{"class":1209,"line":1772},[1207,17074,1750],{"class":1749},[1207,17076,17077],{"class":1209,"line":1778},[1207,17078,17079],{"class":1756},"    Provide a PostgreSQL container for testing\n",[1207,17081,17082],{"class":1209,"line":1783},[1207,17083,1763],{"class":1756},[1207,17085,17086],{"class":1209,"line":1788},[1207,17087,17088],{"class":1756},"    This fixture starts a real PostgreSQL database in a Docker container.\n",[1207,17090,17091],{"class":1209,"line":1803},[1207,17092,17093],{"class":1756},"    The container is shared across all tests in the session for performance,\n",[1207,17095,17096],{"class":1209,"line":1821},[1207,17097,17098],{"class":1756},"    but each test should clean up its data.\n",[1207,17100,17101],{"class":1209,"line":1827},[1207,17102,1750],{"class":1749},[1207,17104,17105,17107,17110,17112,17114,17117,17119,17121,17123,17126],{"class":1209,"line":1833},[1207,17106,10135],{"class":1616},[1207,17108,17109],{"class":1862}," PostgresContainer",[1207,17111,1811],{"class":1632},[1207,17113,3297],{"class":1964},[1207,17115,17116],{"class":1224},"postgres:13",[1207,17118,3297],{"class":1964},[1207,17120,2328],{"class":1632},[1207,17122,13173],{"class":1616},[1207,17124,17125],{"class":1620}," postgres",[1207,17127,1743],{"class":1632},[1207,17129,17130],{"class":1209,"line":1839},[1207,17131,17132],{"class":1213},"        # The container is now running and accessible\n",[1207,17134,17135,17138],{"class":1209,"line":1845},[1207,17136,17137],{"class":1616},"        yield",[1207,17139,17140],{"class":1620}," postgres\n",[1207,17142,17143],{"class":1209,"line":1851},[1207,17144,17145],{"class":1213},"        # Container is automatically stopped and removed after tests\n",[1207,17147,17148],{"class":1209,"line":1856},[1207,17149,1527],{"emptyLinePlaceholder":1526},[1207,17151,17152,17154,17156,17158,17160,17162,17164,17166,17168,17170,17172],{"class":1209,"line":1869},[1207,17153,3707],{"class":1632},[1207,17155,1795],{"class":1794},[1207,17157,1633],{"class":1632},[1207,17159,9511],{"class":1794},[1207,17161,1811],{"class":1632},[1207,17163,9516],{"class":1957},[1207,17165,1961],{"class":1632},[1207,17167,1965],{"class":1964},[1207,17169,9523],{"class":1224},[1207,17171,1965],{"class":1964},[1207,17173,2136],{"class":1632},[1207,17175,17176,17178,17181],{"class":1209,"line":1874},[1207,17177,9532],{"class":1735},[1207,17179,17180],{"class":1794}," redis_container",[1207,17182,9538],{"class":1632},[1207,17184,17185],{"class":1209,"line":1885},[1207,17186,1750],{"class":1749},[1207,17188,17189],{"class":1209,"line":1899},[1207,17190,17191],{"class":1756},"    Provide a Redis container for testing\n",[1207,17193,17194],{"class":1209,"line":1904},[1207,17195,1763],{"class":1756},[1207,17197,17198],{"class":1209,"line":1910},[1207,17199,17200],{"class":1756},"    This gives us a real Redis instance for testing caching and\n",[1207,17202,17203],{"class":1209,"line":1915},[1207,17204,17205],{"class":1756},"    session functionality.\n",[1207,17207,17208],{"class":1209,"line":1921},[1207,17209,1750],{"class":1749},[1207,17211,17212,17214,17217,17219,17221,17224,17226,17228,17230,17233],{"class":1209,"line":1927},[1207,17213,10135],{"class":1616},[1207,17215,17216],{"class":1862}," RedisContainer",[1207,17218,1811],{"class":1632},[1207,17220,3297],{"class":1964},[1207,17222,17223],{"class":1224},"redis:6",[1207,17225,3297],{"class":1964},[1207,17227,2328],{"class":1632},[1207,17229,13173],{"class":1616},[1207,17231,17232],{"class":1620}," redis",[1207,17234,1743],{"class":1632},[1207,17236,17237,17239],{"class":1209,"line":1932},[1207,17238,17137],{"class":1616},[1207,17240,17241],{"class":1620}," redis\n",[1207,17243,17244],{"class":1209,"line":1954},[1207,17245,1527],{"emptyLinePlaceholder":1526},[1207,17247,17248,17250,17252,17254,17256,17258,17260,17262,17264,17266,17268],{"class":1209,"line":1976},[1207,17249,3707],{"class":1632},[1207,17251,1795],{"class":1794},[1207,17253,1633],{"class":1632},[1207,17255,9511],{"class":1794},[1207,17257,1811],{"class":1632},[1207,17259,9516],{"class":1957},[1207,17261,1961],{"class":1632},[1207,17263,1965],{"class":1964},[1207,17265,9523],{"class":1224},[1207,17267,1965],{"class":1964},[1207,17269,2136],{"class":1632},[1207,17271,17272,17274,17277,17279,17282],{"class":1209,"line":1993},[1207,17273,9532],{"class":1735},[1207,17275,17276],{"class":1794}," test_database",[1207,17278,1811],{"class":1632},[1207,17280,17281],{"class":2051},"postgres_container",[1207,17283,1818],{"class":1632},[1207,17285,17286],{"class":1209,"line":2009},[1207,17287,1750],{"class":1749},[1207,17289,17290],{"class":1209,"line":2015},[1207,17291,17292],{"class":1756},"    Set up test database with migrations\n",[1207,17294,17295],{"class":1209,"line":2020},[1207,17296,1763],{"class":1756},[1207,17298,17299],{"class":1209,"line":2037},[1207,17300,17301],{"class":1756},"    This fixture:\n",[1207,17303,17304],{"class":1209,"line":2060},[1207,17305,17306],{"class":1756},"    1. Configures Django to use the test PostgreSQL container\n",[1207,17308,17309],{"class":1209,"line":2065},[1207,17310,17311],{"class":1756},"    2. Runs database migrations\n",[1207,17313,17314],{"class":1209,"line":2071},[1207,17315,17316],{"class":1756},"    3. Provides a clean database for tests\n",[1207,17318,17319],{"class":1209,"line":2076},[1207,17320,1750],{"class":1749},[1207,17322,17323],{"class":1209,"line":2082},[1207,17324,17325],{"class":1213},"    # Get connection details from the container\n",[1207,17327,17328,17331,17333,17335,17337,17340],{"class":1209,"line":2088},[1207,17329,17330],{"class":1620},"    db_url ",[1207,17332,1961],{"class":1632},[1207,17334,17068],{"class":1620},[1207,17336,1633],{"class":1632},[1207,17338,17339],{"class":1862},"get_connection_url",[1207,17341,1866],{"class":1632},[1207,17343,17344],{"class":1209,"line":2094},[1207,17345,1763],{"class":1620},[1207,17347,17348],{"class":1209,"line":2100},[1207,17349,17350],{"class":1213},"    # Override Django database settings to use the container\n",[1207,17352,17353,17355,17358],{"class":1209,"line":2105},[1207,17354,10135],{"class":1616},[1207,17356,17357],{"class":1862}," override_settings",[1207,17359,1951],{"class":1632},[1207,17361,17362,17365],{"class":1209,"line":2111},[1207,17363,17364],{"class":1957},"        DATABASES",[1207,17366,17367],{"class":1632},"={\n",[1207,17369,17370,17372,17375,17377,17379],{"class":1209,"line":2139},[1207,17371,2451],{"class":1964},[1207,17373,17374],{"class":1224},"default",[1207,17376,1965],{"class":1964},[1207,17378,2458],{"class":1632},[1207,17380,2445],{"class":1632},[1207,17382,17383,17385,17388,17390,17392,17394,17397,17399],{"class":1209,"line":2144},[1207,17384,4969],{"class":1964},[1207,17386,17387],{"class":1224},"ENGINE",[1207,17389,1965],{"class":1964},[1207,17391,2458],{"class":1632},[1207,17393,2188],{"class":1964},[1207,17395,17396],{"class":1224},"django.db.backends.postgresql",[1207,17398,1965],{"class":1964},[1207,17400,1973],{"class":1632},[1207,17402,17403,17405,17408,17410,17412,17414,17416,17419],{"class":1209,"line":2150},[1207,17404,4969],{"class":1964},[1207,17406,17407],{"class":1224},"NAME",[1207,17409,1965],{"class":1964},[1207,17411,2458],{"class":1632},[1207,17413,17068],{"class":1862},[1207,17415,1633],{"class":1632},[1207,17417,17418],{"class":7008},"POSTGRES_DB",[1207,17420,1973],{"class":1632},[1207,17422,17423,17425,17428,17430,17432,17434,17436,17439],{"class":1209,"line":2174},[1207,17424,4969],{"class":1964},[1207,17426,17427],{"class":1224},"USER",[1207,17429,1965],{"class":1964},[1207,17431,2458],{"class":1632},[1207,17433,17068],{"class":1862},[1207,17435,1633],{"class":1632},[1207,17437,17438],{"class":7008},"POSTGRES_USER",[1207,17440,1973],{"class":1632},[1207,17442,17443,17445,17448,17450,17452,17454,17456,17459],{"class":1209,"line":2195},[1207,17444,4969],{"class":1964},[1207,17446,17447],{"class":1224},"PASSWORD",[1207,17449,1965],{"class":1964},[1207,17451,2458],{"class":1632},[1207,17453,17068],{"class":1862},[1207,17455,1633],{"class":1632},[1207,17457,17458],{"class":7008},"POSTGRES_PASSWORD",[1207,17460,1973],{"class":1632},[1207,17462,17463,17465,17468,17470,17472,17474,17476,17479],{"class":1209,"line":2215},[1207,17464,4969],{"class":1964},[1207,17466,17467],{"class":1224},"HOST",[1207,17469,1965],{"class":1964},[1207,17471,2458],{"class":1632},[1207,17473,17068],{"class":1862},[1207,17475,1633],{"class":1632},[1207,17477,17478],{"class":1862},"get_container_host_ip",[1207,17480,17481],{"class":1632},"(),\n",[1207,17483,17484,17486,17489,17491,17493,17495,17497,17500,17502,17505],{"class":1209,"line":2220},[1207,17485,4969],{"class":1964},[1207,17487,17488],{"class":1224},"PORT",[1207,17490,1965],{"class":1964},[1207,17492,2458],{"class":1632},[1207,17494,17068],{"class":1862},[1207,17496,1633],{"class":1632},[1207,17498,17499],{"class":1862},"get_exposed_port",[1207,17501,1811],{"class":1632},[1207,17503,17504],{"class":1231},"5432",[1207,17506,7386],{"class":1632},[1207,17508,17509],{"class":1209,"line":2235},[1207,17510,5006],{"class":1632},[1207,17512,17513],{"class":1209,"line":2253},[1207,17514,2554],{"class":1632},[1207,17516,17517],{"class":1209,"line":2258},[1207,17518,17519],{"class":1632},"    ):\n",[1207,17521,17522],{"class":1209,"line":2264},[1207,17523,17524],{"class":1213},"        # Run database migrations\n",[1207,17526,17527,17530,17532,17534,17537,17539,17541,17544,17546,17548,17550,17553,17555,17558],{"class":1209,"line":2269},[1207,17528,17529],{"class":1862},"        call_command",[1207,17531,1811],{"class":1632},[1207,17533,1965],{"class":1964},[1207,17535,17536],{"class":1224},"migrate",[1207,17538,1965],{"class":1964},[1207,17540,1644],{"class":1632},[1207,17542,17543],{"class":1957}," verbosity",[1207,17545,1961],{"class":1632},[1207,17547,2992],{"class":1231},[1207,17549,1644],{"class":1632},[1207,17551,17552],{"class":1957}," interactive",[1207,17554,1961],{"class":1632},[1207,17556,17557],{"class":2813},"False",[1207,17559,2136],{"class":1632},[1207,17561,17562],{"class":1209,"line":2275},[1207,17563,17564],{"class":1616},"        yield\n",[1207,17566,17567],{"class":1209,"line":2281},[1207,17568,1836],{"class":1620},[1207,17570,17571],{"class":1209,"line":2286},[1207,17572,17573],{"class":1213},"        # Cleanup: Drop all tables after tests\n",[1207,17575,17576],{"class":1209,"line":2292},[1207,17577,17578],{"class":1213},"        # This ensures a clean state for other test sessions\n",[1207,17580,17581,17583,17585,17587,17590,17592,17594,17596,17598,17600,17602,17604,17606,17608],{"class":1209,"line":2313},[1207,17582,17529],{"class":1862},[1207,17584,1811],{"class":1632},[1207,17586,1965],{"class":1964},[1207,17588,17589],{"class":1224},"flush",[1207,17591,1965],{"class":1964},[1207,17593,1644],{"class":1632},[1207,17595,17543],{"class":1957},[1207,17597,1961],{"class":1632},[1207,17599,2992],{"class":1231},[1207,17601,1644],{"class":1632},[1207,17603,17552],{"class":1957},[1207,17605,1961],{"class":1632},[1207,17607,17557],{"class":2813},[1207,17609,2136],{"class":1632},[1207,17611,17612],{"class":1209,"line":2334},[1207,17613,1527],{"emptyLinePlaceholder":1526},[1207,17615,17616,17618,17620,17622],{"class":1209,"line":2339},[1207,17617,3707],{"class":1632},[1207,17619,1795],{"class":1794},[1207,17621,1633],{"class":1632},[1207,17623,1800],{"class":1794},[1207,17625,17626,17628,17631,17633,17636],{"class":1209,"line":2358},[1207,17627,9532],{"class":1735},[1207,17629,17630],{"class":1794}," redis_cache",[1207,17632,1811],{"class":1632},[1207,17634,17635],{"class":2051},"redis_container",[1207,17637,1818],{"class":1632},[1207,17639,17640],{"class":1209,"line":2381},[1207,17641,1750],{"class":1749},[1207,17643,17644],{"class":1209,"line":2386},[1207,17645,17646],{"class":1756},"    Configure Django to use the Redis container for caching\n",[1207,17648,17649],{"class":1209,"line":2392},[1207,17650,1750],{"class":1749},[1207,17652,17653,17656,17658,17660,17663,17665,17667,17669,17671,17673,17675,17677,17679,17681,17683,17685,17687,17690,17692,17694],{"class":1209,"line":2397},[1207,17654,17655],{"class":1620},"    redis_url ",[1207,17657,1961],{"class":1632},[1207,17659,3281],{"class":1735},[1207,17661,17662],{"class":1224},"\"redis://",[1207,17664,3288],{"class":3287},[1207,17666,17635],{"class":1620},[1207,17668,1633],{"class":1632},[1207,17670,17478],{"class":1862},[1207,17672,4156],{"class":1632},[1207,17674,3294],{"class":3287},[1207,17676,2458],{"class":1224},[1207,17678,3288],{"class":3287},[1207,17680,17635],{"class":1620},[1207,17682,1633],{"class":1632},[1207,17684,17499],{"class":1862},[1207,17686,1811],{"class":1632},[1207,17688,17689],{"class":1231},"6379",[1207,17691,2328],{"class":1632},[1207,17693,3294],{"class":3287},[1207,17695,17696],{"class":1224},"/0\"\n",[1207,17698,17699],{"class":1209,"line":2403},[1207,17700,1763],{"class":1620},[1207,17702,17703,17705,17707],{"class":1209,"line":2409},[1207,17704,10135],{"class":1616},[1207,17706,17357],{"class":1862},[1207,17708,1951],{"class":1632},[1207,17710,17711,17714],{"class":1209,"line":2414},[1207,17712,17713],{"class":1957},"        CACHES",[1207,17715,17367],{"class":1632},[1207,17717,17718,17720,17722,17724,17726],{"class":1209,"line":2420},[1207,17719,2451],{"class":1964},[1207,17721,17374],{"class":1224},[1207,17723,1965],{"class":1964},[1207,17725,2458],{"class":1632},[1207,17727,2445],{"class":1632},[1207,17729,17730,17732,17735,17737,17739,17741,17744,17746],{"class":1209,"line":2426},[1207,17731,4969],{"class":1964},[1207,17733,17734],{"class":1224},"BACKEND",[1207,17736,1965],{"class":1964},[1207,17738,2458],{"class":1632},[1207,17740,2188],{"class":1964},[1207,17742,17743],{"class":1224},"django_redis.cache.RedisCache",[1207,17745,1965],{"class":1964},[1207,17747,1973],{"class":1632},[1207,17749,17750,17752,17755,17757,17759,17762],{"class":1209,"line":2431},[1207,17751,4969],{"class":1964},[1207,17753,17754],{"class":1224},"LOCATION",[1207,17756,1965],{"class":1964},[1207,17758,2458],{"class":1632},[1207,17760,17761],{"class":1862}," redis_url",[1207,17763,1973],{"class":1632},[1207,17765,17766,17768,17771,17773,17775],{"class":1209,"line":2437},[1207,17767,4969],{"class":1964},[1207,17769,17770],{"class":1224},"OPTIONS",[1207,17772,1965],{"class":1964},[1207,17774,2458],{"class":1632},[1207,17776,2445],{"class":1632},[1207,17778,17779,17782,17785,17787,17789,17791,17794,17796],{"class":1209,"line":2448},[1207,17780,17781],{"class":1964},"                    '",[1207,17783,17784],{"class":1224},"CLIENT_CLASS",[1207,17786,1965],{"class":1964},[1207,17788,2458],{"class":1632},[1207,17790,2188],{"class":1964},[1207,17792,17793],{"class":1224},"django_redis.client.DefaultClient",[1207,17795,1965],{"class":1964},[1207,17797,1973],{"class":1632},[1207,17799,17800],{"class":1209,"line":2470},[1207,17801,17802],{"class":1632},"                }\n",[1207,17804,17805],{"class":1209,"line":2490},[1207,17806,5006],{"class":1632},[1207,17808,17809],{"class":1209,"line":2511},[1207,17810,2554],{"class":1632},[1207,17812,17813],{"class":1209,"line":2532},[1207,17814,17519],{"class":1632},[1207,17816,17817,17819],{"class":1209,"line":2551},[1207,17818,17137],{"class":1616},[1207,17820,17821],{"class":1620}," redis_url\n",[1207,17823,17824],{"class":1209,"line":2557},[1207,17825,1527],{"emptyLinePlaceholder":1526},[1207,17827,17828,17830,17832,17834,17836,17838],{"class":1209,"line":2562},[1207,17829,3707],{"class":1632},[1207,17831,1795],{"class":1794},[1207,17833,1633],{"class":1632},[1207,17835,2029],{"class":1794},[1207,17837,1633],{"class":1632},[1207,17839,17840],{"class":1794},"integration\n",[1207,17842,17843,17845,17848,17850,17853,17855,17857],{"class":1209,"line":2567},[1207,17844,9532],{"class":1735},[1207,17846,17847],{"class":1794}," test_user_service_with_real_database",[1207,17849,1811],{"class":1632},[1207,17851,17852],{"class":2051},"test_database",[1207,17854,1644],{"class":1632},[1207,17856,17068],{"class":2051},[1207,17858,1818],{"class":1632},[1207,17860,17861],{"class":1209,"line":2588},[1207,17862,1750],{"class":1749},[1207,17864,17865],{"class":1209,"line":2593},[1207,17866,17867],{"class":1756},"    Test user service with real PostgreSQL database\n",[1207,17869,17870],{"class":1209,"line":2599},[1207,17871,1763],{"class":1756},[1207,17873,17874],{"class":1209,"line":2619},[1207,17875,17876],{"class":1756},"    This test uses an actual PostgreSQL database running in a container,\n",[1207,17878,17879],{"class":1209,"line":2624},[1207,17880,17881],{"class":1756},"    giving us confidence that our code works with real database operations,\n",[1207,17883,17884],{"class":1209,"line":2630},[1207,17885,17886],{"class":1756},"    transactions, and constraints.\n",[1207,17888,17889],{"class":1209,"line":2652},[1207,17890,1750],{"class":1749},[1207,17892,17893,17896,17898,17900],{"class":1209,"line":2657},[1207,17894,17895],{"class":1620},"    service ",[1207,17897,1961],{"class":1632},[1207,17899,1863],{"class":1862},[1207,17901,1866],{"class":1632},[1207,17903,17904],{"class":1209,"line":2675},[1207,17905,1763],{"class":1620},[1207,17907,17908],{"class":1209,"line":2702},[1207,17909,17910],{"class":1213},"    # Test user creation with real database\n",[1207,17912,17913,17915,17917],{"class":1209,"line":2707},[1207,17914,10306],{"class":1620},[1207,17916,1961],{"class":1632},[1207,17918,2445],{"class":1632},[1207,17920,17921,17923,17925,17927,17929,17931,17934,17936],{"class":1209,"line":2713},[1207,17922,9762],{"class":1964},[1207,17924,2183],{"class":1224},[1207,17926,1965],{"class":1964},[1207,17928,2458],{"class":1632},[1207,17930,2188],{"class":1964},[1207,17932,17933],{"class":1224},"dbuser",[1207,17935,1965],{"class":1964},[1207,17937,1973],{"class":1632},[1207,17939,17940,17942,17944,17946,17948,17950,17953,17955],{"class":1209,"line":2718},[1207,17941,9762],{"class":1964},[1207,17943,2204],{"class":1224},[1207,17945,1965],{"class":1964},[1207,17947,2458],{"class":1632},[1207,17949,2188],{"class":1964},[1207,17951,17952],{"class":1224},"db@example.com",[1207,17954,1965],{"class":1964},[1207,17956,1973],{"class":1632},[1207,17958,17959,17961,17963,17965,17967,17969,17971,17973],{"class":1209,"line":2724},[1207,17960,9762],{"class":1964},[1207,17962,2495],{"class":1224},[1207,17964,1965],{"class":1964},[1207,17966,2458],{"class":1632},[1207,17968,2188],{"class":1964},[1207,17970,2003],{"class":1224},[1207,17972,1965],{"class":1964},[1207,17974,1973],{"class":1632},[1207,17976,17977,17979,17981,17983,17985,17987,17990,17992],{"class":1209,"line":2730},[1207,17978,9762],{"class":1964},[1207,17980,2516],{"class":1224},[1207,17982,1965],{"class":1964},[1207,17984,2458],{"class":1632},[1207,17986,2188],{"class":1964},[1207,17988,17989],{"class":1224},"Database",[1207,17991,1965],{"class":1964},[1207,17993,1973],{"class":1632},[1207,17995,17996,17998,18000,18002,18004,18006,18008],{"class":1209,"line":2736},[1207,17997,9762],{"class":1964},[1207,17999,2537],{"class":1224},[1207,18001,1965],{"class":1964},[1207,18003,2458],{"class":1632},[1207,18005,2188],{"class":1964},[1207,18007,2546],{"class":1224},[1207,18009,2006],{"class":1964},[1207,18011,18012],{"class":1209,"line":2742},[1207,18013,10004],{"class":1632},[1207,18015,18016],{"class":1209,"line":2748},[1207,18017,1763],{"class":1620},[1207,18019,18020],{"class":1209,"line":2753},[1207,18021,18022],{"class":1213},"    # Act: Create user\n",[1207,18024,18025,18027,18029,18031,18033,18035,18037,18039],{"class":1209,"line":2759},[1207,18026,3507],{"class":1620},[1207,18028,1961],{"class":1632},[1207,18030,5028],{"class":1620},[1207,18032,1633],{"class":1632},[1207,18034,1948],{"class":1862},[1207,18036,1811],{"class":1632},[1207,18038,2583],{"class":1862},[1207,18040,2136],{"class":1632},[1207,18042,18043],{"class":1209,"line":2781},[1207,18044,1763],{"class":1620},[1207,18046,18047],{"class":1209,"line":2820},[1207,18048,18049],{"class":1213},"    # Assert: Verify user was created\n",[1207,18051,18052,18054,18056,18058,18060,18062,18064],{"class":1209,"line":2825},[1207,18053,12131],{"class":1616},[1207,18055,2604],{"class":1620},[1207,18057,1633],{"class":1632},[1207,18059,2133],{"class":1942},[1207,18061,3850],{"class":2163},[1207,18063,3853],{"class":2163},[1207,18065,3856],{"class":2813},[1207,18067,18068,18070,18072,18074,18076,18078,18080,18082],{"class":1209,"line":2830},[1207,18069,12131],{"class":1616},[1207,18071,2604],{"class":1620},[1207,18073,1633],{"class":1632},[1207,18075,2183],{"class":1942},[1207,18077,2164],{"class":2163},[1207,18079,2188],{"class":1964},[1207,18081,17933],{"class":1224},[1207,18083,2006],{"class":1964},[1207,18085,18086],{"class":1209,"line":2846},[1207,18087,1763],{"class":1620},[1207,18089,18090],{"class":1209,"line":2861},[1207,18091,18092],{"class":1213},"    # Verify user was actually saved to database by retrieving it\n",[1207,18094,18095,18098,18100,18102,18104,18106,18108,18110,18112,18114],{"class":1209,"line":2884},[1207,18096,18097],{"class":1620},"    retrieved_user ",[1207,18099,1961],{"class":1632},[1207,18101,5028],{"class":1620},[1207,18103,1633],{"class":1632},[1207,18105,2123],{"class":1862},[1207,18107,1811],{"class":1632},[1207,18109,2643],{"class":1862},[1207,18111,1633],{"class":1632},[1207,18113,2133],{"class":1942},[1207,18115,2136],{"class":1632},[1207,18117,18118,18120,18123,18125,18127,18129,18131,18133],{"class":1209,"line":2889},[1207,18119,12131],{"class":1616},[1207,18121,18122],{"class":1620}," retrieved_user",[1207,18124,1633],{"class":1632},[1207,18126,2183],{"class":1942},[1207,18128,2164],{"class":2163},[1207,18130,2188],{"class":1964},[1207,18132,17933],{"class":1224},[1207,18134,2006],{"class":1964},[1207,18136,18137,18139,18141,18143,18145,18147,18149,18151],{"class":1209,"line":2894},[1207,18138,12131],{"class":1616},[1207,18140,18122],{"class":1620},[1207,18142,1633],{"class":1632},[1207,18144,2204],{"class":1942},[1207,18146,2164],{"class":2163},[1207,18148,2188],{"class":1964},[1207,18150,17952],{"class":1224},[1207,18152,2006],{"class":1964},[1207,18154,18155],{"class":1209,"line":2900},[1207,18156,1763],{"class":1620},[1207,18158,18159],{"class":1209,"line":2914},[1207,18160,18161],{"class":1213},"    # Test database constraints (e.g., unique username)\n",[1207,18163,18164,18167,18169,18171,18173,18176],{"class":1209,"line":2919},[1207,18165,18166],{"class":1620},"    duplicate_data ",[1207,18168,1961],{"class":1632},[1207,18170,16662],{"class":1620},[1207,18172,1633],{"class":1632},[1207,18174,18175],{"class":1862},"copy",[1207,18177,1866],{"class":1632},[1207,18179,18180,18182,18184,18186,18188,18190,18193,18195],{"class":1209,"line":2925},[1207,18181,10135],{"class":1616},[1207,18183,2298],{"class":1620},[1207,18185,1633],{"class":1632},[1207,18187,2303],{"class":1862},[1207,18189,1811],{"class":1632},[1207,18191,18192],{"class":4020},"Exception",[1207,18194,12523],{"class":1632},[1207,18196,18197],{"class":1213},"  # Should raise integrity error\n",[1207,18199,18200,18203,18205,18207,18209,18212],{"class":1209,"line":2945},[1207,18201,18202],{"class":1620},"        service",[1207,18204,1633],{"class":1632},[1207,18206,1948],{"class":1862},[1207,18208,1811],{"class":1632},[1207,18210,18211],{"class":1862},"duplicate_data",[1207,18213,2136],{"class":1632},[1207,18215,18216],{"class":1209,"line":2950},[1207,18217,1527],{"emptyLinePlaceholder":1526},[1207,18219,18220,18222,18224,18226,18228,18230],{"class":1209,"line":2956},[1207,18221,3707],{"class":1632},[1207,18223,1795],{"class":1794},[1207,18225,1633],{"class":1632},[1207,18227,2029],{"class":1794},[1207,18229,1633],{"class":1632},[1207,18231,17840],{"class":1794},[1207,18233,18234,18236,18239,18241,18243,18245,18247],{"class":1209,"line":2971},[1207,18235,9532],{"class":1735},[1207,18237,18238],{"class":1794}," test_user_caching_with_real_redis",[1207,18240,1811],{"class":1632},[1207,18242,17852],{"class":2051},[1207,18244,1644],{"class":1632},[1207,18246,17630],{"class":2051},[1207,18248,1818],{"class":1632},[1207,18250,18251],{"class":1209,"line":3016},[1207,18252,1750],{"class":1749},[1207,18254,18255],{"class":1209,"line":5981},[1207,18256,18257],{"class":1756},"    Test user caching with real Redis instance\n",[1207,18259,18260],{"class":1209,"line":5987},[1207,18261,1763],{"class":1756},[1207,18263,18264],{"class":1209,"line":5992},[1207,18265,18266],{"class":1756},"    This test verifies that caching works correctly with a real Redis\n",[1207,18268,18269],{"class":1209,"line":6003},[1207,18270,18271],{"class":1756},"    instance, including cache hits, misses, and invalidation.\n",[1207,18273,18274],{"class":1209,"line":6008},[1207,18275,1750],{"class":1749},[1207,18277,18278,18281,18283,18285,18287,18289,18292,18294],{"class":1209,"line":6014},[1207,18279,18280],{"class":1616},"    from",[1207,18282,1654],{"class":1620},[1207,18284,1633],{"class":1632},[1207,18286,3664],{"class":1620},[1207,18288,1633],{"class":1632},[1207,18290,18291],{"class":1620},"cache ",[1207,18293,1617],{"class":1616},[1207,18295,18296],{"class":1620}," cache\n",[1207,18298,18299],{"class":1209,"line":6030},[1207,18300,1763],{"class":1620},[1207,18302,18303,18305,18307,18309],{"class":1209,"line":6050},[1207,18304,17895],{"class":1620},[1207,18306,1961],{"class":1632},[1207,18308,1863],{"class":1862},[1207,18310,1866],{"class":1632},[1207,18312,18313],{"class":1209,"line":6070},[1207,18314,1763],{"class":1620},[1207,18316,18317],{"class":1209,"line":6089},[1207,18318,18319],{"class":1213},"    # Create a user\n",[1207,18321,18322,18324,18326],{"class":1209,"line":6102},[1207,18323,10306],{"class":1620},[1207,18325,1961],{"class":1632},[1207,18327,2445],{"class":1632},[1207,18329,18330,18332,18334,18336,18338,18340,18343,18345],{"class":1209,"line":6122},[1207,18331,9762],{"class":1964},[1207,18333,2183],{"class":1224},[1207,18335,1965],{"class":1964},[1207,18337,2458],{"class":1632},[1207,18339,2188],{"class":1964},[1207,18341,18342],{"class":1224},"cacheuser",[1207,18344,1965],{"class":1964},[1207,18346,1973],{"class":1632},[1207,18348,18349,18351,18353,18355,18357,18359,18362,18364],{"class":1209,"line":6140},[1207,18350,9762],{"class":1964},[1207,18352,2204],{"class":1224},[1207,18354,1965],{"class":1964},[1207,18356,2458],{"class":1632},[1207,18358,2188],{"class":1964},[1207,18360,18361],{"class":1224},"cache@example.com",[1207,18363,1965],{"class":1964},[1207,18365,1973],{"class":1632},[1207,18367,18368,18370,18372,18374,18376,18378,18380],{"class":1209,"line":6145},[1207,18369,9762],{"class":1964},[1207,18371,2495],{"class":1224},[1207,18373,1965],{"class":1964},[1207,18375,2458],{"class":1632},[1207,18377,2188],{"class":1964},[1207,18379,2003],{"class":1224},[1207,18381,2006],{"class":1964},[1207,18383,18384],{"class":1209,"line":6151},[1207,18385,10004],{"class":1632},[1207,18387,18388,18390,18392,18394,18396,18398,18400,18402],{"class":1209,"line":6156},[1207,18389,3507],{"class":1620},[1207,18391,1961],{"class":1632},[1207,18393,5028],{"class":1620},[1207,18395,1633],{"class":1632},[1207,18397,1948],{"class":1862},[1207,18399,1811],{"class":1632},[1207,18401,2583],{"class":1862},[1207,18403,2136],{"class":1632},[1207,18405,18406],{"class":1209,"line":6162},[1207,18407,1763],{"class":1620},[1207,18409,18410],{"class":1209,"line":6189},[1207,18411,18412],{"class":1213},"    # Test caching\n",[1207,18414,18415,18418,18420,18422,18425,18427,18429,18431,18433,18435],{"class":1209,"line":6208},[1207,18416,18417],{"class":1620},"    cache_key ",[1207,18419,1961],{"class":1632},[1207,18421,3281],{"class":1735},[1207,18423,18424],{"class":1224},"'user:",[1207,18426,3288],{"class":3287},[1207,18428,2643],{"class":1620},[1207,18430,1633],{"class":1632},[1207,18432,2133],{"class":1942},[1207,18434,3294],{"class":3287},[1207,18436,2006],{"class":1224},[1207,18438,18439],{"class":1209,"line":6228},[1207,18440,1763],{"class":1620},[1207,18442,18443],{"class":1209,"line":6241},[1207,18444,18445],{"class":1213},"    # First access - should be a cache miss\n",[1207,18447,18448,18451,18453,18456,18458,18460,18462,18465],{"class":1209,"line":6261},[1207,18449,18450],{"class":1620},"    cached_user ",[1207,18452,1961],{"class":1632},[1207,18454,18455],{"class":1620}," cache",[1207,18457,1633],{"class":1632},[1207,18459,5111],{"class":1862},[1207,18461,1811],{"class":1632},[1207,18463,18464],{"class":1862},"cache_key",[1207,18466,2136],{"class":1632},[1207,18468,18469,18471,18474,18476],{"class":1209,"line":6279},[1207,18470,12131],{"class":1616},[1207,18472,18473],{"class":1620}," cached_user ",[1207,18475,2908],{"class":2163},[1207,18477,3856],{"class":2813},[1207,18479,18480],{"class":1209,"line":6284},[1207,18481,1763],{"class":1620},[1207,18483,18484],{"class":1209,"line":6289},[1207,18485,18486],{"class":1213},"    # Cache the user\n",[1207,18488,18489,18492,18494,18497,18499,18501,18503,18505,18507,18510,18512],{"class":1209,"line":6294},[1207,18490,18491],{"class":1620},"    cache",[1207,18493,1633],{"class":1632},[1207,18495,18496],{"class":1862},"set",[1207,18498,1811],{"class":1632},[1207,18500,18464],{"class":1862},[1207,18502,1644],{"class":1632},[1207,18504,2604],{"class":1862},[1207,18506,1644],{"class":1632},[1207,18508,18509],{"class":1231}," 300",[1207,18511,2328],{"class":1632},[1207,18513,18514],{"class":1213},"  # Cache for 5 minutes\n",[1207,18516,18517],{"class":1209,"line":6300},[1207,18518,1763],{"class":1620},[1207,18520,18521],{"class":1209,"line":6320},[1207,18522,18523],{"class":1213},"    # Second access - should be a cache hit\n",[1207,18525,18526,18528,18530,18532,18534,18536,18538,18540],{"class":1209,"line":6339},[1207,18527,18450],{"class":1620},[1207,18529,1961],{"class":1632},[1207,18531,18455],{"class":1620},[1207,18533,1633],{"class":1632},[1207,18535,5111],{"class":1862},[1207,18537,1811],{"class":1632},[1207,18539,18464],{"class":1862},[1207,18541,2136],{"class":1632},[1207,18543,18544,18546,18548,18550,18552],{"class":1209,"line":6344},[1207,18545,12131],{"class":1616},[1207,18547,18473],{"class":1620},[1207,18549,2908],{"class":2163},[1207,18551,3853],{"class":2163},[1207,18553,3856],{"class":2813},[1207,18555,18556,18558,18561,18563,18565,18567,18569,18571],{"class":1209,"line":6350},[1207,18557,12131],{"class":1616},[1207,18559,18560],{"class":1620}," cached_user",[1207,18562,1633],{"class":1632},[1207,18564,2183],{"class":1942},[1207,18566,2164],{"class":2163},[1207,18568,2188],{"class":1964},[1207,18570,18342],{"class":1224},[1207,18572,2006],{"class":1964},[1207,18574,18575],{"class":1209,"line":6366},[1207,18576,1763],{"class":1620},[1207,18578,18579],{"class":1209,"line":6389},[1207,18580,18581],{"class":1213},"    # Test cache invalidation\n",[1207,18583,18584,18586,18588,18590,18592,18594],{"class":1209,"line":6412},[1207,18585,18491],{"class":1620},[1207,18587,1633],{"class":1632},[1207,18589,12220],{"class":1862},[1207,18591,1811],{"class":1632},[1207,18593,18464],{"class":1862},[1207,18595,2136],{"class":1632},[1207,18597,18598,18600,18602,18604,18606,18608,18610,18612],{"class":1209,"line":6417},[1207,18599,18450],{"class":1620},[1207,18601,1961],{"class":1632},[1207,18603,18455],{"class":1620},[1207,18605,1633],{"class":1632},[1207,18607,5111],{"class":1862},[1207,18609,1811],{"class":1632},[1207,18611,18464],{"class":1862},[1207,18613,2136],{"class":1632},[1207,18615,18616,18618,18620,18622],{"class":1209,"line":6423},[1207,18617,12131],{"class":1616},[1207,18619,18473],{"class":1620},[1207,18621,2908],{"class":2163},[1207,18623,3856],{"class":2813},[1207,18625,18626],{"class":1209,"line":6468},[1207,18627,1527],{"emptyLinePlaceholder":1526},[1207,18629,18630,18632,18634,18636,18638,18640,18642,18644,18646,18648,18650],{"class":1209,"line":6487},[1207,18631,3707],{"class":1632},[1207,18633,1795],{"class":1794},[1207,18635,1633],{"class":1632},[1207,18637,9511],{"class":1794},[1207,18639,1811],{"class":1632},[1207,18641,9516],{"class":1957},[1207,18643,1961],{"class":1632},[1207,18645,1965],{"class":1964},[1207,18647,9523],{"class":1224},[1207,18649,1965],{"class":1964},[1207,18651,2136],{"class":1632},[1207,18653,18654,18656,18659],{"class":1209,"line":8226},[1207,18655,9532],{"class":1735},[1207,18657,18658],{"class":1794}," microservices_environment",[1207,18660,9538],{"class":1632},[1207,18662,18663],{"class":1209,"line":8239},[1207,18664,1750],{"class":1749},[1207,18666,18667],{"class":1209,"line":8244},[1207,18668,18669],{"class":1756},"    Set up a complete microservices environment using Docker Compose\n",[1207,18671,18672],{"class":1209,"line":8249},[1207,18673,1763],{"class":1756},[1207,18675,18676],{"class":1209,"line":8255},[1207,18677,18678],{"class":1756},"    This fixture starts multiple services (database, cache, message queue)\n",[1207,18680,18681],{"class":1209,"line":8274},[1207,18682,18683],{"class":1756},"    that your microservice depends on, creating a realistic test environment.\n",[1207,18685,18686],{"class":1209,"line":8279},[1207,18687,1750],{"class":1749},[1207,18689,18690,18692,18695,18697,18699,18701,18703,18705,18708,18710,18712,18715,18717,18719,18721,18724],{"class":1209,"line":8294},[1207,18691,10135],{"class":1616},[1207,18693,18694],{"class":1862}," DockerCompose",[1207,18696,1811],{"class":1632},[1207,18698,3297],{"class":1964},[1207,18700,1633],{"class":1224},[1207,18702,3297],{"class":1964},[1207,18704,1644],{"class":1632},[1207,18706,18707],{"class":1957}," compose_file_name",[1207,18709,1961],{"class":1632},[1207,18711,3297],{"class":1964},[1207,18713,18714],{"class":1224},"docker-compose.test.yml",[1207,18716,3297],{"class":1964},[1207,18718,2328],{"class":1632},[1207,18720,13173],{"class":1616},[1207,18722,18723],{"class":1620}," compose",[1207,18725,1743],{"class":1632},[1207,18727,18728],{"class":1209,"line":8319},[1207,18729,18730],{"class":1213},"        # Wait for services to be ready\n",[1207,18732,18733,18736,18738,18741,18743,18745,18748,18750,18752],{"class":1209,"line":8344},[1207,18734,18735],{"class":1620},"        compose",[1207,18737,1633],{"class":1632},[1207,18739,18740],{"class":1862},"wait_for",[1207,18742,1811],{"class":1632},[1207,18744,3297],{"class":1964},[1207,18746,18747],{"class":1224},"http://localhost:5432",[1207,18749,3297],{"class":1964},[1207,18751,2328],{"class":1632},[1207,18753,18754],{"class":1213},"  # PostgreSQL\n",[1207,18756,18757,18759,18761,18763,18765,18767,18770,18772,18774],{"class":1209,"line":8349},[1207,18758,18735],{"class":1620},[1207,18760,1633],{"class":1632},[1207,18762,18740],{"class":1862},[1207,18764,1811],{"class":1632},[1207,18766,3297],{"class":1964},[1207,18768,18769],{"class":1224},"http://localhost:6379",[1207,18771,3297],{"class":1964},[1207,18773,2328],{"class":1632},[1207,18775,18776],{"class":1213},"  # Redis\n",[1207,18778,18779,18781,18783,18785,18787,18789,18792,18794,18796],{"class":1209,"line":8355},[1207,18780,18735],{"class":1620},[1207,18782,1633],{"class":1632},[1207,18784,18740],{"class":1862},[1207,18786,1811],{"class":1632},[1207,18788,3297],{"class":1964},[1207,18790,18791],{"class":1224},"http://localhost:5672",[1207,18793,3297],{"class":1964},[1207,18795,2328],{"class":1632},[1207,18797,18798],{"class":1213},"  # RabbitMQ\n",[1207,18800,18801],{"class":1209,"line":8367},[1207,18802,1836],{"class":1620},[1207,18804,18805,18807],{"class":1209,"line":8386},[1207,18806,17137],{"class":1616},[1207,18808,18809],{"class":1620}," compose\n",[1207,18811,18812],{"class":1209,"line":8405},[1207,18813,1527],{"emptyLinePlaceholder":1526},[1207,18815,18816,18818,18820,18822,18824,18826],{"class":1209,"line":8410},[1207,18817,3707],{"class":1632},[1207,18819,1795],{"class":1794},[1207,18821,1633],{"class":1632},[1207,18823,2029],{"class":1794},[1207,18825,1633],{"class":1632},[1207,18827,17840],{"class":1794},[1207,18829,18830,18832,18835,18837,18840],{"class":1209,"line":8428},[1207,18831,9532],{"class":1735},[1207,18833,18834],{"class":1794}," test_complete_user_workflow_with_dependencies",[1207,18836,1811],{"class":1632},[1207,18838,18839],{"class":2051},"microservices_environment",[1207,18841,1818],{"class":1632},[1207,18843,18844],{"class":1209,"line":8433},[1207,18845,1750],{"class":1749},[1207,18847,18848],{"class":1209,"line":8439},[1207,18849,18850],{"class":1756},"    Test complete user workflow with all dependencies running\n",[1207,18852,18853],{"class":1209,"line":8444},[1207,18854,1763],{"class":1756},[1207,18856,18857],{"class":1209,"line":8450},[1207,18858,18859],{"class":1756},"    This test runs against a complete microservices environment with\n",[1207,18861,18862],{"class":1209,"line":8455},[1207,18863,18864],{"class":1756},"    real databases, caches, and message queues.\n",[1207,18866,18867],{"class":1209,"line":8461},[1207,18868,1750],{"class":1749},[1207,18870,18871,18873,18875,18877],{"class":1209,"line":8472},[1207,18872,17895],{"class":1620},[1207,18874,1961],{"class":1632},[1207,18876,1863],{"class":1862},[1207,18878,1866],{"class":1632},[1207,18880,18881],{"class":1209,"line":8477},[1207,18882,1763],{"class":1620},[1207,18884,18885],{"class":1209,"line":8483},[1207,18886,18887],{"class":1213},"    # Test user creation with all dependencies\n",[1207,18889,18890,18892,18894],{"class":1209,"line":8498},[1207,18891,10306],{"class":1620},[1207,18893,1961],{"class":1632},[1207,18895,2445],{"class":1632},[1207,18897,18898,18900,18902,18904,18906,18908,18911,18913],{"class":1209,"line":8534},[1207,18899,9762],{"class":1964},[1207,18901,2183],{"class":1224},[1207,18903,1965],{"class":1964},[1207,18905,2458],{"class":1632},[1207,18907,2188],{"class":1964},[1207,18909,18910],{"class":1224},"fullworkflow",[1207,18912,1965],{"class":1964},[1207,18914,1973],{"class":1632},[1207,18916,18917,18919,18921,18923,18925,18927,18930,18932],{"class":1209,"line":8539},[1207,18918,9762],{"class":1964},[1207,18920,2204],{"class":1224},[1207,18922,1965],{"class":1964},[1207,18924,2458],{"class":1632},[1207,18926,2188],{"class":1964},[1207,18928,18929],{"class":1224},"workflow@example.com",[1207,18931,1965],{"class":1964},[1207,18933,1973],{"class":1632},[1207,18935,18936,18938,18940,18942,18944,18946,18948],{"class":1209,"line":8544},[1207,18937,9762],{"class":1964},[1207,18939,2495],{"class":1224},[1207,18941,1965],{"class":1964},[1207,18943,2458],{"class":1632},[1207,18945,2188],{"class":1964},[1207,18947,2003],{"class":1224},[1207,18949,2006],{"class":1964},[1207,18951,18952],{"class":1209,"line":8550},[1207,18953,10004],{"class":1632},[1207,18955,18956],{"class":1209,"line":8570},[1207,18957,1763],{"class":1620},[1207,18959,18960],{"class":1209,"line":8575},[1207,18961,18962],{"class":1213},"    # This should:\n",[1207,18964,18965],{"class":1209,"line":8593},[1207,18966,18967],{"class":1213},"    # 1. Save user to PostgreSQL\n",[1207,18969,18970],{"class":1209,"line":8598},[1207,18971,18972],{"class":1213},"    # 2. Cache user data in Redis\n",[1207,18974,18975],{"class":1209,"line":8604},[1207,18976,18977],{"class":1213},"    # 3. Send message to RabbitMQ for notifications\n",[1207,18979,18980,18982,18984,18986,18988,18991,18993,18995],{"class":1209,"line":8609},[1207,18981,3507],{"class":1620},[1207,18983,1961],{"class":1632},[1207,18985,5028],{"class":1620},[1207,18987,1633],{"class":1632},[1207,18989,18990],{"class":1862},"create_user_with_full_workflow",[1207,18992,1811],{"class":1632},[1207,18994,2583],{"class":1862},[1207,18996,2136],{"class":1632},[1207,18998,18999],{"class":1209,"line":8615},[1207,19000,1763],{"class":1620},[1207,19002,19003,19005,19007,19009,19011,19013,19015,19017],{"class":1209,"line":8620},[1207,19004,12131],{"class":1616},[1207,19006,2604],{"class":1620},[1207,19008,1633],{"class":1632},[1207,19010,2183],{"class":1942},[1207,19012,2164],{"class":2163},[1207,19014,2188],{"class":1964},[1207,19016,18910],{"class":1224},[1207,19018,2006],{"class":1964},[1207,19020,19021],{"class":1209,"line":8626},[1207,19022,1763],{"class":1620},[1207,19024,19025],{"class":1209,"line":8645},[1207,19026,19027],{"class":1213},"    # Verify user is in database\n",[1207,19029,19030,19032,19034,19036,19038,19040,19042,19044,19046,19048],{"class":1209,"line":8650},[1207,19031,18280],{"class":1616},[1207,19033,1654],{"class":1620},[1207,19035,1633],{"class":1632},[1207,19037,1675],{"class":1620},[1207,19039,1633],{"class":1632},[1207,19041,1680],{"class":1620},[1207,19043,1633],{"class":1632},[1207,19045,1685],{"class":1620},[1207,19047,1617],{"class":1616},[1207,19049,1690],{"class":1620},[1207,19051,19052,19055,19057,19059,19061,19063,19065,19067,19069,19071,19073,19075,19077,19079],{"class":1209,"line":8656},[1207,19053,19054],{"class":1620},"    db_user ",[1207,19056,1961],{"class":1632},[1207,19058,1937],{"class":1620},[1207,19060,1633],{"class":1632},[1207,19062,1943],{"class":1942},[1207,19064,1633],{"class":1632},[1207,19066,5111],{"class":1862},[1207,19068,1811],{"class":1632},[1207,19070,2133],{"class":1957},[1207,19072,1961],{"class":1632},[1207,19074,2643],{"class":1862},[1207,19076,1633],{"class":1632},[1207,19078,2133],{"class":1942},[1207,19080,2136],{"class":1632},[1207,19082,19083,19085,19087,19089,19091,19093,19095,19097],{"class":1209,"line":8683},[1207,19084,12131],{"class":1616},[1207,19086,5925],{"class":1620},[1207,19088,1633],{"class":1632},[1207,19090,2183],{"class":1942},[1207,19092,2164],{"class":2163},[1207,19094,2188],{"class":1964},[1207,19096,18910],{"class":1224},[1207,19098,2006],{"class":1964},[1207,19100,19101],{"class":1209,"line":8688},[1207,19102,1763],{"class":1620},[1207,19104,19105],{"class":1209,"line":8694},[1207,19106,19107],{"class":1213},"    # Verify user is cached\n",[1207,19109,19110,19112,19114,19116,19118,19120,19122,19124],{"class":1209,"line":8713},[1207,19111,18280],{"class":1616},[1207,19113,1654],{"class":1620},[1207,19115,1633],{"class":1632},[1207,19117,3664],{"class":1620},[1207,19119,1633],{"class":1632},[1207,19121,18291],{"class":1620},[1207,19123,1617],{"class":1616},[1207,19125,18296],{"class":1620},[1207,19127,19128,19130,19132,19134,19136,19138,19140,19142,19144,19146,19148,19150,19152,19154,19156],{"class":1209,"line":8718},[1207,19129,18450],{"class":1620},[1207,19131,1961],{"class":1632},[1207,19133,18455],{"class":1620},[1207,19135,1633],{"class":1632},[1207,19137,5111],{"class":1862},[1207,19139,1811],{"class":1632},[1207,19141,12545],{"class":1735},[1207,19143,18424],{"class":1224},[1207,19145,3288],{"class":3287},[1207,19147,2643],{"class":1862},[1207,19149,1633],{"class":1632},[1207,19151,2133],{"class":1942},[1207,19153,3294],{"class":3287},[1207,19155,1965],{"class":1224},[1207,19157,2136],{"class":1632},[1207,19159,19160,19162,19164,19166,19168],{"class":1209,"line":8733},[1207,19161,12131],{"class":1616},[1207,19163,18473],{"class":1620},[1207,19165,2908],{"class":2163},[1207,19167,3853],{"class":2163},[1207,19169,3856],{"class":2813},[1207,19171,19172],{"class":1209,"line":8749},[1207,19173,1763],{"class":1620},[1207,19175,19176],{"class":1209,"line":8764},[1207,19177,19178],{"class":1213},"    # Verify message was sent (you'd need to check RabbitMQ queue)\n",[1207,19180,19181],{"class":1209,"line":8780},[1207,19182,19183],{"class":1213},"    # This would require additional setup to inspect message queues\n",[1207,19185,19186],{"class":1209,"line":8796},[1207,19187,1527],{"emptyLinePlaceholder":1526},[1207,19189,19190,19192,19195],{"class":1209,"line":8801},[1207,19191,1736],{"class":1735},[1207,19193,19194],{"class":1739}," TestUserServicePerformance",[1207,19196,1743],{"class":1632},[1207,19198,19199],{"class":1209,"line":8826},[1207,19200,1750],{"class":1749},[1207,19202,19203],{"class":1209,"line":8856},[1207,19204,19205],{"class":1756},"    Performance tests using real databases\n",[1207,19207,19208],{"class":1209,"line":8883},[1207,19209,1763],{"class":1756},[1207,19211,19212],{"class":1209,"line":8907},[1207,19213,19214],{"class":1756},"    These tests verify that your service performs well under load\n",[1207,19216,19217],{"class":1209,"line":8912},[1207,19218,19219],{"class":1756},"    with real database operations.\n",[1207,19221,19222],{"class":1209,"line":8930},[1207,19223,1750],{"class":1749},[1207,19225,19226],{"class":1209,"line":8935},[1207,19227,1763],{"class":1620},[1207,19229,19230,19232,19234,19236,19238,19240],{"class":1209,"line":8941},[1207,19231,1791],{"class":1632},[1207,19233,1795],{"class":1794},[1207,19235,1633],{"class":1632},[1207,19237,2029],{"class":1794},[1207,19239,1633],{"class":1632},[1207,19241,17840],{"class":1794},[1207,19243,19244,19246,19248,19250,19252,19254],{"class":1209,"line":8946},[1207,19245,1791],{"class":1632},[1207,19247,1795],{"class":1794},[1207,19249,1633],{"class":1632},[1207,19251,2029],{"class":1794},[1207,19253,1633],{"class":1632},[1207,19255,19256],{"class":1794},"slow\n",[1207,19258,19259,19261,19264,19266,19268,19270,19272],{"class":1209,"line":8952},[1207,19260,1806],{"class":1735},[1207,19262,19263],{"class":1794}," test_bulk_user_creation_performance",[1207,19265,1811],{"class":1632},[1207,19267,1815],{"class":1814},[1207,19269,1644],{"class":1632},[1207,19271,17276],{"class":2051},[1207,19273,1818],{"class":1632},[1207,19275,19276],{"class":1209,"line":8957},[1207,19277,1824],{"class":1749},[1207,19279,19280],{"class":1209,"line":8963},[1207,19281,19282],{"class":1756},"        Test performance of bulk user creation\n",[1207,19284,19285],{"class":1209,"line":8997},[1207,19286,1836],{"class":1756},[1207,19288,19289],{"class":1209,"line":9030},[1207,19290,19291],{"class":1756},"        This test creates many users and measures performance,\n",[1207,19293,19294],{"class":1209,"line":9063},[1207,19295,19296],{"class":1756},"        helping identify bottlenecks in database operations.\n",[1207,19298,19299],{"class":1209,"line":9068},[1207,19300,1824],{"class":1749},[1207,19302,19303,19306],{"class":1209,"line":9074},[1207,19304,19305],{"class":1616},"        import",[1207,19307,19308],{"class":1620}," time\n",[1207,19310,19311],{"class":1209,"line":9089},[1207,19312,1836],{"class":1620},[1207,19314,19315,19317,19319,19321],{"class":1209,"line":9104},[1207,19316,4881],{"class":1620},[1207,19318,1961],{"class":1632},[1207,19320,1863],{"class":1862},[1207,19322,1866],{"class":1632},[1207,19324,19325],{"class":1209,"line":9130},[1207,19326,1836],{"class":1620},[1207,19328,19329],{"class":1209,"line":9135},[1207,19330,19331],{"class":1213},"        # Prepare data for 1000 users\n",[1207,19333,19334,19336,19338],{"class":1209,"line":9140},[1207,19335,5659],{"class":1620},[1207,19337,1961],{"class":1632},[1207,19339,5664],{"class":1632},[1207,19341,19342],{"class":1209,"line":9146},[1207,19343,5669],{"class":1632},[1207,19345,19346,19348,19350,19352,19354,19356,19359,19361,19363,19365,19367],{"class":1209,"line":9165},[1207,19347,4969],{"class":1964},[1207,19349,2183],{"class":1224},[1207,19351,1965],{"class":1964},[1207,19353,2458],{"class":1632},[1207,19355,3281],{"class":1735},[1207,19357,19358],{"class":1224},"'perfuser",[1207,19360,3288],{"class":3287},[1207,19362,5689],{"class":1620},[1207,19364,3294],{"class":3287},[1207,19366,1965],{"class":1224},[1207,19368,1973],{"class":1632},[1207,19370,19371,19373,19375,19377,19379,19381,19384,19386,19388,19390,19392],{"class":1209,"line":9170},[1207,19372,4969],{"class":1964},[1207,19374,2204],{"class":1224},[1207,19376,1965],{"class":1964},[1207,19378,2458],{"class":1632},[1207,19380,3281],{"class":1735},[1207,19382,19383],{"class":1224},"'perf",[1207,19385,3288],{"class":3287},[1207,19387,5689],{"class":1620},[1207,19389,3294],{"class":3287},[1207,19391,5719],{"class":1224},[1207,19393,1973],{"class":1632},[1207,19395,19396,19398,19400,19402,19404,19406,19408],{"class":1209,"line":9185},[1207,19397,4969],{"class":1964},[1207,19399,2495],{"class":1224},[1207,19401,1965],{"class":1964},[1207,19403,2458],{"class":1632},[1207,19405,2188],{"class":1964},[1207,19407,2003],{"class":1224},[1207,19409,2006],{"class":1964},[1207,19411,19412],{"class":1209,"line":9213},[1207,19413,5006],{"class":1632},[1207,19415,19416,19418,19420,19422,19424,19426,19429],{"class":1209,"line":9218},[1207,19417,5746],{"class":1616},[1207,19419,5749],{"class":1620},[1207,19421,5752],{"class":1616},[1207,19423,5755],{"class":5160},[1207,19425,1811],{"class":1632},[1207,19427,19428],{"class":1231},"1000",[1207,19430,2136],{"class":1632},[1207,19432,19433],{"class":1209,"line":9261},[1207,19434,5766],{"class":1632},[1207,19436,19437],{"class":1209,"line":9277},[1207,19438,1836],{"class":1620},[1207,19440,19441],{"class":1209,"line":9292},[1207,19442,19443],{"class":1213},"        # Measure time for bulk creation\n",[1207,19445,19446,19449,19451,19454,19456,19459],{"class":1209,"line":16152},[1207,19447,19448],{"class":1620},"        start_time ",[1207,19450,1961],{"class":1632},[1207,19452,19453],{"class":1620}," time",[1207,19455,1633],{"class":1632},[1207,19457,19458],{"class":1862},"time",[1207,19460,1866],{"class":1632},[1207,19462,19463,19465,19467,19469,19471,19473,19475,19477],{"class":1209,"line":16171},[1207,19464,5780],{"class":1620},[1207,19466,1961],{"class":1632},[1207,19468,5028],{"class":1620},[1207,19470,1633],{"class":1632},[1207,19472,5789],{"class":1862},[1207,19474,1811],{"class":1632},[1207,19476,5794],{"class":1862},[1207,19478,2136],{"class":1632},[1207,19480,19481,19484,19486,19488,19490,19492],{"class":1209,"line":16186},[1207,19482,19483],{"class":1620},"        end_time ",[1207,19485,1961],{"class":1632},[1207,19487,19453],{"class":1620},[1207,19489,1633],{"class":1632},[1207,19491,19458],{"class":1862},[1207,19493,1866],{"class":1632},[1207,19495,19496],{"class":1209,"line":16217},[1207,19497,1836],{"class":1620},[1207,19499,19500],{"class":1209,"line":16222},[1207,19501,19502],{"class":1213},"        # Assert performance expectations\n",[1207,19504,19505,19508,19510,19513,19515],{"class":1209,"line":16228},[1207,19506,19507],{"class":1620},"        creation_time ",[1207,19509,1961],{"class":1632},[1207,19511,19512],{"class":1620}," end_time ",[1207,19514,9947],{"class":2163},[1207,19516,19517],{"class":1620}," start_time\n",[1207,19519,19520,19522,19524,19526,19528,19530,19532],{"class":1209,"line":16237},[1207,19521,2153],{"class":1616},[1207,19523,5812],{"class":5160},[1207,19525,1811],{"class":1632},[1207,19527,5817],{"class":1862},[1207,19529,2328],{"class":1632},[1207,19531,2164],{"class":2163},[1207,19533,19534],{"class":1231}," 1000\n",[1207,19536,19537,19539,19542,19545,19548],{"class":1209,"line":16256},[1207,19538,2153],{"class":1616},[1207,19540,19541],{"class":1620}," creation_time ",[1207,19543,19544],{"class":2163},"\u003C",[1207,19546,19547],{"class":1231}," 10.0",[1207,19549,19550],{"class":1213},"  # Should complete in under 10 seconds\n",[1207,19552,19553],{"class":1209,"line":16274},[1207,19554,1836],{"class":1620},[1207,19556,19557],{"class":1209,"line":16279},[1207,19558,19559],{"class":1213},"        # Verify all users were created correctly\n",[1207,19561,19562,19564,19566,19568,19570,19572,19574,19576,19578,19580],{"class":1209,"line":16284},[1207,19563,14399],{"class":1616},[1207,19565,1654],{"class":1620},[1207,19567,1633],{"class":1632},[1207,19569,1675],{"class":1620},[1207,19571,1633],{"class":1632},[1207,19573,1680],{"class":1620},[1207,19575,1633],{"class":1632},[1207,19577,1685],{"class":1620},[1207,19579,1617],{"class":1616},[1207,19581,1690],{"class":1620},[1207,19583,19584,19586,19588,19590,19592,19594,19596,19598,19600],{"class":1209,"line":16299},[1207,19585,2153],{"class":1616},[1207,19587,1937],{"class":1620},[1207,19589,1633],{"class":1632},[1207,19591,1943],{"class":1942},[1207,19593,1633],{"class":1632},[1207,19595,7992],{"class":1862},[1207,19597,4156],{"class":1632},[1207,19599,2164],{"class":2163},[1207,19601,19534],{"class":1231},[1207,19603,19604],{"class":1209,"line":16314},[1207,19605,1763],{"class":1620},[1207,19607,19608,19610,19612,19614,19616,19618],{"class":1209,"line":16325},[1207,19609,1791],{"class":1632},[1207,19611,1795],{"class":1794},[1207,19613,1633],{"class":1632},[1207,19615,2029],{"class":1794},[1207,19617,1633],{"class":1632},[1207,19619,17840],{"class":1794},[1207,19621,19622,19624,19627,19629,19631,19633,19635],{"class":1209,"line":16338},[1207,19623,1806],{"class":1735},[1207,19625,19626],{"class":1794}," test_concurrent_user_operations",[1207,19628,1811],{"class":1632},[1207,19630,1815],{"class":1814},[1207,19632,1644],{"class":1632},[1207,19634,17276],{"class":2051},[1207,19636,1818],{"class":1632},[1207,19638,19639],{"class":1209,"line":16343},[1207,19640,1824],{"class":1749},[1207,19642,19643],{"class":1209,"line":16348},[1207,19644,19645],{"class":1756},"        Test concurrent user operations for race conditions\n",[1207,19647,19648],{"class":1209,"line":16367},[1207,19649,1836],{"class":1756},[1207,19651,19652],{"class":1209,"line":16372},[1207,19653,19654],{"class":1756},"        This test simulates multiple concurrent requests to identify\n",[1207,19656,19657],{"class":1209,"line":16401},[1207,19658,19659],{"class":1756},"        race conditions and database locking issues.\n",[1207,19661,19662],{"class":1209,"line":16407},[1207,19663,1824],{"class":1749},[1207,19665,19666,19668],{"class":1209,"line":16466},[1207,19667,19305],{"class":1616},[1207,19669,19670],{"class":1620}," threading\n",[1207,19672,19673,19675],{"class":1209,"line":16528},[1207,19674,19305],{"class":1616},[1207,19676,19308],{"class":1620},[1207,19678,19679],{"class":1209,"line":16590},[1207,19680,1836],{"class":1620},[1207,19682,19683,19685,19687,19689],{"class":1209,"line":16638},[1207,19684,4881],{"class":1620},[1207,19686,1961],{"class":1632},[1207,19688,1863],{"class":1862},[1207,19690,1866],{"class":1632},[1207,19692,19693,19696,19698],{"class":1209,"line":16644},[1207,19694,19695],{"class":1620},"        results ",[1207,19697,1961],{"class":1632},[1207,19699,12500],{"class":1632},[1207,19701,19702,19705,19707],{"class":1209,"line":16672},[1207,19703,19704],{"class":1620},"        errors ",[1207,19706,1961],{"class":1632},[1207,19708,12500],{"class":1632},[1207,19710,19711],{"class":1209,"line":16677},[1207,19712,1836],{"class":1620},[1207,19714,19715,19718,19721,19723,19726],{"class":1209,"line":16683},[1207,19716,19717],{"class":1735},"        def",[1207,19719,19720],{"class":1794}," create_user",[1207,19722,1811],{"class":1632},[1207,19724,19725],{"class":2051},"index",[1207,19727,1818],{"class":1632},[1207,19729,19730,19733],{"class":1209,"line":16688},[1207,19731,19732],{"class":1616},"            try",[1207,19734,1743],{"class":1632},[1207,19736,19737,19740,19742],{"class":1209,"line":16694},[1207,19738,19739],{"class":1620},"                user_data ",[1207,19741,1961],{"class":1632},[1207,19743,2445],{"class":1632},[1207,19745,19746,19748,19750,19752,19754,19756,19759,19761,19763,19765,19767],{"class":1209,"line":16700},[1207,19747,17781],{"class":1964},[1207,19749,2183],{"class":1224},[1207,19751,1965],{"class":1964},[1207,19753,2458],{"class":1632},[1207,19755,3281],{"class":1735},[1207,19757,19758],{"class":1224},"'concurrent",[1207,19760,3288],{"class":3287},[1207,19762,19725],{"class":1620},[1207,19764,3294],{"class":3287},[1207,19766,1965],{"class":1224},[1207,19768,1973],{"class":1632},[1207,19770,19771,19773,19775,19777,19779,19781,19783,19785,19787,19789,19791],{"class":1209,"line":16705},[1207,19772,17781],{"class":1964},[1207,19774,2204],{"class":1224},[1207,19776,1965],{"class":1964},[1207,19778,2458],{"class":1632},[1207,19780,3281],{"class":1735},[1207,19782,19758],{"class":1224},[1207,19784,3288],{"class":3287},[1207,19786,19725],{"class":1620},[1207,19788,3294],{"class":3287},[1207,19790,5719],{"class":1224},[1207,19792,1973],{"class":1632},[1207,19794,19795,19797,19799,19801,19803,19805,19807],{"class":1209,"line":16711},[1207,19796,17781],{"class":1964},[1207,19798,2495],{"class":1224},[1207,19800,1965],{"class":1964},[1207,19802,2458],{"class":1632},[1207,19804,2188],{"class":1964},[1207,19806,2003],{"class":1224},[1207,19808,2006],{"class":1964},[1207,19810,19811],{"class":1209,"line":16726},[1207,19812,17802],{"class":1632},[1207,19814,19815,19818,19820,19822,19824,19826,19828,19830],{"class":1209,"line":16741},[1207,19816,19817],{"class":1620},"                user ",[1207,19819,1961],{"class":1632},[1207,19821,5028],{"class":1620},[1207,19823,1633],{"class":1632},[1207,19825,1948],{"class":1862},[1207,19827,1811],{"class":1632},[1207,19829,2583],{"class":1862},[1207,19831,2136],{"class":1632},[1207,19833,19834,19837,19839,19841,19843,19845],{"class":1209,"line":16752},[1207,19835,19836],{"class":1620},"                results",[1207,19838,1633],{"class":1632},[1207,19840,12601],{"class":1862},[1207,19842,1811],{"class":1632},[1207,19844,2643],{"class":1862},[1207,19846,2136],{"class":1632},[1207,19848,19849,19852,19854,19856,19858],{"class":1209,"line":16765},[1207,19850,19851],{"class":1616},"            except",[1207,19853,13170],{"class":4020},[1207,19855,13173],{"class":1616},[1207,19857,11129],{"class":1620},[1207,19859,1743],{"class":1632},[1207,19861,19862,19865,19867,19869,19871,19873],{"class":1209,"line":16770},[1207,19863,19864],{"class":1620},"                errors",[1207,19866,1633],{"class":1632},[1207,19868,12601],{"class":1862},[1207,19870,1811],{"class":1632},[1207,19872,13204],{"class":1862},[1207,19874,2136],{"class":1632},[1207,19876,19877],{"class":1209,"line":16775},[1207,19878,1836],{"class":1620},[1207,19880,19881],{"class":1209,"line":16781},[1207,19882,19883],{"class":1213},"        # Create 10 threads to simulate concurrent requests\n",[1207,19885,19886,19889,19891],{"class":1209,"line":16800},[1207,19887,19888],{"class":1620},"        threads ",[1207,19890,1961],{"class":1632},[1207,19892,12500],{"class":1632},[1207,19894,19895,19897,19899,19901,19903,19905,19908],{"class":1209,"line":16815},[1207,19896,5838],{"class":1616},[1207,19898,5749],{"class":1620},[1207,19900,5752],{"class":1616},[1207,19902,5755],{"class":5160},[1207,19904,1811],{"class":1632},[1207,19906,19907],{"class":1231},"10",[1207,19909,1818],{"class":1632},[1207,19911,19913,19916,19918,19921,19923,19926,19928,19931,19933,19935,19937,19940,19943,19945],{"class":1209,"line":19912},297,[1207,19914,19915],{"class":1620},"            thread ",[1207,19917,1961],{"class":1632},[1207,19919,19920],{"class":1620}," threading",[1207,19922,1633],{"class":1632},[1207,19924,19925],{"class":1862},"Thread",[1207,19927,1811],{"class":1632},[1207,19929,19930],{"class":1957},"target",[1207,19932,1961],{"class":1632},[1207,19934,1948],{"class":1862},[1207,19936,1644],{"class":1632},[1207,19938,19939],{"class":1957}," args",[1207,19941,19942],{"class":1632},"=(",[1207,19944,5689],{"class":1862},[1207,19946,19947],{"class":1632},",))\n",[1207,19949,19951,19954,19956,19958,19960,19963],{"class":1209,"line":19950},298,[1207,19952,19953],{"class":1620},"            threads",[1207,19955,1633],{"class":1632},[1207,19957,12601],{"class":1862},[1207,19959,1811],{"class":1632},[1207,19961,19962],{"class":1862},"thread",[1207,19964,2136],{"class":1632},[1207,19966,19968],{"class":1209,"line":19967},299,[1207,19969,1836],{"class":1620},[1207,19971,19973],{"class":1209,"line":19972},300,[1207,19974,19975],{"class":1213},"        # Start all threads\n",[1207,19977,19979,19981,19984,19986,19989],{"class":1209,"line":19978},301,[1207,19980,5838],{"class":1616},[1207,19982,19983],{"class":1620}," thread ",[1207,19985,5752],{"class":1616},[1207,19987,19988],{"class":1620}," threads",[1207,19990,1743],{"class":1632},[1207,19992,19994,19997,19999,20002],{"class":1209,"line":19993},302,[1207,19995,19996],{"class":1620},"            thread",[1207,19998,1633],{"class":1632},[1207,20000,20001],{"class":1862},"start",[1207,20003,1866],{"class":1632},[1207,20005,20007],{"class":1209,"line":20006},303,[1207,20008,1836],{"class":1620},[1207,20010,20012],{"class":1209,"line":20011},304,[1207,20013,20014],{"class":1213},"        # Wait for all threads to complete\n",[1207,20016,20018,20020,20022,20024,20026],{"class":1209,"line":20017},305,[1207,20019,5838],{"class":1616},[1207,20021,19983],{"class":1620},[1207,20023,5752],{"class":1616},[1207,20025,19988],{"class":1620},[1207,20027,1743],{"class":1632},[1207,20029,20031,20033,20035,20038],{"class":1209,"line":20030},306,[1207,20032,19996],{"class":1620},[1207,20034,1633],{"class":1632},[1207,20036,20037],{"class":1862},"join",[1207,20039,1866],{"class":1632},[1207,20041,20043],{"class":1209,"line":20042},307,[1207,20044,1836],{"class":1620},[1207,20046,20048],{"class":1209,"line":20047},308,[1207,20049,20050],{"class":1213},"        # Assert all operations completed successfully\n",[1207,20052,20054,20056,20058,20060,20062,20064,20066],{"class":1209,"line":20053},309,[1207,20055,2153],{"class":1616},[1207,20057,5812],{"class":5160},[1207,20059,1811],{"class":1632},[1207,20061,7042],{"class":1862},[1207,20063,2328],{"class":1632},[1207,20065,2164],{"class":2163},[1207,20067,20068],{"class":1231}," 10\n",[1207,20070,20072,20074,20076,20078,20081,20083,20085],{"class":1209,"line":20071},310,[1207,20073,2153],{"class":1616},[1207,20075,5812],{"class":5160},[1207,20077,1811],{"class":1632},[1207,20079,20080],{"class":1862},"errors",[1207,20082,2328],{"class":1632},[1207,20084,2164],{"class":2163},[1207,20086,7999],{"class":1231},[1207,20088,20090],{"class":1209,"line":20089},311,[1207,20091,1836],{"class":1620},[1207,20093,20095],{"class":1209,"line":20094},312,[1207,20096,20097],{"class":1213},"        # Verify all users were created with unique usernames\n",[1207,20099,20101,20103,20105,20107,20109,20111,20113,20115,20117,20119,20122],{"class":1209,"line":20100},313,[1207,20102,9221],{"class":1620},[1207,20104,1961],{"class":1632},[1207,20106,9226],{"class":1632},[1207,20108,2643],{"class":1620},[1207,20110,1633],{"class":1632},[1207,20112,2183],{"class":1942},[1207,20114,9241],{"class":1616},[1207,20116,5846],{"class":1620},[1207,20118,5752],{"class":1616},[1207,20120,20121],{"class":1620}," results",[1207,20123,13328],{"class":1632},[1207,20125,20127,20129,20131,20133,20135,20137,20140,20142,20144,20147],{"class":1209,"line":20126},314,[1207,20128,2153],{"class":1616},[1207,20130,5812],{"class":5160},[1207,20132,1811],{"class":1632},[1207,20134,18496],{"class":4020},[1207,20136,1811],{"class":1632},[1207,20138,20139],{"class":1862},"usernames",[1207,20141,10118],{"class":1632},[1207,20143,2164],{"class":2163},[1207,20145,20146],{"class":1231}," 10",[1207,20148,20149],{"class":1213},"  # All unique\n",[1026,20151,20152],{},[1045,20153,20154],{},"Docker Compose for Test Environment:",[1197,20156,20160],{"className":20157,"code":20158,"language":20159,"meta":1202,"style":1202},"language-yaml shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# docker-compose.test.yml\nversion: '3.8'\nservices:\n  test-postgres:\n    image: postgres:13\n    environment:\n      POSTGRES_DB: test_db\n      POSTGRES_USER: test_user\n      POSTGRES_PASSWORD: test_pass\n    ports:\n      - \"5432:5432\"\n    \n  test-redis:\n    image: redis:6\n    ports:\n      - \"6379:6379\"\n    \n  test-rabbitmq:\n    image: rabbitmq:3.11-management\n    environment:\n      RABBITMQ_DEFAULT_USER: test_user\n      RABBITMQ_DEFAULT_PASS: test_pass\n    ports:\n      - \"5672:5672\"\n      - \"15672:15672\"\n","yaml",[1204,20161,20162,20167,20182,20189,20196,20206,20213,20223,20233,20243,20250,20262,20266,20273,20282,20288,20299,20303,20310,20319,20325,20334,20343,20349,20360],{"__ignoreMap":1202},[1207,20163,20164],{"class":1209,"line":1210},[1207,20165,20166],{"class":1213},"# docker-compose.test.yml\n",[1207,20168,20169,20173,20175,20177,20180],{"class":1209,"line":1217},[1207,20170,20172],{"class":20171},"suXOh","version",[1207,20174,2458],{"class":1632},[1207,20176,2188],{"class":1964},[1207,20178,20179],{"class":1224},"3.8",[1207,20181,2006],{"class":1964},[1207,20183,20184,20187],{"class":1209,"line":1238},[1207,20185,20186],{"class":20171},"services",[1207,20188,1743],{"class":1632},[1207,20190,20191,20194],{"class":1209,"line":1254},[1207,20192,20193],{"class":20171},"  test-postgres",[1207,20195,1743],{"class":1632},[1207,20197,20198,20201,20203],{"class":1209,"line":1270},[1207,20199,20200],{"class":20171},"    image",[1207,20202,2458],{"class":1632},[1207,20204,20205],{"class":1224}," postgres:13\n",[1207,20207,20208,20211],{"class":1209,"line":1535},[1207,20209,20210],{"class":20171},"    environment",[1207,20212,1743],{"class":1632},[1207,20214,20215,20218,20220],{"class":1209,"line":1710},[1207,20216,20217],{"class":20171},"      POSTGRES_DB",[1207,20219,2458],{"class":1632},[1207,20221,20222],{"class":1224}," test_db\n",[1207,20224,20225,20228,20230],{"class":1209,"line":1727},[1207,20226,20227],{"class":20171},"      POSTGRES_USER",[1207,20229,2458],{"class":1632},[1207,20231,20232],{"class":1224}," test_user\n",[1207,20234,20235,20238,20240],{"class":1209,"line":1732},[1207,20236,20237],{"class":20171},"      POSTGRES_PASSWORD",[1207,20239,2458],{"class":1632},[1207,20241,20242],{"class":1224}," test_pass\n",[1207,20244,20245,20248],{"class":1209,"line":1746},[1207,20246,20247],{"class":20171},"    ports",[1207,20249,1743],{"class":1632},[1207,20251,20252,20255,20257,20260],{"class":1209,"line":1753},[1207,20253,20254],{"class":1632},"      -",[1207,20256,11109],{"class":1964},[1207,20258,20259],{"class":1224},"5432:5432",[1207,20261,11115],{"class":1964},[1207,20263,20264],{"class":1209,"line":1760},[1207,20265,1763],{"class":1620},[1207,20267,20268,20271],{"class":1209,"line":1766},[1207,20269,20270],{"class":20171},"  test-redis",[1207,20272,1743],{"class":1632},[1207,20274,20275,20277,20279],{"class":1209,"line":1772},[1207,20276,20200],{"class":20171},[1207,20278,2458],{"class":1632},[1207,20280,20281],{"class":1224}," redis:6\n",[1207,20283,20284,20286],{"class":1209,"line":1778},[1207,20285,20247],{"class":20171},[1207,20287,1743],{"class":1632},[1207,20289,20290,20292,20294,20297],{"class":1209,"line":1783},[1207,20291,20254],{"class":1632},[1207,20293,11109],{"class":1964},[1207,20295,20296],{"class":1224},"6379:6379",[1207,20298,11115],{"class":1964},[1207,20300,20301],{"class":1209,"line":1788},[1207,20302,1763],{"class":1620},[1207,20304,20305,20308],{"class":1209,"line":1803},[1207,20306,20307],{"class":20171},"  test-rabbitmq",[1207,20309,1743],{"class":1632},[1207,20311,20312,20314,20316],{"class":1209,"line":1821},[1207,20313,20200],{"class":20171},[1207,20315,2458],{"class":1632},[1207,20317,20318],{"class":1224}," rabbitmq:3.11-management\n",[1207,20320,20321,20323],{"class":1209,"line":1827},[1207,20322,20210],{"class":20171},[1207,20324,1743],{"class":1632},[1207,20326,20327,20330,20332],{"class":1209,"line":1833},[1207,20328,20329],{"class":20171},"      RABBITMQ_DEFAULT_USER",[1207,20331,2458],{"class":1632},[1207,20333,20232],{"class":1224},[1207,20335,20336,20339,20341],{"class":1209,"line":1839},[1207,20337,20338],{"class":20171},"      RABBITMQ_DEFAULT_PASS",[1207,20340,2458],{"class":1632},[1207,20342,20242],{"class":1224},[1207,20344,20345,20347],{"class":1209,"line":1845},[1207,20346,20247],{"class":20171},[1207,20348,1743],{"class":1632},[1207,20350,20351,20353,20355,20358],{"class":1209,"line":1851},[1207,20352,20254],{"class":1632},[1207,20354,11109],{"class":1964},[1207,20356,20357],{"class":1224},"5672:5672",[1207,20359,11115],{"class":1964},[1207,20361,20362,20364,20366,20369],{"class":1209,"line":1856},[1207,20363,20254],{"class":1632},[1207,20365,11109],{"class":1964},[1207,20367,20368],{"class":1224},"15672:15672",[1207,20370,11115],{"class":1964},[1026,20372,20373],{},[1045,20374,20375],{},"Running Container Tests:",[1197,20377,20379],{"className":1199,"code":20378,"language":1201,"meta":1202,"style":1202},"# Install testcontainers\npip install testcontainers[postgresql,redis]\n\n# Run integration tests\npytest -m integration\n\n# Run slow performance tests\npytest -m slow\n\n# Run all container tests\npytest user_service/tests/test_containers.py -v\n",[1204,20380,20381,20386,20395,20399,20404,20414,20418,20423,20432,20436,20441],{"__ignoreMap":1202},[1207,20382,20383],{"class":1209,"line":1210},[1207,20384,20385],{"class":1213},"# Install testcontainers\n",[1207,20387,20388,20390,20392],{"class":1209,"line":1217},[1207,20389,1221],{"class":1220},[1207,20391,1225],{"class":1224},[1207,20393,20394],{"class":1224}," testcontainers[postgresql,redis]\n",[1207,20396,20397],{"class":1209,"line":1238},[1207,20398,1527],{"emptyLinePlaceholder":1526},[1207,20400,20401],{"class":1209,"line":1254},[1207,20402,20403],{"class":1213},"# Run integration tests\n",[1207,20405,20406,20408,20411],{"class":1209,"line":1270},[1207,20407,1795],{"class":1220},[1207,20409,20410],{"class":13424}," -m",[1207,20412,20413],{"class":1224}," integration\n",[1207,20415,20416],{"class":1209,"line":1535},[1207,20417,1527],{"emptyLinePlaceholder":1526},[1207,20419,20420],{"class":1209,"line":1710},[1207,20421,20422],{"class":1213},"# Run slow performance tests\n",[1207,20424,20425,20427,20429],{"class":1209,"line":1727},[1207,20426,1795],{"class":1220},[1207,20428,20410],{"class":13424},[1207,20430,20431],{"class":1224}," slow\n",[1207,20433,20434],{"class":1209,"line":1732},[1207,20435,1527],{"emptyLinePlaceholder":1526},[1207,20437,20438],{"class":1209,"line":1746},[1207,20439,20440],{"class":1213},"# Run all container tests\n",[1207,20442,20443,20445,20448],{"class":1209,"line":1753},[1207,20444,1795],{"class":1220},[1207,20446,20447],{"class":1224}," user_service/tests/test_containers.py",[1207,20449,20450],{"class":13424}," -v\n",[1026,20452,20453],{},[1045,20454,20455],{},"Best Practices for Container Testing:",[1123,20457,20458,20464,20470,20476,20482,20488],{},[1084,20459,20460,20463],{},[1045,20461,20462],{},"Use Session Scope",": Share containers across tests for performance",[1084,20465,20466,20469],{},[1045,20467,20468],{},"Clean Up Data",": Ensure each test starts with clean data",[1084,20471,20472,20475],{},[1045,20473,20474],{},"Wait for Readiness",": Always wait for services to be fully ready",[1084,20477,20478,20481],{},[1045,20479,20480],{},"Resource Management",": Containers are automatically cleaned up",[1084,20483,20484,20487],{},[1045,20485,20486],{},"Performance Considerations",": Container tests are slower than unit tests",[1084,20489,20490,20493],{},[1045,20491,20492],{},"CI/CD Integration",": Ensure your CI environment supports Docker",[1030,20495,20497],{"id":20496},"end-to-end-testing","End-to-End Testing",[1026,20499,20500],{},"End-to-end (E2E) tests verify that your entire system works correctly by testing complete user journeys across multiple services. These tests are the closest to how real users interact with your system, but they're also the most complex and fragile.",[1038,20502,20504],{"id":20503},"understanding-e2e-testing-in-microservices","Understanding E2E Testing in Microservices",[1026,20506,20507],{},[1045,20508,20509],{},"What E2E Tests Do:",[1081,20511,20512,20515,20518,20521],{},[1084,20513,20514],{},"Test complete business workflows across multiple services",[1084,20516,20517],{},"Verify that services integrate correctly in a production-like environment",[1084,20519,20520],{},"Catch issues that other test types might miss",[1084,20522,20523],{},"Provide confidence that the entire system works together",[1026,20525,20526],{},[1045,20527,20528],{},"Challenges of E2E Testing:",[1081,20530,20531,20537,20543,20549],{},[1084,20532,20533,20536],{},[1045,20534,20535],{},"Slow",": Require multiple services to be running",[1084,20538,20539,20542],{},[1045,20540,20541],{},"Brittle",": Can fail due to timing issues, network problems, or environmental differences",[1084,20544,20545,20548],{},[1045,20546,20547],{},"Complex Setup",": Need to coordinate multiple services and databases",[1084,20550,20551,20554],{},[1045,20552,20553],{},"Hard to Debug",": When they fail, the problem could be anywhere in the system",[1026,20556,20557],{},[1045,20558,13483],{},[1081,20560,20561,20564,20567,20570],{},[1084,20562,20563],{},"Keep E2E tests focused on critical user journeys",[1084,20565,20566],{},"Use them sparingly (only 2-5% of your total tests)",[1084,20568,20569],{},"Make them as stable as possible",[1084,20571,20572],{},"Run them in environments that closely match production",[1038,20574,20576],{"id":20575},"multi-service-e2e-tests","Multi-Service E2E Tests",[1197,20578,20580],{"className":1602,"code":20579,"language":1604,"meta":1202,"style":1202},"# tests/e2e/test_user_order_flow.py\nimport pytest\nimport requests\nimport time\nimport json\nfrom concurrent.futures import ThreadPoolExecutor\nfrom datetime import datetime, timedelta\n\nclass TestUserOrderFlow:\n    \"\"\"\n    End-to-end tests for user and order services interaction\n    \n    These tests verify complete business workflows that span multiple\n    services. They test the system as a whole, from a user's perspective.\n    \"\"\"\n    \n    @pytest.fixture(scope='class')\n    def services_ready(self):\n        \"\"\"\n        Wait for all services to be ready before running tests\n        \n        This fixture ensures that all required services are running\n        and responding before we start our E2E tests.\n        \"\"\"\n        services = [\n            ('User Service', 'http://user-service:8000/health/'),\n            ('Order Service', 'http://order-service:8001/health/'),\n            ('Payment Service', 'http://payment-service:8002/health/'),\n            ('Inventory Service', 'http://inventory-service:8003/health/'),\n            ('Notification Service', 'http://notification-service:8004/health/')\n        ]\n        \n        for service_name, health_url in services:\n            self.wait_for_service(service_name, health_url)\n        \n        yield\n    \n    def wait_for_service(self, service_name, url, timeout=60):\n        \"\"\"\n        Wait for a service to be ready\n        \n        This method polls a service's health endpoint until it responds\n        successfully or the timeout is reached.\n        \"\"\"\n        print(f\"Waiting for {service_name} to be ready...\")\n        start_time = time.time()\n        \n        while time.time() - start_time \u003C timeout:\n            try:\n                response = requests.get(url, timeout=5)\n                if response.status_code == 200:\n                    print(f\"✓ {service_name} is ready\")\n                    return\n            except requests.RequestException as e:\n                print(f\"  {service_name} not ready yet: {e}\")\n            \n            time.sleep(2)  # Wait 2 seconds before retrying\n        \n        raise Exception(f\"{service_name} not ready after {timeout} seconds\")\n    \n    def test_complete_user_order_flow(self, services_ready):\n        \"\"\"\n        Test complete flow from user creation to order completion\n        \n        This test simulates a real user journey:\n        1. User registers on the platform\n        2. User browses products\n        3. User adds items to cart\n        4. User places an order\n        5. Payment is processed\n        6. Order is confirmed\n        7. User receives confirmation email\n        \n        This tests the integration between User, Order, Payment,\n        Inventory, and Notification services.\n        \"\"\"\n        print(\"Starting complete user order flow test...\")\n        \n        # Step 1: Create a new user\n        print(\"Step 1: Creating user...\")\n        user_data = {\n            'username': 'e2euser',\n            'email': 'e2e@example.com',\n            'password': 'testpass123',\n            'first_name': 'E2E',\n            'last_name': 'User'\n        }\n        \n        user_response = requests.post(\n            'http://user-service:8000/api/users/',\n            json=user_data,\n            timeout=10\n        )\n        assert user_response.status_code == 201, f\"User creation failed: {user_response.text}\"\n        \n        user = user_response.json()\n        user_id = user['id']\n        print(f\"✓ User created with ID: {user_id}\")\n        \n        # Step 2: Authenticate the user\n        print(\"Step 2: Authenticating user...\")\n        auth_response = requests.post(\n            'http://user-service:8000/api/auth/login/',\n            json={\n                'username': 'e2euser',\n                'password': 'testpass123'\n            },\n            timeout=10\n        )\n        assert auth_response.status_code == 200, f\"Authentication failed: {auth_response.text}\"\n        \n        auth_data = auth_response.json()\n        auth_token = auth_data.get('token') or auth_data.get('access_token')\n        assert auth_token, \"No authentication token received\"\n        \n        headers = {'Authorization': f'Bearer {auth_token}'}\n        print(\"✓ User authenticated successfully\")\n        \n        # Step 3: Check available products\n        print(\"Step 3: Checking available products...\")\n        products_response = requests.get(\n            'http://inventory-service:8003/api/products/',\n            headers=headers,\n            timeout=10\n        )\n        assert products_response.status_code == 200, f\"Product fetch failed: {products_response.text}\"\n        \n        products = products_response.json()\n        assert len(products) > 0, \"No products available\"\n        print(f\"✓ Found {len(products)} available products\")\n        \n        # Step 4: Create an order with multiple items\n        print(\"Step 4: Creating order...\")\n        order_data = {\n            'user_id': user_id,\n            'items': [\n                {\n                    'product_id': products[0]['id'],\n                    'quantity': 2,\n                    'price': products[0]['price']\n                },\n                {\n                    'product_id': products[1]['id'] if len(products) > 1 else products[0]['id'],\n                    'quantity': 1,\n                    'price': products[1]['price'] if len(products) > 1 else products[0]['price']\n                }\n            ],\n            'shipping_address': {\n                'street': '123 Test Street',\n                'city': 'Test City',\n                'state': 'TS',\n                'zip_code': '12345',\n                'country': 'US'\n            }\n        }\n        \n        order_response = requests.post(\n            'http://order-service:8001/api/orders/',\n            json=order_data,\n            headers=headers,\n            timeout=15\n        )\n        assert order_response.status_code == 201, f\"Order creation failed: {order_response.text}\"\n        \n        order = order_response.json()\n        order_id = order['id']\n        print(f\"✓ Order created with ID: {order_id}\")\n        \n        # Step 5: Process payment\n        print(\"Step 5: Processing payment...\")\n        payment_data = {\n            'order_id': order_id,\n            'payment_method': 'credit_card',\n            'card_details': {\n                'card_number': '4111111111111111',  # Test card number\n                'expiry_month': '12',\n                'expiry_year': '2025',\n                'cvv': '123'\n            },\n            'billing_address': order_data['shipping_address']\n        }\n        \n        payment_response = requests.post(\n            'http://payment-service:8002/api/payments/',\n            json=payment_data,\n            headers=headers,\n            timeout=20  # Payment processing might take longer\n        )\n        assert payment_response.status_code == 200, f\"Payment failed: {payment_response.text}\"\n        \n        payment = payment_response.json()\n        assert payment['status'] == 'completed', f\"Payment not completed: {payment}\"\n        print(f\"✓ Payment processed successfully: {payment['payment_id']}\")\n        \n        # Step 6: Verify order status updated\n        print(\"Step 6: Verifying order status...\")\n        # Wait a moment for async processing\n        time.sleep(3)\n        \n        order_status_response = requests.get(\n            f'http://order-service:8001/api/orders/{order_id}/',\n            headers=headers,\n            timeout=10\n        )\n        assert order_status_response.status_code == 200, f\"Order status check failed: {order_status_response.text}\"\n        \n        updated_order = order_status_response.json()\n        assert updated_order['status'] in ['confirmed', 'processing'], f\"Unexpected order status: {updated_order['status']}\"\n        print(f\"✓ Order status updated to: {updated_order['status']}\")\n        \n        # Step 7: Verify inventory was updated\n        print(\"Step 7: Verifying inventory updates...\")\n        for item in order_data['items']:\n            inventory_response = requests.get(\n                f'http://inventory-service:8003/api/products/{item[\"product_id\"]}/',\n                headers=headers,\n                timeout=10\n            )\n            assert inventory_response.status_code == 200\n            \n            product = inventory_response.json()\n            # Inventory should be reduced (we can't check exact numbers without knowing initial stock)\n            assert 'stock_quantity' in product\n        \n        print(\"✓ Inventory updates verified\")\n        \n        # Step 8: Check that notification was sent\n        print(\"Step 8: Verifying notification was sent...\")\n        # Check user's notifications\n        notifications_response = requests.get(\n            f'http://notification-service:8004/api/users/{user_id}/notifications/',\n            headers=headers,\n            timeout=10\n        )\n        \n        if notifications_response.status_code == 200:\n            notifications = notifications_response.json()\n            order_notifications = [\n                n for n in notifications \n                if 'order' in n.get('type', '').lower() and str(order_id) in n.get('message', '')\n            ]\n            assert len(order_notifications) > 0, \"No order confirmation notification found\"\n            print(\"✓ Order confirmation notification sent\")\n        else:\n            print(\"⚠ Could not verify notifications (service might not be implemented)\")\n        \n        print(\"🎉 Complete user order flow test passed!\")\n    \n    def test_concurrent_user_operations(self, services_ready):\n        \"\"\"\n        Test concurrent operations across services\n        \n        This test simulates multiple users performing operations simultaneously\n        to verify that the system handles concurrent load correctly.\n        \"\"\"\n        print(\"Starting concurrent user operations test...\")\n        \n        def create_user_and_order(user_index):\n            \"\"\"\n            Create a user and place an order\n            \n            This function will be run concurrently by multiple threads\n            to simulate real-world concurrent usage.\n            \"\"\"\n            try:\n                # Create user\n                user_data = {\n                    'username': f'concurrent_user_{user_index}',\n                    'email': f'concurrent_{user_index}@example.com',\n                    'password': 'testpass123',\n                    'first_name': f'User{user_index}',\n                    'last_name': 'Concurrent'\n                }\n                \n                user_response = requests.post(\n                    'http://user-service:8000/api/users/',\n                    json=user_data,\n                    timeout=10\n                )\n                \n                if user_response.status_code != 201:\n                    return {'success': False, 'error': f'User creation failed: {user_response.text}'}\n                \n                user = user_response.json()\n                \n                # Authenticate user\n                auth_response = requests.post(\n                    'http://user-service:8000/api/auth/login/',\n                    json={\n                        'username': user_data['username'],\n                        'password': user_data['password']\n                    },\n                    timeout=10\n                )\n                \n                if auth_response.status_code != 200:\n                    return {'success': False, 'error': f'Authentication failed: {auth_response.text}'}\n                \n                auth_data = auth_response.json()\n                token = auth_data.get('token') or auth_data.get('access_token')\n                headers = {'Authorization': f'Bearer {token}'}\n                \n                # Create order\n                order_data = {\n                    'user_id': user['id'],\n                    'items': [\n                        {\n                            'product_id': 1,  # Assuming product 1 exists\n                            'quantity': 1,\n                            'price': 19.99\n                        }\n                    ],\n                    'shipping_address': {\n                        'street': f'{user_index} Test Street',\n                        'city': 'Test City',\n                        'state': 'TS',\n                        'zip_code': '12345',\n                        'country': 'US'\n                    }\n                }\n                \n                order_response = requests.post(\n                    'http://order-service:8001/api/orders/',\n                    json=order_data,\n                    headers=headers,\n                    timeout=15\n                )\n                \n                if order_response.status_code != 201:\n                    return {'success': False, 'error': f'Order creation failed: {order_response.text}'}\n                \n                order = order_response.json()\n                \n                return {\n                    'success': True,\n                    'user_id': user['id'],\n                    'order_id': order['id'],\n                    'user_index': user_index\n                }\n                \n            except Exception as e:\n                return {'success': False, 'error': str(e)}\n        \n        # Execute concurrent operations\n        print(\"Creating 10 concurrent users and orders...\")\n        with ThreadPoolExecutor(max_workers=5) as executor:\n            # Submit 10 concurrent operations\n            futures = [\n                executor.submit(create_user_and_order, i) \n                for i in range(10)\n            ]\n            \n            # Collect results\n            results = [future.result() for future in futures]\n        \n        # Analyze results\n        successful_operations = [r for r in results if r['success']]\n        failed_operations = [r for r in results if not r['success']]\n        \n        print(f\"Successful operations: {len(successful_operations)}\")\n        print(f\"Failed operations: {len(failed_operations)}\")\n        \n        # Print failure details\n        for failure in failed_operations:\n            print(f\"  Failed: {failure['error']}\")\n        \n        # Assert that most operations succeeded\n        # We allow some failures due to race conditions or resource constraints\n        success_rate = len(successful_operations) / len(results)\n        assert success_rate >= 0.8, f\"Success rate too low: {success_rate:.2%}\"\n        \n        print(f\"✓ Concurrent operations test passed with {success_rate:.2%} success rate\")\n    \n    def test_service_failure_resilience(self, services_ready):\n        \"\"\"\n        Test system resilience when individual services fail\n        \n        This test verifies that the system can handle partial failures\n        gracefully without completely breaking down.\n        \"\"\"\n        print(\"Testing service failure resilience...\")\n        \n        # This test would require the ability to stop/start services\n        # In a real environment, you might use chaos engineering tools\n        # like Chaos Monkey to randomly fail services\n        \n        # For now, we'll test timeout handling\n        print(\"Testing timeout handling...\")\n        \n        # Create a user first\n        user_data = {\n            'username': 'resilience_user',\n            'email': 'resilience@example.com',\n            'password': 'testpass123'\n        }\n        \n        user_response = requests.post(\n            'http://user-service:8000/api/users/',\n            json=user_data,\n            timeout=10\n        )\n        assert user_response.status_code == 201\n        \n        # Test with very short timeout to simulate service failure\n        try:\n            requests.get(\n                'http://order-service:8001/api/orders/',\n                timeout=0.001  # Extremely short timeout\n            )\n            assert False, \"Expected timeout exception\"\n        except requests.Timeout:\n            print(\"✓ Timeout handling works correctly\")\n        \n        print(\"✓ Service failure resilience test completed\")\n\n# Helper functions for E2E test setup\ndef setup_test_data():\n    \"\"\"\n    Set up test data needed for E2E tests\n    \n    This function creates any necessary test data like products,\n    categories, or configuration needed for E2E tests.\n    \"\"\"\n    # Create test products\n    products_data = [\n        {\n            'name': 'Test Product 1',\n            'price': 29.99,\n            'stock_quantity': 100,\n            'description': 'A test product for E2E testing'\n        },\n        {\n            'name': 'Test Product 2',\n            'price': 49.99,\n            'stock_quantity': 50,\n            'description': 'Another test product for E2E testing'\n        }\n    ]\n    \n    for product_data in products_data:\n        requests.post(\n            'http://inventory-service:8003/api/products/',\n            json=product_data,\n            headers={'Authorization': 'Bearer admin-token'}  # Admin token\n        )\n\ndef cleanup_test_data():\n    \"\"\"\n    Clean up test data after E2E tests\n    \n    This function removes any test data created during E2E tests\n    to ensure a clean state for subsequent test runs.\n    \"\"\"\n    # Clean up test users\n    test_users = requests.get(\n        'http://user-service:8000/api/users/?username__startswith=e2e',\n        headers={'Authorization': 'Bearer admin-token'}\n    )\n    \n    if test_users.status_code == 200:\n        for user in test_users.json().get('results', []):\n            requests.delete(\n                f'http://user-service:8000/api/users/{user[\"id\"]}/',\n                headers={'Authorization': 'Bearer admin-token'}\n            )\n",[1204,20581,20582,20587,20593,20600,20606,20612,20629,20646,20650,20659,20663,20668,20672,20677,20682,20686,20690,20714,20727,20731,20736,20740,20745,20750,20754,20763,20786,20808,20830,20852,20874,20878,20882,20901,20923,20927,20931,20935,20967,20971,20976,20980,20985,20990,20994,21017,21031,21035,21060,21066,21094,21112,21135,21140,21157,21188,21192,21211,21215,21249,21253,21270,21274,21279,21283,21288,21293,21298,21303,21308,21313,21318,21323,21327,21332,21337,21341,21356,21360,21365,21380,21388,21407,21426,21444,21463,21479,21483,21487,21502,21513,21523,21533,21537,21573,21577,21591,21610,21632,21636,21641,21656,21671,21682,21688,21706,21722,21726,21734,21738,21773,21777,21792,21835,21851,21855,21889,21904,21908,21913,21928,21943,21954,21966,21974,21978,22013,22017,22032,22060,22088,22092,22097,22112,22121,22136,22149,22154,22183,22198,22225,22230,22234,22295,22309,22367,22371,22376,22389,22409,22429,22448,22468,22486,22490,22494,22498,22513,22524,22535,22545,22554,22558,22593,22597,22612,22632,22654,22658,22663,22678,22687,22702,22722,22735,22758,22778,22798,22815,22819,22843,22847,22851,22866,22877,22888,22898,22909,22913,22948,22952,22967,23010,23042,23046,23051,23066,23071,23086,23090,23105,23124,23134,23142,23146,23181,23185,23200,23264,23295,23299,23304,23319,23340,23355,23384,23395,23404,23408,23423,23427,23442,23447,23463,23467,23482,23486,23491,23506,23511,23526,23544,23554,23562,23566,23570,23587,23602,23611,23626,23698,23703,23729,23745,23751,23766,23770,23785,23789,23805,23809,23814,23818,23823,23828,23832,23847,23851,23865,23870,23875,23879,23884,23889,23893,23899,23904,23912,23937,23962,23980,24005,24022,24026,24031,24046,24056,24067,24076,24081,24085,24101,24147,24151,24165,24169,24174,24189,24199,24205,24228,24250,24255,24263,24267,24271,24287,24332,24336,24351,24392,24423,24427,24432,24441,24463,24475,24480,24498,24512,24525,24530,24535,24547,24572,24591,24610,24629,24646,24652,24657,24662,24678,24689,24700,24712,24721,24726,24731,24748,24794,24799,24815,24820,24828,24843,24866,24889,24903,24908,24913,24926,24962,24967,24973,24989,25015,25021,25031,25055,25073,25078,25083,25089,25120,25125,25131,25170,25206,25211,25240,25269,25274,25280,25295,25328,25333,25339,25345,25372,25405,25410,25435,25440,25458,25463,25469,25474,25480,25486,25491,25507,25512,25518,25524,25530,25535,25541,25557,25562,25568,25577,25597,25617,25634,25639,25644,25659,25670,25681,25690,25695,25711,25716,25722,25729,25741,25752,25765,25770,25786,25800,25816,25821,25837,25842,25848,25858,25863,25869,25874,25880,25886,25891,25897,25907,25913,25934,25950,25966,25985,25991,25996,26016,26032,26048,26066,26071,26077,26082,26097,26109,26120,26132,26159,26164,26169,26179,26184,26190,26195,26201,26207,26212,26218,26234,26246,26270,26275,26280,26299,26331,26342,26370,26393],{"__ignoreMap":1202},[1207,20583,20584],{"class":1209,"line":1210},[1207,20585,20586],{"class":1213},"# tests/e2e/test_user_order_flow.py\n",[1207,20588,20589,20591],{"class":1209,"line":1217},[1207,20590,1617],{"class":1616},[1207,20592,1621],{"class":1620},[1207,20594,20595,20597],{"class":1209,"line":1238},[1207,20596,1617],{"class":1616},[1207,20598,20599],{"class":1620}," requests\n",[1207,20601,20602,20604],{"class":1209,"line":1254},[1207,20603,1617],{"class":1616},[1207,20605,19308],{"class":1620},[1207,20607,20608,20610],{"class":1209,"line":1270},[1207,20609,1617],{"class":1616},[1207,20611,6574],{"class":1620},[1207,20613,20614,20616,20619,20621,20624,20626],{"class":1209,"line":1535},[1207,20615,1626],{"class":1616},[1207,20617,20618],{"class":1620}," concurrent",[1207,20620,1633],{"class":1632},[1207,20622,20623],{"class":1620},"futures ",[1207,20625,1617],{"class":1616},[1207,20627,20628],{"class":1620}," ThreadPoolExecutor\n",[1207,20630,20631,20633,20636,20638,20641,20643],{"class":1209,"line":1710},[1207,20632,1626],{"class":1616},[1207,20634,20635],{"class":1620}," datetime ",[1207,20637,1617],{"class":1616},[1207,20639,20640],{"class":1620}," datetime",[1207,20642,1644],{"class":1632},[1207,20644,20645],{"class":1620}," timedelta\n",[1207,20647,20648],{"class":1209,"line":1727},[1207,20649,1527],{"emptyLinePlaceholder":1526},[1207,20651,20652,20654,20657],{"class":1209,"line":1732},[1207,20653,1736],{"class":1735},[1207,20655,20656],{"class":1739}," TestUserOrderFlow",[1207,20658,1743],{"class":1632},[1207,20660,20661],{"class":1209,"line":1746},[1207,20662,1750],{"class":1749},[1207,20664,20665],{"class":1209,"line":1753},[1207,20666,20667],{"class":1756},"    End-to-end tests for user and order services interaction\n",[1207,20669,20670],{"class":1209,"line":1760},[1207,20671,1763],{"class":1756},[1207,20673,20674],{"class":1209,"line":1766},[1207,20675,20676],{"class":1756},"    These tests verify complete business workflows that span multiple\n",[1207,20678,20679],{"class":1209,"line":1772},[1207,20680,20681],{"class":1756},"    services. They test the system as a whole, from a user's perspective.\n",[1207,20683,20684],{"class":1209,"line":1778},[1207,20685,1750],{"class":1749},[1207,20687,20688],{"class":1209,"line":1783},[1207,20689,1763],{"class":1620},[1207,20691,20692,20694,20696,20698,20700,20702,20704,20706,20708,20710,20712],{"class":1209,"line":1788},[1207,20693,1791],{"class":1632},[1207,20695,1795],{"class":1794},[1207,20697,1633],{"class":1632},[1207,20699,9511],{"class":1794},[1207,20701,1811],{"class":1632},[1207,20703,9516],{"class":1957},[1207,20705,1961],{"class":1632},[1207,20707,1965],{"class":1964},[1207,20709,1736],{"class":1224},[1207,20711,1965],{"class":1964},[1207,20713,2136],{"class":1632},[1207,20715,20716,20718,20721,20723,20725],{"class":1209,"line":1803},[1207,20717,1806],{"class":1735},[1207,20719,20720],{"class":1794}," services_ready",[1207,20722,1811],{"class":1632},[1207,20724,1815],{"class":1814},[1207,20726,1818],{"class":1632},[1207,20728,20729],{"class":1209,"line":1821},[1207,20730,1824],{"class":1749},[1207,20732,20733],{"class":1209,"line":1827},[1207,20734,20735],{"class":1756},"        Wait for all services to be ready before running tests\n",[1207,20737,20738],{"class":1209,"line":1833},[1207,20739,1836],{"class":1756},[1207,20741,20742],{"class":1209,"line":1839},[1207,20743,20744],{"class":1756},"        This fixture ensures that all required services are running\n",[1207,20746,20747],{"class":1209,"line":1845},[1207,20748,20749],{"class":1756},"        and responding before we start our E2E tests.\n",[1207,20751,20752],{"class":1209,"line":1851},[1207,20753,1824],{"class":1749},[1207,20755,20756,20759,20761],{"class":1209,"line":1856},[1207,20757,20758],{"class":1620},"        services ",[1207,20760,1961],{"class":1632},[1207,20762,5664],{"class":1632},[1207,20764,20765,20768,20770,20773,20775,20777,20779,20782,20784],{"class":1209,"line":1869},[1207,20766,20767],{"class":1632},"            (",[1207,20769,1965],{"class":1964},[1207,20771,20772],{"class":1224},"User Service",[1207,20774,1965],{"class":1964},[1207,20776,1644],{"class":1632},[1207,20778,2188],{"class":1964},[1207,20780,20781],{"class":1224},"http://user-service:8000/health/",[1207,20783,1965],{"class":1964},[1207,20785,7386],{"class":1632},[1207,20787,20788,20790,20792,20795,20797,20799,20801,20804,20806],{"class":1209,"line":1874},[1207,20789,20767],{"class":1632},[1207,20791,1965],{"class":1964},[1207,20793,20794],{"class":1224},"Order Service",[1207,20796,1965],{"class":1964},[1207,20798,1644],{"class":1632},[1207,20800,2188],{"class":1964},[1207,20802,20803],{"class":1224},"http://order-service:8001/health/",[1207,20805,1965],{"class":1964},[1207,20807,7386],{"class":1632},[1207,20809,20810,20812,20814,20817,20819,20821,20823,20826,20828],{"class":1209,"line":1885},[1207,20811,20767],{"class":1632},[1207,20813,1965],{"class":1964},[1207,20815,20816],{"class":1224},"Payment Service",[1207,20818,1965],{"class":1964},[1207,20820,1644],{"class":1632},[1207,20822,2188],{"class":1964},[1207,20824,20825],{"class":1224},"http://payment-service:8002/health/",[1207,20827,1965],{"class":1964},[1207,20829,7386],{"class":1632},[1207,20831,20832,20834,20836,20839,20841,20843,20845,20848,20850],{"class":1209,"line":1899},[1207,20833,20767],{"class":1632},[1207,20835,1965],{"class":1964},[1207,20837,20838],{"class":1224},"Inventory Service",[1207,20840,1965],{"class":1964},[1207,20842,1644],{"class":1632},[1207,20844,2188],{"class":1964},[1207,20846,20847],{"class":1224},"http://inventory-service:8003/health/",[1207,20849,1965],{"class":1964},[1207,20851,7386],{"class":1632},[1207,20853,20854,20856,20858,20861,20863,20865,20867,20870,20872],{"class":1209,"line":1904},[1207,20855,20767],{"class":1632},[1207,20857,1965],{"class":1964},[1207,20859,20860],{"class":1224},"Notification Service",[1207,20862,1965],{"class":1964},[1207,20864,1644],{"class":1632},[1207,20866,2188],{"class":1964},[1207,20868,20869],{"class":1224},"http://notification-service:8004/health/",[1207,20871,1965],{"class":1964},[1207,20873,2136],{"class":1632},[1207,20875,20876],{"class":1209,"line":1910},[1207,20877,5766],{"class":1632},[1207,20879,20880],{"class":1209,"line":1915},[1207,20881,1836],{"class":1620},[1207,20883,20884,20886,20889,20891,20894,20896,20899],{"class":1209,"line":1921},[1207,20885,5838],{"class":1616},[1207,20887,20888],{"class":1620}," service_name",[1207,20890,1644],{"class":1632},[1207,20892,20893],{"class":1620}," health_url ",[1207,20895,5752],{"class":1616},[1207,20897,20898],{"class":1620}," services",[1207,20900,1743],{"class":1632},[1207,20902,20903,20906,20908,20911,20913,20916,20918,20921],{"class":1209,"line":1927},[1207,20904,20905],{"class":13428},"            self",[1207,20907,1633],{"class":1632},[1207,20909,20910],{"class":1862},"wait_for_service",[1207,20912,1811],{"class":1632},[1207,20914,20915],{"class":1862},"service_name",[1207,20917,1644],{"class":1632},[1207,20919,20920],{"class":1862}," health_url",[1207,20922,2136],{"class":1632},[1207,20924,20925],{"class":1209,"line":1932},[1207,20926,1836],{"class":1620},[1207,20928,20929],{"class":1209,"line":1954},[1207,20930,17564],{"class":1616},[1207,20932,20933],{"class":1209,"line":1976},[1207,20934,1763],{"class":1620},[1207,20936,20937,20939,20942,20944,20946,20948,20950,20952,20955,20957,20960,20962,20965],{"class":1209,"line":1993},[1207,20938,1806],{"class":1735},[1207,20940,20941],{"class":1794}," wait_for_service",[1207,20943,1811],{"class":1632},[1207,20945,1815],{"class":1814},[1207,20947,1644],{"class":1632},[1207,20949,20888],{"class":2051},[1207,20951,1644],{"class":1632},[1207,20953,20954],{"class":2051}," url",[1207,20956,1644],{"class":1632},[1207,20958,20959],{"class":2051}," timeout",[1207,20961,1961],{"class":2163},[1207,20963,20964],{"class":1231},"60",[1207,20966,1818],{"class":1632},[1207,20968,20969],{"class":1209,"line":2009},[1207,20970,1824],{"class":1749},[1207,20972,20973],{"class":1209,"line":2015},[1207,20974,20975],{"class":1756},"        Wait for a service to be ready\n",[1207,20977,20978],{"class":1209,"line":2020},[1207,20979,1836],{"class":1756},[1207,20981,20982],{"class":1209,"line":2037},[1207,20983,20984],{"class":1756},"        This method polls a service's health endpoint until it responds\n",[1207,20986,20987],{"class":1209,"line":2060},[1207,20988,20989],{"class":1756},"        successfully or the timeout is reached.\n",[1207,20991,20992],{"class":1209,"line":2065},[1207,20993,1824],{"class":1749},[1207,20995,20996,20999,21001,21003,21006,21008,21010,21012,21015],{"class":1209,"line":2071},[1207,20997,20998],{"class":5160},"        print",[1207,21000,1811],{"class":1632},[1207,21002,12545],{"class":1735},[1207,21004,21005],{"class":1224},"\"Waiting for ",[1207,21007,3288],{"class":3287},[1207,21009,20915],{"class":1862},[1207,21011,3294],{"class":3287},[1207,21013,21014],{"class":1224}," to be ready...\"",[1207,21016,2136],{"class":1632},[1207,21018,21019,21021,21023,21025,21027,21029],{"class":1209,"line":2076},[1207,21020,19448],{"class":1620},[1207,21022,1961],{"class":1632},[1207,21024,19453],{"class":1620},[1207,21026,1633],{"class":1632},[1207,21028,19458],{"class":1862},[1207,21030,1866],{"class":1632},[1207,21032,21033],{"class":1209,"line":2082},[1207,21034,1836],{"class":1620},[1207,21036,21037,21040,21042,21044,21046,21048,21051,21054,21056,21058],{"class":1209,"line":2088},[1207,21038,21039],{"class":1616},"        while",[1207,21041,19453],{"class":1620},[1207,21043,1633],{"class":1632},[1207,21045,19458],{"class":1862},[1207,21047,4156],{"class":1632},[1207,21049,21050],{"class":2163}," -",[1207,21052,21053],{"class":1620}," start_time ",[1207,21055,19544],{"class":2163},[1207,21057,20959],{"class":1620},[1207,21059,1743],{"class":1632},[1207,21061,21062,21064],{"class":1209,"line":2094},[1207,21063,19732],{"class":1616},[1207,21065,1743],{"class":1632},[1207,21067,21068,21071,21073,21076,21078,21080,21082,21084,21086,21088,21090,21092],{"class":1209,"line":2100},[1207,21069,21070],{"class":1620},"                response ",[1207,21072,1961],{"class":1632},[1207,21074,21075],{"class":1620}," requests",[1207,21077,1633],{"class":1632},[1207,21079,5111],{"class":1862},[1207,21081,1811],{"class":1632},[1207,21083,3005],{"class":1862},[1207,21085,1644],{"class":1632},[1207,21087,20959],{"class":1957},[1207,21089,1961],{"class":1632},[1207,21091,4561],{"class":1231},[1207,21093,2136],{"class":1632},[1207,21095,21096,21099,21101,21103,21105,21107,21110],{"class":1209,"line":2105},[1207,21097,21098],{"class":1616},"                if",[1207,21100,6994],{"class":1620},[1207,21102,1633],{"class":1632},[1207,21104,2772],{"class":1942},[1207,21106,2164],{"class":2163},[1207,21108,21109],{"class":1231}," 200",[1207,21111,1743],{"class":1632},[1207,21113,21114,21117,21119,21121,21124,21126,21128,21130,21133],{"class":1209,"line":2111},[1207,21115,21116],{"class":5160},"                    print",[1207,21118,1811],{"class":1632},[1207,21120,12545],{"class":1735},[1207,21122,21123],{"class":1224},"\"✓ ",[1207,21125,3288],{"class":3287},[1207,21127,20915],{"class":1862},[1207,21129,3294],{"class":3287},[1207,21131,21132],{"class":1224}," is ready\"",[1207,21134,2136],{"class":1632},[1207,21136,21137],{"class":1209,"line":2139},[1207,21138,21139],{"class":1616},"                    return\n",[1207,21141,21142,21144,21146,21148,21151,21153,21155],{"class":1209,"line":2144},[1207,21143,19851],{"class":1616},[1207,21145,21075],{"class":1620},[1207,21147,1633],{"class":1632},[1207,21149,21150],{"class":1942},"RequestException",[1207,21152,13173],{"class":1616},[1207,21154,11129],{"class":1620},[1207,21156,1743],{"class":1632},[1207,21158,21159,21162,21164,21166,21169,21171,21173,21175,21178,21180,21182,21184,21186],{"class":1209,"line":2150},[1207,21160,21161],{"class":5160},"                print",[1207,21163,1811],{"class":1632},[1207,21165,12545],{"class":1735},[1207,21167,21168],{"class":1224},"\"  ",[1207,21170,3288],{"class":3287},[1207,21172,20915],{"class":1862},[1207,21174,3294],{"class":3287},[1207,21176,21177],{"class":1224}," not ready yet: ",[1207,21179,3288],{"class":3287},[1207,21181,13204],{"class":1862},[1207,21183,3294],{"class":3287},[1207,21185,3297],{"class":1224},[1207,21187,2136],{"class":1632},[1207,21189,21190],{"class":1209,"line":2174},[1207,21191,13162],{"class":1620},[1207,21193,21194,21197,21199,21202,21204,21206,21208],{"class":1209,"line":2195},[1207,21195,21196],{"class":1620},"            time",[1207,21198,1633],{"class":1632},[1207,21200,21201],{"class":1862},"sleep",[1207,21203,1811],{"class":1632},[1207,21205,10437],{"class":1231},[1207,21207,2328],{"class":1632},[1207,21209,21210],{"class":1213},"  # Wait 2 seconds before retrying\n",[1207,21212,21213],{"class":1209,"line":2215},[1207,21214,1836],{"class":1620},[1207,21216,21217,21220,21222,21224,21226,21228,21230,21232,21234,21237,21239,21242,21244,21247],{"class":1209,"line":2220},[1207,21218,21219],{"class":1616},"        raise",[1207,21221,13170],{"class":4020},[1207,21223,1811],{"class":1632},[1207,21225,12545],{"class":1735},[1207,21227,3297],{"class":1224},[1207,21229,3288],{"class":3287},[1207,21231,20915],{"class":1862},[1207,21233,3294],{"class":3287},[1207,21235,21236],{"class":1224}," not ready after ",[1207,21238,3288],{"class":3287},[1207,21240,21241],{"class":1862},"timeout",[1207,21243,3294],{"class":3287},[1207,21245,21246],{"class":1224}," seconds\"",[1207,21248,2136],{"class":1632},[1207,21250,21251],{"class":1209,"line":2235},[1207,21252,1763],{"class":1620},[1207,21254,21255,21257,21260,21262,21264,21266,21268],{"class":1209,"line":2253},[1207,21256,1806],{"class":1735},[1207,21258,21259],{"class":1794}," test_complete_user_order_flow",[1207,21261,1811],{"class":1632},[1207,21263,1815],{"class":1814},[1207,21265,1644],{"class":1632},[1207,21267,20720],{"class":2051},[1207,21269,1818],{"class":1632},[1207,21271,21272],{"class":1209,"line":2258},[1207,21273,1824],{"class":1749},[1207,21275,21276],{"class":1209,"line":2264},[1207,21277,21278],{"class":1756},"        Test complete flow from user creation to order completion\n",[1207,21280,21281],{"class":1209,"line":2269},[1207,21282,1836],{"class":1756},[1207,21284,21285],{"class":1209,"line":2275},[1207,21286,21287],{"class":1756},"        This test simulates a real user journey:\n",[1207,21289,21290],{"class":1209,"line":2281},[1207,21291,21292],{"class":1756},"        1. User registers on the platform\n",[1207,21294,21295],{"class":1209,"line":2286},[1207,21296,21297],{"class":1756},"        2. User browses products\n",[1207,21299,21300],{"class":1209,"line":2292},[1207,21301,21302],{"class":1756},"        3. User adds items to cart\n",[1207,21304,21305],{"class":1209,"line":2313},[1207,21306,21307],{"class":1756},"        4. User places an order\n",[1207,21309,21310],{"class":1209,"line":2334},[1207,21311,21312],{"class":1756},"        5. Payment is processed\n",[1207,21314,21315],{"class":1209,"line":2339},[1207,21316,21317],{"class":1756},"        6. Order is confirmed\n",[1207,21319,21320],{"class":1209,"line":2358},[1207,21321,21322],{"class":1756},"        7. User receives confirmation email\n",[1207,21324,21325],{"class":1209,"line":2381},[1207,21326,1836],{"class":1756},[1207,21328,21329],{"class":1209,"line":2386},[1207,21330,21331],{"class":1756},"        This tests the integration between User, Order, Payment,\n",[1207,21333,21334],{"class":1209,"line":2392},[1207,21335,21336],{"class":1756},"        Inventory, and Notification services.\n",[1207,21338,21339],{"class":1209,"line":2397},[1207,21340,1824],{"class":1749},[1207,21342,21343,21345,21347,21349,21352,21354],{"class":1209,"line":2403},[1207,21344,20998],{"class":5160},[1207,21346,1811],{"class":1632},[1207,21348,3297],{"class":1964},[1207,21350,21351],{"class":1224},"Starting complete user order flow test...",[1207,21353,3297],{"class":1964},[1207,21355,2136],{"class":1632},[1207,21357,21358],{"class":1209,"line":2409},[1207,21359,1836],{"class":1620},[1207,21361,21362],{"class":1209,"line":2414},[1207,21363,21364],{"class":1213},"        # Step 1: Create a new user\n",[1207,21366,21367,21369,21371,21373,21376,21378],{"class":1209,"line":2420},[1207,21368,20998],{"class":5160},[1207,21370,1811],{"class":1632},[1207,21372,3297],{"class":1964},[1207,21374,21375],{"class":1224},"Step 1: Creating user...",[1207,21377,3297],{"class":1964},[1207,21379,2136],{"class":1632},[1207,21381,21382,21384,21386],{"class":1209,"line":2426},[1207,21383,2440],{"class":1620},[1207,21385,1961],{"class":1632},[1207,21387,2445],{"class":1632},[1207,21389,21390,21392,21394,21396,21398,21400,21403,21405],{"class":1209,"line":2431},[1207,21391,2451],{"class":1964},[1207,21393,2183],{"class":1224},[1207,21395,1965],{"class":1964},[1207,21397,2458],{"class":1632},[1207,21399,2188],{"class":1964},[1207,21401,21402],{"class":1224},"e2euser",[1207,21404,1965],{"class":1964},[1207,21406,1973],{"class":1632},[1207,21408,21409,21411,21413,21415,21417,21419,21422,21424],{"class":1209,"line":2437},[1207,21410,2451],{"class":1964},[1207,21412,2204],{"class":1224},[1207,21414,1965],{"class":1964},[1207,21416,2458],{"class":1632},[1207,21418,2188],{"class":1964},[1207,21420,21421],{"class":1224},"e2e@example.com",[1207,21423,1965],{"class":1964},[1207,21425,1973],{"class":1632},[1207,21427,21428,21430,21432,21434,21436,21438,21440,21442],{"class":1209,"line":2448},[1207,21429,2451],{"class":1964},[1207,21431,2495],{"class":1224},[1207,21433,1965],{"class":1964},[1207,21435,2458],{"class":1632},[1207,21437,2188],{"class":1964},[1207,21439,2003],{"class":1224},[1207,21441,1965],{"class":1964},[1207,21443,1973],{"class":1632},[1207,21445,21446,21448,21450,21452,21454,21456,21459,21461],{"class":1209,"line":2470},[1207,21447,2451],{"class":1964},[1207,21449,2516],{"class":1224},[1207,21451,1965],{"class":1964},[1207,21453,2458],{"class":1632},[1207,21455,2188],{"class":1964},[1207,21457,21458],{"class":1224},"E2E",[1207,21460,1965],{"class":1964},[1207,21462,1973],{"class":1632},[1207,21464,21465,21467,21469,21471,21473,21475,21477],{"class":1209,"line":2490},[1207,21466,2451],{"class":1964},[1207,21468,2537],{"class":1224},[1207,21470,1965],{"class":1964},[1207,21472,2458],{"class":1632},[1207,21474,2188],{"class":1964},[1207,21476,2546],{"class":1224},[1207,21478,2006],{"class":1964},[1207,21480,21481],{"class":1209,"line":2511},[1207,21482,2554],{"class":1632},[1207,21484,21485],{"class":1209,"line":2532},[1207,21486,1836],{"class":1620},[1207,21488,21489,21492,21494,21496,21498,21500],{"class":1209,"line":2551},[1207,21490,21491],{"class":1620},"        user_response ",[1207,21493,1961],{"class":1632},[1207,21495,21075],{"class":1620},[1207,21497,1633],{"class":1632},[1207,21499,7368],{"class":1862},[1207,21501,1951],{"class":1632},[1207,21503,21504,21506,21509,21511],{"class":1209,"line":2557},[1207,21505,2451],{"class":1964},[1207,21507,21508],{"class":1224},"http://user-service:8000/api/users/",[1207,21510,1965],{"class":1964},[1207,21512,1973],{"class":1632},[1207,21514,21515,21517,21519,21521],{"class":1209,"line":2562},[1207,21516,13896],{"class":1957},[1207,21518,1961],{"class":1632},[1207,21520,2583],{"class":1862},[1207,21522,1973],{"class":1632},[1207,21524,21525,21528,21530],{"class":1209,"line":2567},[1207,21526,21527],{"class":1957},"            timeout",[1207,21529,1961],{"class":1632},[1207,21531,21532],{"class":1231},"10\n",[1207,21534,21535],{"class":1209,"line":2588},[1207,21536,2012],{"class":1632},[1207,21538,21539,21541,21544,21546,21548,21550,21553,21555,21557,21560,21562,21565,21567,21569,21571],{"class":1209,"line":2593},[1207,21540,2153],{"class":1616},[1207,21542,21543],{"class":1620}," user_response",[1207,21545,1633],{"class":1632},[1207,21547,2772],{"class":1942},[1207,21549,2164],{"class":2163},[1207,21551,21552],{"class":1231}," 201",[1207,21554,1644],{"class":1632},[1207,21556,3281],{"class":1735},[1207,21558,21559],{"class":1224},"\"User creation failed: ",[1207,21561,3288],{"class":3287},[1207,21563,21564],{"class":1620},"user_response",[1207,21566,1633],{"class":1632},[1207,21568,3552],{"class":1942},[1207,21570,3294],{"class":3287},[1207,21572,11115],{"class":1224},[1207,21574,21575],{"class":1209,"line":2599},[1207,21576,1836],{"class":1620},[1207,21578,21579,21581,21583,21585,21587,21589],{"class":1209,"line":2619},[1207,21580,2570],{"class":1620},[1207,21582,1961],{"class":1632},[1207,21584,21543],{"class":1620},[1207,21586,1633],{"class":1632},[1207,21588,2792],{"class":1862},[1207,21590,1866],{"class":1632},[1207,21592,21593,21596,21598,21600,21602,21604,21606,21608],{"class":1209,"line":2624},[1207,21594,21595],{"class":1620},"        user_id ",[1207,21597,1961],{"class":1632},[1207,21599,2604],{"class":1620},[1207,21601,2989],{"class":1632},[1207,21603,1965],{"class":1964},[1207,21605,2133],{"class":1224},[1207,21607,1965],{"class":1964},[1207,21609,13328],{"class":1632},[1207,21611,21612,21614,21616,21618,21621,21623,21626,21628,21630],{"class":1209,"line":2630},[1207,21613,20998],{"class":5160},[1207,21615,1811],{"class":1632},[1207,21617,12545],{"class":1735},[1207,21619,21620],{"class":1224},"\"✓ User created with ID: ",[1207,21622,3288],{"class":3287},[1207,21624,21625],{"class":1862},"user_id",[1207,21627,3294],{"class":3287},[1207,21629,3297],{"class":1224},[1207,21631,2136],{"class":1632},[1207,21633,21634],{"class":1209,"line":2652},[1207,21635,1836],{"class":1620},[1207,21637,21638],{"class":1209,"line":2657},[1207,21639,21640],{"class":1213},"        # Step 2: Authenticate the user\n",[1207,21642,21643,21645,21647,21649,21652,21654],{"class":1209,"line":2675},[1207,21644,20998],{"class":5160},[1207,21646,1811],{"class":1632},[1207,21648,3297],{"class":1964},[1207,21650,21651],{"class":1224},"Step 2: Authenticating user...",[1207,21653,3297],{"class":1964},[1207,21655,2136],{"class":1632},[1207,21657,21658,21661,21663,21665,21667,21669],{"class":1209,"line":2702},[1207,21659,21660],{"class":1620},"        auth_response ",[1207,21662,1961],{"class":1632},[1207,21664,21075],{"class":1620},[1207,21666,1633],{"class":1632},[1207,21668,7368],{"class":1862},[1207,21670,1951],{"class":1632},[1207,21672,21673,21675,21678,21680],{"class":1209,"line":2707},[1207,21674,2451],{"class":1964},[1207,21676,21677],{"class":1224},"http://user-service:8000/api/auth/login/",[1207,21679,1965],{"class":1964},[1207,21681,1973],{"class":1632},[1207,21683,21684,21686],{"class":1209,"line":2713},[1207,21685,13896],{"class":1957},[1207,21687,17367],{"class":1632},[1207,21689,21690,21692,21694,21696,21698,21700,21702,21704],{"class":1209,"line":2718},[1207,21691,4969],{"class":1964},[1207,21693,2183],{"class":1224},[1207,21695,1965],{"class":1964},[1207,21697,2458],{"class":1632},[1207,21699,2188],{"class":1964},[1207,21701,21402],{"class":1224},[1207,21703,1965],{"class":1964},[1207,21705,1973],{"class":1632},[1207,21707,21708,21710,21712,21714,21716,21718,21720],{"class":1209,"line":2724},[1207,21709,4969],{"class":1964},[1207,21711,2495],{"class":1224},[1207,21713,1965],{"class":1964},[1207,21715,2458],{"class":1632},[1207,21717,2188],{"class":1964},[1207,21719,2003],{"class":1224},[1207,21721,2006],{"class":1964},[1207,21723,21724],{"class":1209,"line":2730},[1207,21725,11370],{"class":1632},[1207,21727,21728,21730,21732],{"class":1209,"line":2736},[1207,21729,21527],{"class":1957},[1207,21731,1961],{"class":1632},[1207,21733,21532],{"class":1231},[1207,21735,21736],{"class":1209,"line":2742},[1207,21737,2012],{"class":1632},[1207,21739,21740,21742,21745,21747,21749,21751,21753,21755,21757,21760,21762,21765,21767,21769,21771],{"class":1209,"line":2748},[1207,21741,2153],{"class":1616},[1207,21743,21744],{"class":1620}," auth_response",[1207,21746,1633],{"class":1632},[1207,21748,2772],{"class":1942},[1207,21750,2164],{"class":2163},[1207,21752,21109],{"class":1231},[1207,21754,1644],{"class":1632},[1207,21756,3281],{"class":1735},[1207,21758,21759],{"class":1224},"\"Authentication failed: ",[1207,21761,3288],{"class":3287},[1207,21763,21764],{"class":1620},"auth_response",[1207,21766,1633],{"class":1632},[1207,21768,3552],{"class":1942},[1207,21770,3294],{"class":3287},[1207,21772,11115],{"class":1224},[1207,21774,21775],{"class":1209,"line":2753},[1207,21776,1836],{"class":1620},[1207,21778,21779,21782,21784,21786,21788,21790],{"class":1209,"line":2759},[1207,21780,21781],{"class":1620},"        auth_data ",[1207,21783,1961],{"class":1632},[1207,21785,21744],{"class":1620},[1207,21787,1633],{"class":1632},[1207,21789,2792],{"class":1862},[1207,21791,1866],{"class":1632},[1207,21793,21794,21797,21799,21802,21804,21806,21808,21810,21812,21814,21816,21819,21821,21823,21825,21827,21829,21831,21833],{"class":1209,"line":2781},[1207,21795,21796],{"class":1620},"        auth_token ",[1207,21798,1961],{"class":1632},[1207,21800,21801],{"class":1620}," auth_data",[1207,21803,1633],{"class":1632},[1207,21805,5111],{"class":1862},[1207,21807,1811],{"class":1632},[1207,21809,1965],{"class":1964},[1207,21811,16193],{"class":1224},[1207,21813,1965],{"class":1964},[1207,21815,2328],{"class":1632},[1207,21817,21818],{"class":2163}," or",[1207,21820,21801],{"class":1620},[1207,21822,1633],{"class":1632},[1207,21824,5111],{"class":1862},[1207,21826,1811],{"class":1632},[1207,21828,1965],{"class":1964},[1207,21830,16208],{"class":1224},[1207,21832,1965],{"class":1964},[1207,21834,2136],{"class":1632},[1207,21836,21837,21839,21842,21844,21846,21849],{"class":1209,"line":2820},[1207,21838,2153],{"class":1616},[1207,21840,21841],{"class":1620}," auth_token",[1207,21843,1644],{"class":1632},[1207,21845,11109],{"class":1964},[1207,21847,21848],{"class":1224},"No authentication token received",[1207,21850,11115],{"class":1964},[1207,21852,21853],{"class":1209,"line":2825},[1207,21854,1836],{"class":1620},[1207,21856,21857,21860,21862,21864,21866,21869,21871,21873,21875,21878,21880,21883,21885,21887],{"class":1209,"line":2830},[1207,21858,21859],{"class":1620},"        headers ",[1207,21861,1961],{"class":1632},[1207,21863,2801],{"class":1632},[1207,21865,1965],{"class":1964},[1207,21867,21868],{"class":1224},"Authorization",[1207,21870,1965],{"class":1964},[1207,21872,2458],{"class":1632},[1207,21874,3281],{"class":1735},[1207,21876,21877],{"class":1224},"'Bearer ",[1207,21879,3288],{"class":3287},[1207,21881,21882],{"class":1620},"auth_token",[1207,21884,3294],{"class":3287},[1207,21886,1965],{"class":1224},[1207,21888,2817],{"class":1632},[1207,21890,21891,21893,21895,21897,21900,21902],{"class":1209,"line":2846},[1207,21892,20998],{"class":5160},[1207,21894,1811],{"class":1632},[1207,21896,3297],{"class":1964},[1207,21898,21899],{"class":1224},"✓ User authenticated successfully",[1207,21901,3297],{"class":1964},[1207,21903,2136],{"class":1632},[1207,21905,21906],{"class":1209,"line":2861},[1207,21907,1836],{"class":1620},[1207,21909,21910],{"class":1209,"line":2884},[1207,21911,21912],{"class":1213},"        # Step 3: Check available products\n",[1207,21914,21915,21917,21919,21921,21924,21926],{"class":1209,"line":2889},[1207,21916,20998],{"class":5160},[1207,21918,1811],{"class":1632},[1207,21920,3297],{"class":1964},[1207,21922,21923],{"class":1224},"Step 3: Checking available products...",[1207,21925,3297],{"class":1964},[1207,21927,2136],{"class":1632},[1207,21929,21930,21933,21935,21937,21939,21941],{"class":1209,"line":2894},[1207,21931,21932],{"class":1620},"        products_response ",[1207,21934,1961],{"class":1632},[1207,21936,21075],{"class":1620},[1207,21938,1633],{"class":1632},[1207,21940,5111],{"class":1862},[1207,21942,1951],{"class":1632},[1207,21944,21945,21947,21950,21952],{"class":1209,"line":2900},[1207,21946,2451],{"class":1964},[1207,21948,21949],{"class":1224},"http://inventory-service:8003/api/products/",[1207,21951,1965],{"class":1964},[1207,21953,1973],{"class":1632},[1207,21955,21956,21959,21961,21964],{"class":1209,"line":2914},[1207,21957,21958],{"class":1957},"            headers",[1207,21960,1961],{"class":1632},[1207,21962,21963],{"class":1862},"headers",[1207,21965,1973],{"class":1632},[1207,21967,21968,21970,21972],{"class":1209,"line":2919},[1207,21969,21527],{"class":1957},[1207,21971,1961],{"class":1632},[1207,21973,21532],{"class":1231},[1207,21975,21976],{"class":1209,"line":2925},[1207,21977,2012],{"class":1632},[1207,21979,21980,21982,21985,21987,21989,21991,21993,21995,21997,22000,22002,22005,22007,22009,22011],{"class":1209,"line":2945},[1207,21981,2153],{"class":1616},[1207,21983,21984],{"class":1620}," products_response",[1207,21986,1633],{"class":1632},[1207,21988,2772],{"class":1942},[1207,21990,2164],{"class":2163},[1207,21992,21109],{"class":1231},[1207,21994,1644],{"class":1632},[1207,21996,3281],{"class":1735},[1207,21998,21999],{"class":1224},"\"Product fetch failed: ",[1207,22001,3288],{"class":3287},[1207,22003,22004],{"class":1620},"products_response",[1207,22006,1633],{"class":1632},[1207,22008,3552],{"class":1942},[1207,22010,3294],{"class":3287},[1207,22012,11115],{"class":1224},[1207,22014,22015],{"class":1209,"line":2950},[1207,22016,1836],{"class":1620},[1207,22018,22019,22022,22024,22026,22028,22030],{"class":1209,"line":2956},[1207,22020,22021],{"class":1620},"        products ",[1207,22023,1961],{"class":1632},[1207,22025,21984],{"class":1620},[1207,22027,1633],{"class":1632},[1207,22029,2792],{"class":1862},[1207,22031,1866],{"class":1632},[1207,22033,22034,22036,22038,22040,22043,22045,22048,22051,22053,22055,22058],{"class":1209,"line":2971},[1207,22035,2153],{"class":1616},[1207,22037,5812],{"class":5160},[1207,22039,1811],{"class":1632},[1207,22041,22042],{"class":1862},"products",[1207,22044,2328],{"class":1632},[1207,22046,22047],{"class":2163}," >",[1207,22049,22050],{"class":1231}," 0",[1207,22052,1644],{"class":1632},[1207,22054,11109],{"class":1964},[1207,22056,22057],{"class":1224},"No products available",[1207,22059,11115],{"class":1964},[1207,22061,22062,22064,22066,22068,22071,22073,22075,22077,22079,22081,22083,22086],{"class":1209,"line":3016},[1207,22063,20998],{"class":5160},[1207,22065,1811],{"class":1632},[1207,22067,12545],{"class":1735},[1207,22069,22070],{"class":1224},"\"✓ Found ",[1207,22072,3288],{"class":3287},[1207,22074,12635],{"class":5160},[1207,22076,1811],{"class":1632},[1207,22078,22042],{"class":1862},[1207,22080,2328],{"class":1632},[1207,22082,3294],{"class":3287},[1207,22084,22085],{"class":1224}," available products\"",[1207,22087,2136],{"class":1632},[1207,22089,22090],{"class":1209,"line":5981},[1207,22091,1836],{"class":1620},[1207,22093,22094],{"class":1209,"line":5987},[1207,22095,22096],{"class":1213},"        # Step 4: Create an order with multiple items\n",[1207,22098,22099,22101,22103,22105,22108,22110],{"class":1209,"line":5992},[1207,22100,20998],{"class":5160},[1207,22102,1811],{"class":1632},[1207,22104,3297],{"class":1964},[1207,22106,22107],{"class":1224},"Step 4: Creating order...",[1207,22109,3297],{"class":1964},[1207,22111,2136],{"class":1632},[1207,22113,22114,22117,22119],{"class":1209,"line":6003},[1207,22115,22116],{"class":1620},"        order_data ",[1207,22118,1961],{"class":1632},[1207,22120,2445],{"class":1632},[1207,22122,22123,22125,22127,22129,22131,22134],{"class":1209,"line":6008},[1207,22124,2451],{"class":1964},[1207,22126,21625],{"class":1224},[1207,22128,1965],{"class":1964},[1207,22130,2458],{"class":1632},[1207,22132,22133],{"class":1620}," user_id",[1207,22135,1973],{"class":1632},[1207,22137,22138,22140,22143,22145,22147],{"class":1209,"line":6014},[1207,22139,2451],{"class":1964},[1207,22141,22142],{"class":1224},"items",[1207,22144,1965],{"class":1964},[1207,22146,2458],{"class":1632},[1207,22148,5664],{"class":1632},[1207,22150,22151],{"class":1209,"line":6030},[1207,22152,22153],{"class":1632},"                {\n",[1207,22155,22156,22158,22161,22163,22165,22168,22170,22172,22174,22176,22178,22180],{"class":1209,"line":6050},[1207,22157,17781],{"class":1964},[1207,22159,22160],{"class":1224},"product_id",[1207,22162,1965],{"class":1964},[1207,22164,2458],{"class":1632},[1207,22166,22167],{"class":1620}," products",[1207,22169,2989],{"class":1632},[1207,22171,2992],{"class":1231},[1207,22173,2995],{"class":1632},[1207,22175,1965],{"class":1964},[1207,22177,2133],{"class":1224},[1207,22179,1965],{"class":1964},[1207,22181,22182],{"class":1632},"],\n",[1207,22184,22185,22187,22190,22192,22194,22196],{"class":1209,"line":6070},[1207,22186,17781],{"class":1964},[1207,22188,22189],{"class":1224},"quantity",[1207,22191,1965],{"class":1964},[1207,22193,2458],{"class":1632},[1207,22195,2939],{"class":1231},[1207,22197,1973],{"class":1632},[1207,22199,22200,22202,22205,22207,22209,22211,22213,22215,22217,22219,22221,22223],{"class":1209,"line":6089},[1207,22201,17781],{"class":1964},[1207,22203,22204],{"class":1224},"price",[1207,22206,1965],{"class":1964},[1207,22208,2458],{"class":1632},[1207,22210,22167],{"class":1620},[1207,22212,2989],{"class":1632},[1207,22214,2992],{"class":1231},[1207,22216,2995],{"class":1632},[1207,22218,1965],{"class":1964},[1207,22220,22204],{"class":1224},[1207,22222,1965],{"class":1964},[1207,22224,13328],{"class":1632},[1207,22226,22227],{"class":1209,"line":6102},[1207,22228,22229],{"class":1632},"                },\n",[1207,22231,22232],{"class":1209,"line":6122},[1207,22233,22153],{"class":1632},[1207,22235,22236,22238,22240,22242,22244,22246,22248,22250,22252,22254,22256,22258,22260,22263,22265,22267,22269,22271,22273,22276,22279,22281,22283,22285,22287,22289,22291,22293],{"class":1209,"line":6140},[1207,22237,17781],{"class":1964},[1207,22239,22160],{"class":1224},[1207,22241,1965],{"class":1964},[1207,22243,2458],{"class":1632},[1207,22245,22167],{"class":1620},[1207,22247,2989],{"class":1632},[1207,22249,2998],{"class":1231},[1207,22251,2995],{"class":1632},[1207,22253,1965],{"class":1964},[1207,22255,2133],{"class":1224},[1207,22257,1965],{"class":1964},[1207,22259,3010],{"class":1632},[1207,22261,22262],{"class":1616}," if",[1207,22264,5812],{"class":5160},[1207,22266,1811],{"class":1632},[1207,22268,22042],{"class":1862},[1207,22270,2328],{"class":1632},[1207,22272,22047],{"class":2163},[1207,22274,22275],{"class":1231}," 1",[1207,22277,22278],{"class":1616}," else",[1207,22280,22167],{"class":1620},[1207,22282,2989],{"class":1632},[1207,22284,2992],{"class":1231},[1207,22286,2995],{"class":1632},[1207,22288,1965],{"class":1964},[1207,22290,2133],{"class":1224},[1207,22292,1965],{"class":1964},[1207,22294,22182],{"class":1632},[1207,22296,22297,22299,22301,22303,22305,22307],{"class":1209,"line":6145},[1207,22298,17781],{"class":1964},[1207,22300,22189],{"class":1224},[1207,22302,1965],{"class":1964},[1207,22304,2458],{"class":1632},[1207,22306,22275],{"class":1231},[1207,22308,1973],{"class":1632},[1207,22310,22311,22313,22315,22317,22319,22321,22323,22325,22327,22329,22331,22333,22335,22337,22339,22341,22343,22345,22347,22349,22351,22353,22355,22357,22359,22361,22363,22365],{"class":1209,"line":6151},[1207,22312,17781],{"class":1964},[1207,22314,22204],{"class":1224},[1207,22316,1965],{"class":1964},[1207,22318,2458],{"class":1632},[1207,22320,22167],{"class":1620},[1207,22322,2989],{"class":1632},[1207,22324,2998],{"class":1231},[1207,22326,2995],{"class":1632},[1207,22328,1965],{"class":1964},[1207,22330,22204],{"class":1224},[1207,22332,1965],{"class":1964},[1207,22334,3010],{"class":1632},[1207,22336,22262],{"class":1616},[1207,22338,5812],{"class":5160},[1207,22340,1811],{"class":1632},[1207,22342,22042],{"class":1862},[1207,22344,2328],{"class":1632},[1207,22346,22047],{"class":2163},[1207,22348,22275],{"class":1231},[1207,22350,22278],{"class":1616},[1207,22352,22167],{"class":1620},[1207,22354,2989],{"class":1632},[1207,22356,2992],{"class":1231},[1207,22358,2995],{"class":1632},[1207,22360,1965],{"class":1964},[1207,22362,22204],{"class":1224},[1207,22364,1965],{"class":1964},[1207,22366,13328],{"class":1632},[1207,22368,22369],{"class":1209,"line":6156},[1207,22370,17802],{"class":1632},[1207,22372,22373],{"class":1209,"line":6162},[1207,22374,22375],{"class":1632},"            ],\n",[1207,22377,22378,22380,22383,22385,22387],{"class":1209,"line":6189},[1207,22379,2451],{"class":1964},[1207,22381,22382],{"class":1224},"shipping_address",[1207,22384,1965],{"class":1964},[1207,22386,2458],{"class":1632},[1207,22388,2445],{"class":1632},[1207,22390,22391,22393,22396,22398,22400,22402,22405,22407],{"class":1209,"line":6208},[1207,22392,4969],{"class":1964},[1207,22394,22395],{"class":1224},"street",[1207,22397,1965],{"class":1964},[1207,22399,2458],{"class":1632},[1207,22401,2188],{"class":1964},[1207,22403,22404],{"class":1224},"123 Test Street",[1207,22406,1965],{"class":1964},[1207,22408,1973],{"class":1632},[1207,22410,22411,22413,22416,22418,22420,22422,22425,22427],{"class":1209,"line":6228},[1207,22412,4969],{"class":1964},[1207,22414,22415],{"class":1224},"city",[1207,22417,1965],{"class":1964},[1207,22419,2458],{"class":1632},[1207,22421,2188],{"class":1964},[1207,22423,22424],{"class":1224},"Test City",[1207,22426,1965],{"class":1964},[1207,22428,1973],{"class":1632},[1207,22430,22431,22433,22435,22437,22439,22441,22444,22446],{"class":1209,"line":6241},[1207,22432,4969],{"class":1964},[1207,22434,12954],{"class":1224},[1207,22436,1965],{"class":1964},[1207,22438,2458],{"class":1632},[1207,22440,2188],{"class":1964},[1207,22442,22443],{"class":1224},"TS",[1207,22445,1965],{"class":1964},[1207,22447,1973],{"class":1632},[1207,22449,22450,22452,22455,22457,22459,22461,22464,22466],{"class":1209,"line":6261},[1207,22451,4969],{"class":1964},[1207,22453,22454],{"class":1224},"zip_code",[1207,22456,1965],{"class":1964},[1207,22458,2458],{"class":1632},[1207,22460,2188],{"class":1964},[1207,22462,22463],{"class":1224},"12345",[1207,22465,1965],{"class":1964},[1207,22467,1973],{"class":1632},[1207,22469,22470,22472,22475,22477,22479,22481,22484],{"class":1209,"line":6279},[1207,22471,4969],{"class":1964},[1207,22473,22474],{"class":1224},"country",[1207,22476,1965],{"class":1964},[1207,22478,2458],{"class":1632},[1207,22480,2188],{"class":1964},[1207,22482,22483],{"class":1224},"US",[1207,22485,2006],{"class":1964},[1207,22487,22488],{"class":1209,"line":6284},[1207,22489,5006],{"class":1632},[1207,22491,22492],{"class":1209,"line":6289},[1207,22493,2554],{"class":1632},[1207,22495,22496],{"class":1209,"line":6294},[1207,22497,1836],{"class":1620},[1207,22499,22500,22503,22505,22507,22509,22511],{"class":1209,"line":6300},[1207,22501,22502],{"class":1620},"        order_response ",[1207,22504,1961],{"class":1632},[1207,22506,21075],{"class":1620},[1207,22508,1633],{"class":1632},[1207,22510,7368],{"class":1862},[1207,22512,1951],{"class":1632},[1207,22514,22515,22517,22520,22522],{"class":1209,"line":6320},[1207,22516,2451],{"class":1964},[1207,22518,22519],{"class":1224},"http://order-service:8001/api/orders/",[1207,22521,1965],{"class":1964},[1207,22523,1973],{"class":1632},[1207,22525,22526,22528,22530,22533],{"class":1209,"line":6339},[1207,22527,13896],{"class":1957},[1207,22529,1961],{"class":1632},[1207,22531,22532],{"class":1862},"order_data",[1207,22534,1973],{"class":1632},[1207,22536,22537,22539,22541,22543],{"class":1209,"line":6344},[1207,22538,21958],{"class":1957},[1207,22540,1961],{"class":1632},[1207,22542,21963],{"class":1862},[1207,22544,1973],{"class":1632},[1207,22546,22547,22549,22551],{"class":1209,"line":6350},[1207,22548,21527],{"class":1957},[1207,22550,1961],{"class":1632},[1207,22552,22553],{"class":1231},"15\n",[1207,22555,22556],{"class":1209,"line":6366},[1207,22557,2012],{"class":1632},[1207,22559,22560,22562,22565,22567,22569,22571,22573,22575,22577,22580,22582,22585,22587,22589,22591],{"class":1209,"line":6389},[1207,22561,2153],{"class":1616},[1207,22563,22564],{"class":1620}," order_response",[1207,22566,1633],{"class":1632},[1207,22568,2772],{"class":1942},[1207,22570,2164],{"class":2163},[1207,22572,21552],{"class":1231},[1207,22574,1644],{"class":1632},[1207,22576,3281],{"class":1735},[1207,22578,22579],{"class":1224},"\"Order creation failed: ",[1207,22581,3288],{"class":3287},[1207,22583,22584],{"class":1620},"order_response",[1207,22586,1633],{"class":1632},[1207,22588,3552],{"class":1942},[1207,22590,3294],{"class":3287},[1207,22592,11115],{"class":1224},[1207,22594,22595],{"class":1209,"line":6412},[1207,22596,1836],{"class":1620},[1207,22598,22599,22602,22604,22606,22608,22610],{"class":1209,"line":6417},[1207,22600,22601],{"class":1620},"        order ",[1207,22603,1961],{"class":1632},[1207,22605,22564],{"class":1620},[1207,22607,1633],{"class":1632},[1207,22609,2792],{"class":1862},[1207,22611,1866],{"class":1632},[1207,22613,22614,22617,22619,22622,22624,22626,22628,22630],{"class":1209,"line":6423},[1207,22615,22616],{"class":1620},"        order_id ",[1207,22618,1961],{"class":1632},[1207,22620,22621],{"class":1620}," order",[1207,22623,2989],{"class":1632},[1207,22625,1965],{"class":1964},[1207,22627,2133],{"class":1224},[1207,22629,1965],{"class":1964},[1207,22631,13328],{"class":1632},[1207,22633,22634,22636,22638,22640,22643,22645,22648,22650,22652],{"class":1209,"line":6468},[1207,22635,20998],{"class":5160},[1207,22637,1811],{"class":1632},[1207,22639,12545],{"class":1735},[1207,22641,22642],{"class":1224},"\"✓ Order created with ID: ",[1207,22644,3288],{"class":3287},[1207,22646,22647],{"class":1862},"order_id",[1207,22649,3294],{"class":3287},[1207,22651,3297],{"class":1224},[1207,22653,2136],{"class":1632},[1207,22655,22656],{"class":1209,"line":6487},[1207,22657,1836],{"class":1620},[1207,22659,22660],{"class":1209,"line":8226},[1207,22661,22662],{"class":1213},"        # Step 5: Process payment\n",[1207,22664,22665,22667,22669,22671,22674,22676],{"class":1209,"line":8239},[1207,22666,20998],{"class":5160},[1207,22668,1811],{"class":1632},[1207,22670,3297],{"class":1964},[1207,22672,22673],{"class":1224},"Step 5: Processing payment...",[1207,22675,3297],{"class":1964},[1207,22677,2136],{"class":1632},[1207,22679,22680,22683,22685],{"class":1209,"line":8244},[1207,22681,22682],{"class":1620},"        payment_data ",[1207,22684,1961],{"class":1632},[1207,22686,2445],{"class":1632},[1207,22688,22689,22691,22693,22695,22697,22700],{"class":1209,"line":8249},[1207,22690,2451],{"class":1964},[1207,22692,22647],{"class":1224},[1207,22694,1965],{"class":1964},[1207,22696,2458],{"class":1632},[1207,22698,22699],{"class":1620}," order_id",[1207,22701,1973],{"class":1632},[1207,22703,22704,22706,22709,22711,22713,22715,22718,22720],{"class":1209,"line":8255},[1207,22705,2451],{"class":1964},[1207,22707,22708],{"class":1224},"payment_method",[1207,22710,1965],{"class":1964},[1207,22712,2458],{"class":1632},[1207,22714,2188],{"class":1964},[1207,22716,22717],{"class":1224},"credit_card",[1207,22719,1965],{"class":1964},[1207,22721,1973],{"class":1632},[1207,22723,22724,22726,22729,22731,22733],{"class":1209,"line":8274},[1207,22725,2451],{"class":1964},[1207,22727,22728],{"class":1224},"card_details",[1207,22730,1965],{"class":1964},[1207,22732,2458],{"class":1632},[1207,22734,2445],{"class":1632},[1207,22736,22737,22739,22742,22744,22746,22748,22751,22753,22755],{"class":1209,"line":8279},[1207,22738,4969],{"class":1964},[1207,22740,22741],{"class":1224},"card_number",[1207,22743,1965],{"class":1964},[1207,22745,2458],{"class":1632},[1207,22747,2188],{"class":1964},[1207,22749,22750],{"class":1224},"4111111111111111",[1207,22752,1965],{"class":1964},[1207,22754,1644],{"class":1632},[1207,22756,22757],{"class":1213},"  # Test card number\n",[1207,22759,22760,22762,22765,22767,22769,22771,22774,22776],{"class":1209,"line":8294},[1207,22761,4969],{"class":1964},[1207,22763,22764],{"class":1224},"expiry_month",[1207,22766,1965],{"class":1964},[1207,22768,2458],{"class":1632},[1207,22770,2188],{"class":1964},[1207,22772,22773],{"class":1224},"12",[1207,22775,1965],{"class":1964},[1207,22777,1973],{"class":1632},[1207,22779,22780,22782,22785,22787,22789,22791,22794,22796],{"class":1209,"line":8319},[1207,22781,4969],{"class":1964},[1207,22783,22784],{"class":1224},"expiry_year",[1207,22786,1965],{"class":1964},[1207,22788,2458],{"class":1632},[1207,22790,2188],{"class":1964},[1207,22792,22793],{"class":1224},"2025",[1207,22795,1965],{"class":1964},[1207,22797,1973],{"class":1632},[1207,22799,22800,22802,22805,22807,22809,22811,22813],{"class":1209,"line":8344},[1207,22801,4969],{"class":1964},[1207,22803,22804],{"class":1224},"cvv",[1207,22806,1965],{"class":1964},[1207,22808,2458],{"class":1632},[1207,22810,2188],{"class":1964},[1207,22812,16575],{"class":1224},[1207,22814,2006],{"class":1964},[1207,22816,22817],{"class":1209,"line":8349},[1207,22818,11370],{"class":1632},[1207,22820,22821,22823,22826,22828,22830,22833,22835,22837,22839,22841],{"class":1209,"line":8355},[1207,22822,2451],{"class":1964},[1207,22824,22825],{"class":1224},"billing_address",[1207,22827,1965],{"class":1964},[1207,22829,2458],{"class":1632},[1207,22831,22832],{"class":1620}," order_data",[1207,22834,2989],{"class":1632},[1207,22836,1965],{"class":1964},[1207,22838,22382],{"class":1224},[1207,22840,1965],{"class":1964},[1207,22842,13328],{"class":1632},[1207,22844,22845],{"class":1209,"line":8367},[1207,22846,2554],{"class":1632},[1207,22848,22849],{"class":1209,"line":8386},[1207,22850,1836],{"class":1620},[1207,22852,22853,22856,22858,22860,22862,22864],{"class":1209,"line":8405},[1207,22854,22855],{"class":1620},"        payment_response ",[1207,22857,1961],{"class":1632},[1207,22859,21075],{"class":1620},[1207,22861,1633],{"class":1632},[1207,22863,7368],{"class":1862},[1207,22865,1951],{"class":1632},[1207,22867,22868,22870,22873,22875],{"class":1209,"line":8410},[1207,22869,2451],{"class":1964},[1207,22871,22872],{"class":1224},"http://payment-service:8002/api/payments/",[1207,22874,1965],{"class":1964},[1207,22876,1973],{"class":1632},[1207,22878,22879,22881,22883,22886],{"class":1209,"line":8428},[1207,22880,13896],{"class":1957},[1207,22882,1961],{"class":1632},[1207,22884,22885],{"class":1862},"payment_data",[1207,22887,1973],{"class":1632},[1207,22889,22890,22892,22894,22896],{"class":1209,"line":8433},[1207,22891,21958],{"class":1957},[1207,22893,1961],{"class":1632},[1207,22895,21963],{"class":1862},[1207,22897,1973],{"class":1632},[1207,22899,22900,22902,22904,22906],{"class":1209,"line":8439},[1207,22901,21527],{"class":1957},[1207,22903,1961],{"class":1632},[1207,22905,11572],{"class":1231},[1207,22907,22908],{"class":1213},"  # Payment processing might take longer\n",[1207,22910,22911],{"class":1209,"line":8444},[1207,22912,2012],{"class":1632},[1207,22914,22915,22917,22920,22922,22924,22926,22928,22930,22932,22935,22937,22940,22942,22944,22946],{"class":1209,"line":8450},[1207,22916,2153],{"class":1616},[1207,22918,22919],{"class":1620}," payment_response",[1207,22921,1633],{"class":1632},[1207,22923,2772],{"class":1942},[1207,22925,2164],{"class":2163},[1207,22927,21109],{"class":1231},[1207,22929,1644],{"class":1632},[1207,22931,3281],{"class":1735},[1207,22933,22934],{"class":1224},"\"Payment failed: ",[1207,22936,3288],{"class":3287},[1207,22938,22939],{"class":1620},"payment_response",[1207,22941,1633],{"class":1632},[1207,22943,3552],{"class":1942},[1207,22945,3294],{"class":3287},[1207,22947,11115],{"class":1224},[1207,22949,22950],{"class":1209,"line":8455},[1207,22951,1836],{"class":1620},[1207,22953,22954,22957,22959,22961,22963,22965],{"class":1209,"line":8461},[1207,22955,22956],{"class":1620},"        payment ",[1207,22958,1961],{"class":1632},[1207,22960,22919],{"class":1620},[1207,22962,1633],{"class":1632},[1207,22964,2792],{"class":1862},[1207,22966,1866],{"class":1632},[1207,22968,22969,22971,22974,22976,22978,22981,22983,22985,22987,22989,22992,22994,22996,22998,23001,23003,23006,23008],{"class":1209,"line":8472},[1207,22970,2153],{"class":1616},[1207,22972,22973],{"class":1620}," payment",[1207,22975,2989],{"class":1632},[1207,22977,1965],{"class":1964},[1207,22979,22980],{"class":1224},"status",[1207,22982,1965],{"class":1964},[1207,22984,3010],{"class":1632},[1207,22986,2164],{"class":2163},[1207,22988,2188],{"class":1964},[1207,22990,22991],{"class":1224},"completed",[1207,22993,1965],{"class":1964},[1207,22995,1644],{"class":1632},[1207,22997,3281],{"class":1735},[1207,22999,23000],{"class":1224},"\"Payment not completed: ",[1207,23002,3288],{"class":3287},[1207,23004,23005],{"class":1620},"payment",[1207,23007,3294],{"class":3287},[1207,23009,11115],{"class":1224},[1207,23011,23012,23014,23016,23018,23021,23023,23025,23027,23029,23032,23034,23036,23038,23040],{"class":1209,"line":8477},[1207,23013,20998],{"class":5160},[1207,23015,1811],{"class":1632},[1207,23017,12545],{"class":1735},[1207,23019,23020],{"class":1224},"\"✓ Payment processed successfully: ",[1207,23022,3288],{"class":3287},[1207,23024,23005],{"class":1862},[1207,23026,2989],{"class":1632},[1207,23028,1965],{"class":1964},[1207,23030,23031],{"class":1224},"payment_id",[1207,23033,1965],{"class":1964},[1207,23035,3010],{"class":1632},[1207,23037,3294],{"class":3287},[1207,23039,3297],{"class":1224},[1207,23041,2136],{"class":1632},[1207,23043,23044],{"class":1209,"line":8483},[1207,23045,1836],{"class":1620},[1207,23047,23048],{"class":1209,"line":8498},[1207,23049,23050],{"class":1213},"        # Step 6: Verify order status updated\n",[1207,23052,23053,23055,23057,23059,23062,23064],{"class":1209,"line":8534},[1207,23054,20998],{"class":5160},[1207,23056,1811],{"class":1632},[1207,23058,3297],{"class":1964},[1207,23060,23061],{"class":1224},"Step 6: Verifying order status...",[1207,23063,3297],{"class":1964},[1207,23065,2136],{"class":1632},[1207,23067,23068],{"class":1209,"line":8539},[1207,23069,23070],{"class":1213},"        # Wait a moment for async processing\n",[1207,23072,23073,23076,23078,23080,23082,23084],{"class":1209,"line":8544},[1207,23074,23075],{"class":1620},"        time",[1207,23077,1633],{"class":1632},[1207,23079,21201],{"class":1862},[1207,23081,1811],{"class":1632},[1207,23083,6934],{"class":1231},[1207,23085,2136],{"class":1632},[1207,23087,23088],{"class":1209,"line":8550},[1207,23089,1836],{"class":1620},[1207,23091,23092,23095,23097,23099,23101,23103],{"class":1209,"line":8570},[1207,23093,23094],{"class":1620},"        order_status_response ",[1207,23096,1961],{"class":1632},[1207,23098,21075],{"class":1620},[1207,23100,1633],{"class":1632},[1207,23102,5111],{"class":1862},[1207,23104,1951],{"class":1632},[1207,23106,23107,23110,23113,23115,23117,23119,23122],{"class":1209,"line":8575},[1207,23108,23109],{"class":1735},"            f",[1207,23111,23112],{"class":1224},"'http://order-service:8001/api/orders/",[1207,23114,3288],{"class":3287},[1207,23116,22647],{"class":1862},[1207,23118,3294],{"class":3287},[1207,23120,23121],{"class":1224},"/'",[1207,23123,1973],{"class":1632},[1207,23125,23126,23128,23130,23132],{"class":1209,"line":8593},[1207,23127,21958],{"class":1957},[1207,23129,1961],{"class":1632},[1207,23131,21963],{"class":1862},[1207,23133,1973],{"class":1632},[1207,23135,23136,23138,23140],{"class":1209,"line":8598},[1207,23137,21527],{"class":1957},[1207,23139,1961],{"class":1632},[1207,23141,21532],{"class":1231},[1207,23143,23144],{"class":1209,"line":8604},[1207,23145,2012],{"class":1632},[1207,23147,23148,23150,23153,23155,23157,23159,23161,23163,23165,23168,23170,23173,23175,23177,23179],{"class":1209,"line":8609},[1207,23149,2153],{"class":1616},[1207,23151,23152],{"class":1620}," order_status_response",[1207,23154,1633],{"class":1632},[1207,23156,2772],{"class":1942},[1207,23158,2164],{"class":2163},[1207,23160,21109],{"class":1231},[1207,23162,1644],{"class":1632},[1207,23164,3281],{"class":1735},[1207,23166,23167],{"class":1224},"\"Order status check failed: ",[1207,23169,3288],{"class":3287},[1207,23171,23172],{"class":1620},"order_status_response",[1207,23174,1633],{"class":1632},[1207,23176,3552],{"class":1942},[1207,23178,3294],{"class":3287},[1207,23180,11115],{"class":1224},[1207,23182,23183],{"class":1209,"line":8615},[1207,23184,1836],{"class":1620},[1207,23186,23187,23190,23192,23194,23196,23198],{"class":1209,"line":8620},[1207,23188,23189],{"class":1620},"        updated_order ",[1207,23191,1961],{"class":1632},[1207,23193,23152],{"class":1620},[1207,23195,1633],{"class":1632},[1207,23197,2792],{"class":1862},[1207,23199,1866],{"class":1632},[1207,23201,23202,23204,23207,23209,23211,23213,23215,23217,23219,23221,23223,23226,23228,23230,23232,23235,23237,23240,23242,23245,23247,23250,23252,23254,23256,23258,23260,23262],{"class":1209,"line":8626},[1207,23203,2153],{"class":1616},[1207,23205,23206],{"class":1620}," updated_order",[1207,23208,2989],{"class":1632},[1207,23210,1965],{"class":1964},[1207,23212,22980],{"class":1224},[1207,23214,1965],{"class":1964},[1207,23216,3010],{"class":1632},[1207,23218,2983],{"class":2163},[1207,23220,9226],{"class":1632},[1207,23222,1965],{"class":1964},[1207,23224,23225],{"class":1224},"confirmed",[1207,23227,1965],{"class":1964},[1207,23229,1644],{"class":1632},[1207,23231,2188],{"class":1964},[1207,23233,23234],{"class":1224},"processing",[1207,23236,1965],{"class":1964},[1207,23238,23239],{"class":1632},"],",[1207,23241,3281],{"class":1735},[1207,23243,23244],{"class":1224},"\"Unexpected order status: ",[1207,23246,3288],{"class":3287},[1207,23248,23249],{"class":1620},"updated_order",[1207,23251,2989],{"class":1632},[1207,23253,1965],{"class":1964},[1207,23255,22980],{"class":1224},[1207,23257,1965],{"class":1964},[1207,23259,3010],{"class":1632},[1207,23261,3294],{"class":3287},[1207,23263,11115],{"class":1224},[1207,23265,23266,23268,23270,23272,23275,23277,23279,23281,23283,23285,23287,23289,23291,23293],{"class":1209,"line":8645},[1207,23267,20998],{"class":5160},[1207,23269,1811],{"class":1632},[1207,23271,12545],{"class":1735},[1207,23273,23274],{"class":1224},"\"✓ Order status updated to: ",[1207,23276,3288],{"class":3287},[1207,23278,23249],{"class":1862},[1207,23280,2989],{"class":1632},[1207,23282,1965],{"class":1964},[1207,23284,22980],{"class":1224},[1207,23286,1965],{"class":1964},[1207,23288,3010],{"class":1632},[1207,23290,3294],{"class":3287},[1207,23292,3297],{"class":1224},[1207,23294,2136],{"class":1632},[1207,23296,23297],{"class":1209,"line":8650},[1207,23298,1836],{"class":1620},[1207,23300,23301],{"class":1209,"line":8656},[1207,23302,23303],{"class":1213},"        # Step 7: Verify inventory was updated\n",[1207,23305,23306,23308,23310,23312,23315,23317],{"class":1209,"line":8683},[1207,23307,20998],{"class":5160},[1207,23309,1811],{"class":1632},[1207,23311,3297],{"class":1964},[1207,23313,23314],{"class":1224},"Step 7: Verifying inventory updates...",[1207,23316,3297],{"class":1964},[1207,23318,2136],{"class":1632},[1207,23320,23321,23323,23326,23328,23330,23332,23334,23336,23338],{"class":1209,"line":8688},[1207,23322,5838],{"class":1616},[1207,23324,23325],{"class":1620}," item ",[1207,23327,5752],{"class":1616},[1207,23329,22832],{"class":1620},[1207,23331,2989],{"class":1632},[1207,23333,1965],{"class":1964},[1207,23335,22142],{"class":1224},[1207,23337,1965],{"class":1964},[1207,23339,7111],{"class":1632},[1207,23341,23342,23345,23347,23349,23351,23353],{"class":1209,"line":8694},[1207,23343,23344],{"class":1620},"            inventory_response ",[1207,23346,1961],{"class":1632},[1207,23348,21075],{"class":1620},[1207,23350,1633],{"class":1632},[1207,23352,5111],{"class":1862},[1207,23354,1951],{"class":1632},[1207,23356,23357,23360,23363,23365,23368,23370,23372,23374,23376,23378,23380,23382],{"class":1209,"line":8713},[1207,23358,23359],{"class":1735},"                f",[1207,23361,23362],{"class":1224},"'http://inventory-service:8003/api/products/",[1207,23364,3288],{"class":3287},[1207,23366,23367],{"class":1862},"item",[1207,23369,2989],{"class":1632},[1207,23371,3297],{"class":1964},[1207,23373,22160],{"class":1224},[1207,23375,3297],{"class":1964},[1207,23377,3010],{"class":1632},[1207,23379,3294],{"class":3287},[1207,23381,23121],{"class":1224},[1207,23383,1973],{"class":1632},[1207,23385,23386,23389,23391,23393],{"class":1209,"line":8718},[1207,23387,23388],{"class":1957},"                headers",[1207,23390,1961],{"class":1632},[1207,23392,21963],{"class":1862},[1207,23394,1973],{"class":1632},[1207,23396,23397,23400,23402],{"class":1209,"line":8733},[1207,23398,23399],{"class":1957},"                timeout",[1207,23401,1961],{"class":1632},[1207,23403,21532],{"class":1231},[1207,23405,23406],{"class":1209,"line":8749},[1207,23407,13157],{"class":1632},[1207,23409,23410,23412,23415,23417,23419,23421],{"class":1209,"line":8764},[1207,23411,5862],{"class":1616},[1207,23413,23414],{"class":1620}," inventory_response",[1207,23416,1633],{"class":1632},[1207,23418,2772],{"class":1942},[1207,23420,2164],{"class":2163},[1207,23422,2778],{"class":1231},[1207,23424,23425],{"class":1209,"line":8780},[1207,23426,13162],{"class":1620},[1207,23428,23429,23432,23434,23436,23438,23440],{"class":1209,"line":8796},[1207,23430,23431],{"class":1620},"            product ",[1207,23433,1961],{"class":1632},[1207,23435,23414],{"class":1620},[1207,23437,1633],{"class":1632},[1207,23439,2792],{"class":1862},[1207,23441,1866],{"class":1632},[1207,23443,23444],{"class":1209,"line":8801},[1207,23445,23446],{"class":1213},"            # Inventory should be reduced (we can't check exact numbers without knowing initial stock)\n",[1207,23448,23449,23451,23453,23456,23458,23460],{"class":1209,"line":8826},[1207,23450,5862],{"class":1616},[1207,23452,2188],{"class":1964},[1207,23454,23455],{"class":1224},"stock_quantity",[1207,23457,1965],{"class":1964},[1207,23459,2983],{"class":2163},[1207,23461,23462],{"class":1620}," product\n",[1207,23464,23465],{"class":1209,"line":8856},[1207,23466,1836],{"class":1620},[1207,23468,23469,23471,23473,23475,23478,23480],{"class":1209,"line":8883},[1207,23470,20998],{"class":5160},[1207,23472,1811],{"class":1632},[1207,23474,3297],{"class":1964},[1207,23476,23477],{"class":1224},"✓ Inventory updates verified",[1207,23479,3297],{"class":1964},[1207,23481,2136],{"class":1632},[1207,23483,23484],{"class":1209,"line":8907},[1207,23485,1836],{"class":1620},[1207,23487,23488],{"class":1209,"line":8912},[1207,23489,23490],{"class":1213},"        # Step 8: Check that notification was sent\n",[1207,23492,23493,23495,23497,23499,23502,23504],{"class":1209,"line":8930},[1207,23494,20998],{"class":5160},[1207,23496,1811],{"class":1632},[1207,23498,3297],{"class":1964},[1207,23500,23501],{"class":1224},"Step 8: Verifying notification was sent...",[1207,23503,3297],{"class":1964},[1207,23505,2136],{"class":1632},[1207,23507,23508],{"class":1209,"line":8935},[1207,23509,23510],{"class":1213},"        # Check user's notifications\n",[1207,23512,23513,23516,23518,23520,23522,23524],{"class":1209,"line":8941},[1207,23514,23515],{"class":1620},"        notifications_response ",[1207,23517,1961],{"class":1632},[1207,23519,21075],{"class":1620},[1207,23521,1633],{"class":1632},[1207,23523,5111],{"class":1862},[1207,23525,1951],{"class":1632},[1207,23527,23528,23530,23533,23535,23537,23539,23542],{"class":1209,"line":8946},[1207,23529,23109],{"class":1735},[1207,23531,23532],{"class":1224},"'http://notification-service:8004/api/users/",[1207,23534,3288],{"class":3287},[1207,23536,21625],{"class":1862},[1207,23538,3294],{"class":3287},[1207,23540,23541],{"class":1224},"/notifications/'",[1207,23543,1973],{"class":1632},[1207,23545,23546,23548,23550,23552],{"class":1209,"line":8952},[1207,23547,21958],{"class":1957},[1207,23549,1961],{"class":1632},[1207,23551,21963],{"class":1862},[1207,23553,1973],{"class":1632},[1207,23555,23556,23558,23560],{"class":1209,"line":8957},[1207,23557,21527],{"class":1957},[1207,23559,1961],{"class":1632},[1207,23561,21532],{"class":1231},[1207,23563,23564],{"class":1209,"line":8963},[1207,23565,2012],{"class":1632},[1207,23567,23568],{"class":1209,"line":8997},[1207,23569,1836],{"class":1620},[1207,23571,23572,23574,23577,23579,23581,23583,23585],{"class":1209,"line":9030},[1207,23573,13065],{"class":1616},[1207,23575,23576],{"class":1620}," notifications_response",[1207,23578,1633],{"class":1632},[1207,23580,2772],{"class":1942},[1207,23582,2164],{"class":2163},[1207,23584,21109],{"class":1231},[1207,23586,1743],{"class":1632},[1207,23588,23589,23592,23594,23596,23598,23600],{"class":1209,"line":9063},[1207,23590,23591],{"class":1620},"            notifications ",[1207,23593,1961],{"class":1632},[1207,23595,23576],{"class":1620},[1207,23597,1633],{"class":1632},[1207,23599,2792],{"class":1862},[1207,23601,1866],{"class":1632},[1207,23603,23604,23607,23609],{"class":1209,"line":9068},[1207,23605,23606],{"class":1620},"            order_notifications ",[1207,23608,1961],{"class":1632},[1207,23610,5664],{"class":1632},[1207,23612,23613,23616,23618,23621,23623],{"class":1209,"line":9074},[1207,23614,23615],{"class":1620},"                n ",[1207,23617,14528],{"class":1616},[1207,23619,23620],{"class":1620}," n ",[1207,23622,5752],{"class":1616},[1207,23624,23625],{"class":1620}," notifications \n",[1207,23627,23628,23630,23632,23635,23637,23639,23641,23643,23645,23647,23649,23652,23654,23656,23658,23660,23663,23665,23668,23670,23672,23674,23676,23678,23680,23682,23684,23686,23688,23690,23692,23694,23696],{"class":1209,"line":9089},[1207,23629,21098],{"class":1616},[1207,23631,2188],{"class":1964},[1207,23633,23634],{"class":1224},"order",[1207,23636,1965],{"class":1964},[1207,23638,2983],{"class":2163},[1207,23640,3276],{"class":1620},[1207,23642,1633],{"class":1632},[1207,23644,5111],{"class":1862},[1207,23646,1811],{"class":1632},[1207,23648,1965],{"class":1964},[1207,23650,23651],{"class":1224},"type",[1207,23653,1965],{"class":1964},[1207,23655,1644],{"class":1632},[1207,23657,7755],{"class":1964},[1207,23659,5543],{"class":1632},[1207,23661,23662],{"class":1862},"lower",[1207,23664,4156],{"class":1632},[1207,23666,23667],{"class":2163}," and",[1207,23669,4021],{"class":4020},[1207,23671,1811],{"class":1632},[1207,23673,22647],{"class":1862},[1207,23675,2328],{"class":1632},[1207,23677,2983],{"class":2163},[1207,23679,3276],{"class":1620},[1207,23681,1633],{"class":1632},[1207,23683,5111],{"class":1862},[1207,23685,1811],{"class":1632},[1207,23687,1965],{"class":1964},[1207,23689,12342],{"class":1224},[1207,23691,1965],{"class":1964},[1207,23693,1644],{"class":1632},[1207,23695,7755],{"class":1964},[1207,23697,2136],{"class":1632},[1207,23699,23700],{"class":1209,"line":9104},[1207,23701,23702],{"class":1632},"            ]\n",[1207,23704,23705,23707,23709,23711,23714,23716,23718,23720,23722,23724,23727],{"class":1209,"line":9130},[1207,23706,5862],{"class":1616},[1207,23708,5812],{"class":5160},[1207,23710,1811],{"class":1632},[1207,23712,23713],{"class":1862},"order_notifications",[1207,23715,2328],{"class":1632},[1207,23717,22047],{"class":2163},[1207,23719,22050],{"class":1231},[1207,23721,1644],{"class":1632},[1207,23723,11109],{"class":1964},[1207,23725,23726],{"class":1224},"No order confirmation notification found",[1207,23728,11115],{"class":1964},[1207,23730,23731,23734,23736,23738,23741,23743],{"class":1209,"line":9135},[1207,23732,23733],{"class":5160},"            print",[1207,23735,1811],{"class":1632},[1207,23737,3297],{"class":1964},[1207,23739,23740],{"class":1224},"✓ Order confirmation notification sent",[1207,23742,3297],{"class":1964},[1207,23744,2136],{"class":1632},[1207,23746,23747,23749],{"class":1209,"line":9140},[1207,23748,13101],{"class":1616},[1207,23750,1743],{"class":1632},[1207,23752,23753,23755,23757,23759,23762,23764],{"class":1209,"line":9146},[1207,23754,23733],{"class":5160},[1207,23756,1811],{"class":1632},[1207,23758,3297],{"class":1964},[1207,23760,23761],{"class":1224},"⚠ Could not verify notifications (service might not be implemented)",[1207,23763,3297],{"class":1964},[1207,23765,2136],{"class":1632},[1207,23767,23768],{"class":1209,"line":9165},[1207,23769,1836],{"class":1620},[1207,23771,23772,23774,23776,23778,23781,23783],{"class":1209,"line":9170},[1207,23773,20998],{"class":5160},[1207,23775,1811],{"class":1632},[1207,23777,3297],{"class":1964},[1207,23779,23780],{"class":1224},"🎉 Complete user order flow test passed!",[1207,23782,3297],{"class":1964},[1207,23784,2136],{"class":1632},[1207,23786,23787],{"class":1209,"line":9185},[1207,23788,1763],{"class":1620},[1207,23790,23791,23793,23795,23797,23799,23801,23803],{"class":1209,"line":9213},[1207,23792,1806],{"class":1735},[1207,23794,19626],{"class":1794},[1207,23796,1811],{"class":1632},[1207,23798,1815],{"class":1814},[1207,23800,1644],{"class":1632},[1207,23802,20720],{"class":2051},[1207,23804,1818],{"class":1632},[1207,23806,23807],{"class":1209,"line":9218},[1207,23808,1824],{"class":1749},[1207,23810,23811],{"class":1209,"line":9261},[1207,23812,23813],{"class":1756},"        Test concurrent operations across services\n",[1207,23815,23816],{"class":1209,"line":9277},[1207,23817,1836],{"class":1756},[1207,23819,23820],{"class":1209,"line":9292},[1207,23821,23822],{"class":1756},"        This test simulates multiple users performing operations simultaneously\n",[1207,23824,23825],{"class":1209,"line":16152},[1207,23826,23827],{"class":1756},"        to verify that the system handles concurrent load correctly.\n",[1207,23829,23830],{"class":1209,"line":16171},[1207,23831,1824],{"class":1749},[1207,23833,23834,23836,23838,23840,23843,23845],{"class":1209,"line":16186},[1207,23835,20998],{"class":5160},[1207,23837,1811],{"class":1632},[1207,23839,3297],{"class":1964},[1207,23841,23842],{"class":1224},"Starting concurrent user operations test...",[1207,23844,3297],{"class":1964},[1207,23846,2136],{"class":1632},[1207,23848,23849],{"class":1209,"line":16217},[1207,23850,1836],{"class":1620},[1207,23852,23853,23855,23858,23860,23863],{"class":1209,"line":16222},[1207,23854,19717],{"class":1735},[1207,23856,23857],{"class":1794}," create_user_and_order",[1207,23859,1811],{"class":1632},[1207,23861,23862],{"class":2051},"user_index",[1207,23864,1818],{"class":1632},[1207,23866,23867],{"class":1209,"line":16228},[1207,23868,23869],{"class":1749},"            \"\"\"\n",[1207,23871,23872],{"class":1209,"line":16237},[1207,23873,23874],{"class":1756},"            Create a user and place an order\n",[1207,23876,23877],{"class":1209,"line":16256},[1207,23878,13162],{"class":1756},[1207,23880,23881],{"class":1209,"line":16274},[1207,23882,23883],{"class":1756},"            This function will be run concurrently by multiple threads\n",[1207,23885,23886],{"class":1209,"line":16279},[1207,23887,23888],{"class":1756},"            to simulate real-world concurrent usage.\n",[1207,23890,23891],{"class":1209,"line":16284},[1207,23892,23869],{"class":1749},[1207,23894,23895,23897],{"class":1209,"line":16299},[1207,23896,19732],{"class":1616},[1207,23898,1743],{"class":1632},[1207,23900,23901],{"class":1209,"line":16314},[1207,23902,23903],{"class":1213},"                # Create user\n",[1207,23905,23906,23908,23910],{"class":1209,"line":16325},[1207,23907,19739],{"class":1620},[1207,23909,1961],{"class":1632},[1207,23911,2445],{"class":1632},[1207,23913,23914,23916,23918,23920,23922,23924,23927,23929,23931,23933,23935],{"class":1209,"line":16338},[1207,23915,17781],{"class":1964},[1207,23917,2183],{"class":1224},[1207,23919,1965],{"class":1964},[1207,23921,2458],{"class":1632},[1207,23923,3281],{"class":1735},[1207,23925,23926],{"class":1224},"'concurrent_user_",[1207,23928,3288],{"class":3287},[1207,23930,23862],{"class":1620},[1207,23932,3294],{"class":3287},[1207,23934,1965],{"class":1224},[1207,23936,1973],{"class":1632},[1207,23938,23939,23941,23943,23945,23947,23949,23952,23954,23956,23958,23960],{"class":1209,"line":16343},[1207,23940,17781],{"class":1964},[1207,23942,2204],{"class":1224},[1207,23944,1965],{"class":1964},[1207,23946,2458],{"class":1632},[1207,23948,3281],{"class":1735},[1207,23950,23951],{"class":1224},"'concurrent_",[1207,23953,3288],{"class":3287},[1207,23955,23862],{"class":1620},[1207,23957,3294],{"class":3287},[1207,23959,5719],{"class":1224},[1207,23961,1973],{"class":1632},[1207,23963,23964,23966,23968,23970,23972,23974,23976,23978],{"class":1209,"line":16348},[1207,23965,17781],{"class":1964},[1207,23967,2495],{"class":1224},[1207,23969,1965],{"class":1964},[1207,23971,2458],{"class":1632},[1207,23973,2188],{"class":1964},[1207,23975,2003],{"class":1224},[1207,23977,1965],{"class":1964},[1207,23979,1973],{"class":1632},[1207,23981,23982,23984,23986,23988,23990,23992,23995,23997,23999,24001,24003],{"class":1209,"line":16367},[1207,23983,17781],{"class":1964},[1207,23985,2516],{"class":1224},[1207,23987,1965],{"class":1964},[1207,23989,2458],{"class":1632},[1207,23991,3281],{"class":1735},[1207,23993,23994],{"class":1224},"'User",[1207,23996,3288],{"class":3287},[1207,23998,23862],{"class":1620},[1207,24000,3294],{"class":3287},[1207,24002,1965],{"class":1224},[1207,24004,1973],{"class":1632},[1207,24006,24007,24009,24011,24013,24015,24017,24020],{"class":1209,"line":16372},[1207,24008,17781],{"class":1964},[1207,24010,2537],{"class":1224},[1207,24012,1965],{"class":1964},[1207,24014,2458],{"class":1632},[1207,24016,2188],{"class":1964},[1207,24018,24019],{"class":1224},"Concurrent",[1207,24021,2006],{"class":1964},[1207,24023,24024],{"class":1209,"line":16401},[1207,24025,17802],{"class":1632},[1207,24027,24028],{"class":1209,"line":16407},[1207,24029,24030],{"class":1620},"                \n",[1207,24032,24033,24036,24038,24040,24042,24044],{"class":1209,"line":16466},[1207,24034,24035],{"class":1620},"                user_response ",[1207,24037,1961],{"class":1632},[1207,24039,21075],{"class":1620},[1207,24041,1633],{"class":1632},[1207,24043,7368],{"class":1862},[1207,24045,1951],{"class":1632},[1207,24047,24048,24050,24052,24054],{"class":1209,"line":16528},[1207,24049,17781],{"class":1964},[1207,24051,21508],{"class":1224},[1207,24053,1965],{"class":1964},[1207,24055,1973],{"class":1632},[1207,24057,24058,24061,24063,24065],{"class":1209,"line":16590},[1207,24059,24060],{"class":1957},"                    json",[1207,24062,1961],{"class":1632},[1207,24064,2583],{"class":1862},[1207,24066,1973],{"class":1632},[1207,24068,24069,24072,24074],{"class":1209,"line":16638},[1207,24070,24071],{"class":1957},"                    timeout",[1207,24073,1961],{"class":1632},[1207,24075,21532],{"class":1231},[1207,24077,24078],{"class":1209,"line":16644},[1207,24079,24080],{"class":1632},"                )\n",[1207,24082,24083],{"class":1209,"line":16672},[1207,24084,24030],{"class":1620},[1207,24086,24087,24089,24091,24093,24095,24097,24099],{"class":1209,"line":16677},[1207,24088,21098],{"class":1616},[1207,24090,21543],{"class":1620},[1207,24092,1633],{"class":1632},[1207,24094,2772],{"class":1942},[1207,24096,4363],{"class":2163},[1207,24098,21552],{"class":1231},[1207,24100,1743],{"class":1632},[1207,24102,24103,24106,24108,24110,24112,24114,24116,24118,24120,24122,24124,24126,24128,24130,24133,24135,24137,24139,24141,24143,24145],{"class":1209,"line":16683},[1207,24104,24105],{"class":1616},"                    return",[1207,24107,2801],{"class":1632},[1207,24109,1965],{"class":1964},[1207,24111,2806],{"class":1224},[1207,24113,1965],{"class":1964},[1207,24115,2458],{"class":1632},[1207,24117,11104],{"class":2813},[1207,24119,1644],{"class":1632},[1207,24121,2188],{"class":1964},[1207,24123,10907],{"class":1224},[1207,24125,1965],{"class":1964},[1207,24127,2458],{"class":1632},[1207,24129,3281],{"class":1735},[1207,24131,24132],{"class":1224},"'User creation failed: ",[1207,24134,3288],{"class":3287},[1207,24136,21564],{"class":1620},[1207,24138,1633],{"class":1632},[1207,24140,3552],{"class":1942},[1207,24142,3294],{"class":3287},[1207,24144,1965],{"class":1224},[1207,24146,2817],{"class":1632},[1207,24148,24149],{"class":1209,"line":16688},[1207,24150,24030],{"class":1620},[1207,24152,24153,24155,24157,24159,24161,24163],{"class":1209,"line":16694},[1207,24154,19817],{"class":1620},[1207,24156,1961],{"class":1632},[1207,24158,21543],{"class":1620},[1207,24160,1633],{"class":1632},[1207,24162,2792],{"class":1862},[1207,24164,1866],{"class":1632},[1207,24166,24167],{"class":1209,"line":16700},[1207,24168,24030],{"class":1620},[1207,24170,24171],{"class":1209,"line":16705},[1207,24172,24173],{"class":1213},"                # Authenticate user\n",[1207,24175,24176,24179,24181,24183,24185,24187],{"class":1209,"line":16711},[1207,24177,24178],{"class":1620},"                auth_response ",[1207,24180,1961],{"class":1632},[1207,24182,21075],{"class":1620},[1207,24184,1633],{"class":1632},[1207,24186,7368],{"class":1862},[1207,24188,1951],{"class":1632},[1207,24190,24191,24193,24195,24197],{"class":1209,"line":16726},[1207,24192,17781],{"class":1964},[1207,24194,21677],{"class":1224},[1207,24196,1965],{"class":1964},[1207,24198,1973],{"class":1632},[1207,24200,24201,24203],{"class":1209,"line":16741},[1207,24202,24060],{"class":1957},[1207,24204,17367],{"class":1632},[1207,24206,24207,24210,24212,24214,24216,24218,24220,24222,24224,24226],{"class":1209,"line":16752},[1207,24208,24209],{"class":1964},"                        '",[1207,24211,2183],{"class":1224},[1207,24213,1965],{"class":1964},[1207,24215,2458],{"class":1632},[1207,24217,16662],{"class":1862},[1207,24219,2989],{"class":1632},[1207,24221,1965],{"class":1964},[1207,24223,2183],{"class":1224},[1207,24225,1965],{"class":1964},[1207,24227,22182],{"class":1632},[1207,24229,24230,24232,24234,24236,24238,24240,24242,24244,24246,24248],{"class":1209,"line":16765},[1207,24231,24209],{"class":1964},[1207,24233,2495],{"class":1224},[1207,24235,1965],{"class":1964},[1207,24237,2458],{"class":1632},[1207,24239,16662],{"class":1862},[1207,24241,2989],{"class":1632},[1207,24243,1965],{"class":1964},[1207,24245,2495],{"class":1224},[1207,24247,1965],{"class":1964},[1207,24249,13328],{"class":1632},[1207,24251,24252],{"class":1209,"line":16770},[1207,24253,24254],{"class":1632},"                    },\n",[1207,24256,24257,24259,24261],{"class":1209,"line":16775},[1207,24258,24071],{"class":1957},[1207,24260,1961],{"class":1632},[1207,24262,21532],{"class":1231},[1207,24264,24265],{"class":1209,"line":16781},[1207,24266,24080],{"class":1632},[1207,24268,24269],{"class":1209,"line":16800},[1207,24270,24030],{"class":1620},[1207,24272,24273,24275,24277,24279,24281,24283,24285],{"class":1209,"line":16815},[1207,24274,21098],{"class":1616},[1207,24276,21744],{"class":1620},[1207,24278,1633],{"class":1632},[1207,24280,2772],{"class":1942},[1207,24282,4363],{"class":2163},[1207,24284,21109],{"class":1231},[1207,24286,1743],{"class":1632},[1207,24288,24289,24291,24293,24295,24297,24299,24301,24303,24305,24307,24309,24311,24313,24315,24318,24320,24322,24324,24326,24328,24330],{"class":1209,"line":19912},[1207,24290,24105],{"class":1616},[1207,24292,2801],{"class":1632},[1207,24294,1965],{"class":1964},[1207,24296,2806],{"class":1224},[1207,24298,1965],{"class":1964},[1207,24300,2458],{"class":1632},[1207,24302,11104],{"class":2813},[1207,24304,1644],{"class":1632},[1207,24306,2188],{"class":1964},[1207,24308,10907],{"class":1224},[1207,24310,1965],{"class":1964},[1207,24312,2458],{"class":1632},[1207,24314,3281],{"class":1735},[1207,24316,24317],{"class":1224},"'Authentication failed: ",[1207,24319,3288],{"class":3287},[1207,24321,21764],{"class":1620},[1207,24323,1633],{"class":1632},[1207,24325,3552],{"class":1942},[1207,24327,3294],{"class":3287},[1207,24329,1965],{"class":1224},[1207,24331,2817],{"class":1632},[1207,24333,24334],{"class":1209,"line":19950},[1207,24335,24030],{"class":1620},[1207,24337,24338,24341,24343,24345,24347,24349],{"class":1209,"line":19967},[1207,24339,24340],{"class":1620},"                auth_data ",[1207,24342,1961],{"class":1632},[1207,24344,21744],{"class":1620},[1207,24346,1633],{"class":1632},[1207,24348,2792],{"class":1862},[1207,24350,1866],{"class":1632},[1207,24352,24353,24356,24358,24360,24362,24364,24366,24368,24370,24372,24374,24376,24378,24380,24382,24384,24386,24388,24390],{"class":1209,"line":19972},[1207,24354,24355],{"class":1620},"                token ",[1207,24357,1961],{"class":1632},[1207,24359,21801],{"class":1620},[1207,24361,1633],{"class":1632},[1207,24363,5111],{"class":1862},[1207,24365,1811],{"class":1632},[1207,24367,1965],{"class":1964},[1207,24369,16193],{"class":1224},[1207,24371,1965],{"class":1964},[1207,24373,2328],{"class":1632},[1207,24375,21818],{"class":2163},[1207,24377,21801],{"class":1620},[1207,24379,1633],{"class":1632},[1207,24381,5111],{"class":1862},[1207,24383,1811],{"class":1632},[1207,24385,1965],{"class":1964},[1207,24387,16208],{"class":1224},[1207,24389,1965],{"class":1964},[1207,24391,2136],{"class":1632},[1207,24393,24394,24397,24399,24401,24403,24405,24407,24409,24411,24413,24415,24417,24419,24421],{"class":1209,"line":19978},[1207,24395,24396],{"class":1620},"                headers ",[1207,24398,1961],{"class":1632},[1207,24400,2801],{"class":1632},[1207,24402,1965],{"class":1964},[1207,24404,21868],{"class":1224},[1207,24406,1965],{"class":1964},[1207,24408,2458],{"class":1632},[1207,24410,3281],{"class":1735},[1207,24412,21877],{"class":1224},[1207,24414,3288],{"class":3287},[1207,24416,16193],{"class":1620},[1207,24418,3294],{"class":3287},[1207,24420,1965],{"class":1224},[1207,24422,2817],{"class":1632},[1207,24424,24425],{"class":1209,"line":19993},[1207,24426,24030],{"class":1620},[1207,24428,24429],{"class":1209,"line":20006},[1207,24430,24431],{"class":1213},"                # Create order\n",[1207,24433,24434,24437,24439],{"class":1209,"line":20011},[1207,24435,24436],{"class":1620},"                order_data ",[1207,24438,1961],{"class":1632},[1207,24440,2445],{"class":1632},[1207,24442,24443,24445,24447,24449,24451,24453,24455,24457,24459,24461],{"class":1209,"line":20017},[1207,24444,17781],{"class":1964},[1207,24446,21625],{"class":1224},[1207,24448,1965],{"class":1964},[1207,24450,2458],{"class":1632},[1207,24452,2604],{"class":1620},[1207,24454,2989],{"class":1632},[1207,24456,1965],{"class":1964},[1207,24458,2133],{"class":1224},[1207,24460,1965],{"class":1964},[1207,24462,22182],{"class":1632},[1207,24464,24465,24467,24469,24471,24473],{"class":1209,"line":20030},[1207,24466,17781],{"class":1964},[1207,24468,22142],{"class":1224},[1207,24470,1965],{"class":1964},[1207,24472,2458],{"class":1632},[1207,24474,5664],{"class":1632},[1207,24476,24477],{"class":1209,"line":20042},[1207,24478,24479],{"class":1632},"                        {\n",[1207,24481,24482,24485,24487,24489,24491,24493,24495],{"class":1209,"line":20047},[1207,24483,24484],{"class":1964},"                            '",[1207,24486,22160],{"class":1224},[1207,24488,1965],{"class":1964},[1207,24490,2458],{"class":1632},[1207,24492,22275],{"class":1231},[1207,24494,1644],{"class":1632},[1207,24496,24497],{"class":1213},"  # Assuming product 1 exists\n",[1207,24499,24500,24502,24504,24506,24508,24510],{"class":1209,"line":20053},[1207,24501,24484],{"class":1964},[1207,24503,22189],{"class":1224},[1207,24505,1965],{"class":1964},[1207,24507,2458],{"class":1632},[1207,24509,22275],{"class":1231},[1207,24511,1973],{"class":1632},[1207,24513,24514,24516,24518,24520,24522],{"class":1209,"line":20071},[1207,24515,24484],{"class":1964},[1207,24517,22204],{"class":1224},[1207,24519,1965],{"class":1964},[1207,24521,2458],{"class":1632},[1207,24523,24524],{"class":1231}," 19.99\n",[1207,24526,24527],{"class":1209,"line":20089},[1207,24528,24529],{"class":1632},"                        }\n",[1207,24531,24532],{"class":1209,"line":20094},[1207,24533,24534],{"class":1632},"                    ],\n",[1207,24536,24537,24539,24541,24543,24545],{"class":1209,"line":20100},[1207,24538,17781],{"class":1964},[1207,24540,22382],{"class":1224},[1207,24542,1965],{"class":1964},[1207,24544,2458],{"class":1632},[1207,24546,2445],{"class":1632},[1207,24548,24549,24551,24553,24555,24557,24559,24561,24563,24565,24567,24570],{"class":1209,"line":20126},[1207,24550,24209],{"class":1964},[1207,24552,22395],{"class":1224},[1207,24554,1965],{"class":1964},[1207,24556,2458],{"class":1632},[1207,24558,3281],{"class":1735},[1207,24560,1965],{"class":1224},[1207,24562,3288],{"class":3287},[1207,24564,23862],{"class":1620},[1207,24566,3294],{"class":3287},[1207,24568,24569],{"class":1224}," Test Street'",[1207,24571,1973],{"class":1632},[1207,24573,24575,24577,24579,24581,24583,24585,24587,24589],{"class":1209,"line":24574},315,[1207,24576,24209],{"class":1964},[1207,24578,22415],{"class":1224},[1207,24580,1965],{"class":1964},[1207,24582,2458],{"class":1632},[1207,24584,2188],{"class":1964},[1207,24586,22424],{"class":1224},[1207,24588,1965],{"class":1964},[1207,24590,1973],{"class":1632},[1207,24592,24594,24596,24598,24600,24602,24604,24606,24608],{"class":1209,"line":24593},316,[1207,24595,24209],{"class":1964},[1207,24597,12954],{"class":1224},[1207,24599,1965],{"class":1964},[1207,24601,2458],{"class":1632},[1207,24603,2188],{"class":1964},[1207,24605,22443],{"class":1224},[1207,24607,1965],{"class":1964},[1207,24609,1973],{"class":1632},[1207,24611,24613,24615,24617,24619,24621,24623,24625,24627],{"class":1209,"line":24612},317,[1207,24614,24209],{"class":1964},[1207,24616,22454],{"class":1224},[1207,24618,1965],{"class":1964},[1207,24620,2458],{"class":1632},[1207,24622,2188],{"class":1964},[1207,24624,22463],{"class":1224},[1207,24626,1965],{"class":1964},[1207,24628,1973],{"class":1632},[1207,24630,24632,24634,24636,24638,24640,24642,24644],{"class":1209,"line":24631},318,[1207,24633,24209],{"class":1964},[1207,24635,22474],{"class":1224},[1207,24637,1965],{"class":1964},[1207,24639,2458],{"class":1632},[1207,24641,2188],{"class":1964},[1207,24643,22483],{"class":1224},[1207,24645,2006],{"class":1964},[1207,24647,24649],{"class":1209,"line":24648},319,[1207,24650,24651],{"class":1632},"                    }\n",[1207,24653,24655],{"class":1209,"line":24654},320,[1207,24656,17802],{"class":1632},[1207,24658,24660],{"class":1209,"line":24659},321,[1207,24661,24030],{"class":1620},[1207,24663,24665,24668,24670,24672,24674,24676],{"class":1209,"line":24664},322,[1207,24666,24667],{"class":1620},"                order_response ",[1207,24669,1961],{"class":1632},[1207,24671,21075],{"class":1620},[1207,24673,1633],{"class":1632},[1207,24675,7368],{"class":1862},[1207,24677,1951],{"class":1632},[1207,24679,24681,24683,24685,24687],{"class":1209,"line":24680},323,[1207,24682,17781],{"class":1964},[1207,24684,22519],{"class":1224},[1207,24686,1965],{"class":1964},[1207,24688,1973],{"class":1632},[1207,24690,24692,24694,24696,24698],{"class":1209,"line":24691},324,[1207,24693,24060],{"class":1957},[1207,24695,1961],{"class":1632},[1207,24697,22532],{"class":1862},[1207,24699,1973],{"class":1632},[1207,24701,24703,24706,24708,24710],{"class":1209,"line":24702},325,[1207,24704,24705],{"class":1957},"                    headers",[1207,24707,1961],{"class":1632},[1207,24709,21963],{"class":1862},[1207,24711,1973],{"class":1632},[1207,24713,24715,24717,24719],{"class":1209,"line":24714},326,[1207,24716,24071],{"class":1957},[1207,24718,1961],{"class":1632},[1207,24720,22553],{"class":1231},[1207,24722,24724],{"class":1209,"line":24723},327,[1207,24725,24080],{"class":1632},[1207,24727,24729],{"class":1209,"line":24728},328,[1207,24730,24030],{"class":1620},[1207,24732,24734,24736,24738,24740,24742,24744,24746],{"class":1209,"line":24733},329,[1207,24735,21098],{"class":1616},[1207,24737,22564],{"class":1620},[1207,24739,1633],{"class":1632},[1207,24741,2772],{"class":1942},[1207,24743,4363],{"class":2163},[1207,24745,21552],{"class":1231},[1207,24747,1743],{"class":1632},[1207,24749,24751,24753,24755,24757,24759,24761,24763,24765,24767,24769,24771,24773,24775,24777,24780,24782,24784,24786,24788,24790,24792],{"class":1209,"line":24750},330,[1207,24752,24105],{"class":1616},[1207,24754,2801],{"class":1632},[1207,24756,1965],{"class":1964},[1207,24758,2806],{"class":1224},[1207,24760,1965],{"class":1964},[1207,24762,2458],{"class":1632},[1207,24764,11104],{"class":2813},[1207,24766,1644],{"class":1632},[1207,24768,2188],{"class":1964},[1207,24770,10907],{"class":1224},[1207,24772,1965],{"class":1964},[1207,24774,2458],{"class":1632},[1207,24776,3281],{"class":1735},[1207,24778,24779],{"class":1224},"'Order creation failed: ",[1207,24781,3288],{"class":3287},[1207,24783,22584],{"class":1620},[1207,24785,1633],{"class":1632},[1207,24787,3552],{"class":1942},[1207,24789,3294],{"class":3287},[1207,24791,1965],{"class":1224},[1207,24793,2817],{"class":1632},[1207,24795,24797],{"class":1209,"line":24796},331,[1207,24798,24030],{"class":1620},[1207,24800,24802,24805,24807,24809,24811,24813],{"class":1209,"line":24801},332,[1207,24803,24804],{"class":1620},"                order ",[1207,24806,1961],{"class":1632},[1207,24808,22564],{"class":1620},[1207,24810,1633],{"class":1632},[1207,24812,2792],{"class":1862},[1207,24814,1866],{"class":1632},[1207,24816,24818],{"class":1209,"line":24817},333,[1207,24819,24030],{"class":1620},[1207,24821,24823,24826],{"class":1209,"line":24822},334,[1207,24824,24825],{"class":1616},"                return",[1207,24827,2445],{"class":1632},[1207,24829,24831,24833,24835,24837,24839,24841],{"class":1209,"line":24830},335,[1207,24832,17781],{"class":1964},[1207,24834,2806],{"class":1224},[1207,24836,1965],{"class":1964},[1207,24838,2458],{"class":1632},[1207,24840,2814],{"class":2813},[1207,24842,1973],{"class":1632},[1207,24844,24846,24848,24850,24852,24854,24856,24858,24860,24862,24864],{"class":1209,"line":24845},336,[1207,24847,17781],{"class":1964},[1207,24849,21625],{"class":1224},[1207,24851,1965],{"class":1964},[1207,24853,2458],{"class":1632},[1207,24855,2604],{"class":1620},[1207,24857,2989],{"class":1632},[1207,24859,1965],{"class":1964},[1207,24861,2133],{"class":1224},[1207,24863,1965],{"class":1964},[1207,24865,22182],{"class":1632},[1207,24867,24869,24871,24873,24875,24877,24879,24881,24883,24885,24887],{"class":1209,"line":24868},337,[1207,24870,17781],{"class":1964},[1207,24872,22647],{"class":1224},[1207,24874,1965],{"class":1964},[1207,24876,2458],{"class":1632},[1207,24878,22621],{"class":1620},[1207,24880,2989],{"class":1632},[1207,24882,1965],{"class":1964},[1207,24884,2133],{"class":1224},[1207,24886,1965],{"class":1964},[1207,24888,22182],{"class":1632},[1207,24890,24892,24894,24896,24898,24900],{"class":1209,"line":24891},338,[1207,24893,17781],{"class":1964},[1207,24895,23862],{"class":1224},[1207,24897,1965],{"class":1964},[1207,24899,2458],{"class":1632},[1207,24901,24902],{"class":1620}," user_index\n",[1207,24904,24906],{"class":1209,"line":24905},339,[1207,24907,17802],{"class":1632},[1207,24909,24911],{"class":1209,"line":24910},340,[1207,24912,24030],{"class":1620},[1207,24914,24916,24918,24920,24922,24924],{"class":1209,"line":24915},341,[1207,24917,19851],{"class":1616},[1207,24919,13170],{"class":4020},[1207,24921,13173],{"class":1616},[1207,24923,11129],{"class":1620},[1207,24925,1743],{"class":1632},[1207,24927,24929,24931,24933,24935,24937,24939,24941,24943,24945,24947,24949,24951,24953,24955,24957,24959],{"class":1209,"line":24928},342,[1207,24930,24825],{"class":1616},[1207,24932,2801],{"class":1632},[1207,24934,1965],{"class":1964},[1207,24936,2806],{"class":1224},[1207,24938,1965],{"class":1964},[1207,24940,2458],{"class":1632},[1207,24942,11104],{"class":2813},[1207,24944,1644],{"class":1632},[1207,24946,2188],{"class":1964},[1207,24948,10907],{"class":1224},[1207,24950,1965],{"class":1964},[1207,24952,2458],{"class":1632},[1207,24954,4021],{"class":4020},[1207,24956,1811],{"class":1632},[1207,24958,13204],{"class":1862},[1207,24960,24961],{"class":1632},")}\n",[1207,24963,24965],{"class":1209,"line":24964},343,[1207,24966,1836],{"class":1620},[1207,24968,24970],{"class":1209,"line":24969},344,[1207,24971,24972],{"class":1213},"        # Execute concurrent operations\n",[1207,24974,24976,24978,24980,24982,24985,24987],{"class":1209,"line":24975},345,[1207,24977,20998],{"class":5160},[1207,24979,1811],{"class":1632},[1207,24981,3297],{"class":1964},[1207,24983,24984],{"class":1224},"Creating 10 concurrent users and orders...",[1207,24986,3297],{"class":1964},[1207,24988,2136],{"class":1632},[1207,24990,24992,24994,24997,24999,25002,25004,25006,25008,25010,25013],{"class":1209,"line":24991},346,[1207,24993,2295],{"class":1616},[1207,24995,24996],{"class":1862}," ThreadPoolExecutor",[1207,24998,1811],{"class":1632},[1207,25000,25001],{"class":1957},"max_workers",[1207,25003,1961],{"class":1632},[1207,25005,4561],{"class":1231},[1207,25007,2328],{"class":1632},[1207,25009,13173],{"class":1616},[1207,25011,25012],{"class":1620}," executor",[1207,25014,1743],{"class":1632},[1207,25016,25018],{"class":1209,"line":25017},347,[1207,25019,25020],{"class":1213},"            # Submit 10 concurrent operations\n",[1207,25022,25024,25027,25029],{"class":1209,"line":25023},348,[1207,25025,25026],{"class":1620},"            futures ",[1207,25028,1961],{"class":1632},[1207,25030,5664],{"class":1632},[1207,25032,25034,25037,25039,25042,25044,25047,25049,25051,25053],{"class":1209,"line":25033},349,[1207,25035,25036],{"class":1620},"                executor",[1207,25038,1633],{"class":1632},[1207,25040,25041],{"class":1862},"submit",[1207,25043,1811],{"class":1632},[1207,25045,25046],{"class":1862},"create_user_and_order",[1207,25048,1644],{"class":1632},[1207,25050,5841],{"class":1862},[1207,25052,2328],{"class":1632},[1207,25054,2858],{"class":1620},[1207,25056,25058,25061,25063,25065,25067,25069,25071],{"class":1209,"line":25057},350,[1207,25059,25060],{"class":1616},"                for",[1207,25062,5749],{"class":1620},[1207,25064,5752],{"class":1616},[1207,25066,5755],{"class":5160},[1207,25068,1811],{"class":1632},[1207,25070,19907],{"class":1231},[1207,25072,2136],{"class":1632},[1207,25074,25076],{"class":1209,"line":25075},351,[1207,25077,23702],{"class":1632},[1207,25079,25081],{"class":1209,"line":25080},352,[1207,25082,13162],{"class":1620},[1207,25084,25086],{"class":1209,"line":25085},353,[1207,25087,25088],{"class":1213},"            # Collect results\n",[1207,25090,25092,25095,25097,25099,25102,25104,25106,25108,25110,25113,25115,25118],{"class":1209,"line":25091},354,[1207,25093,25094],{"class":1620},"            results ",[1207,25096,1961],{"class":1632},[1207,25098,9226],{"class":1632},[1207,25100,25101],{"class":1620},"future",[1207,25103,1633],{"class":1632},[1207,25105,13094],{"class":1862},[1207,25107,4156],{"class":1632},[1207,25109,9241],{"class":1616},[1207,25111,25112],{"class":1620}," future ",[1207,25114,5752],{"class":1616},[1207,25116,25117],{"class":1620}," futures",[1207,25119,13328],{"class":1632},[1207,25121,25123],{"class":1209,"line":25122},355,[1207,25124,1836],{"class":1620},[1207,25126,25128],{"class":1209,"line":25127},356,[1207,25129,25130],{"class":1213},"        # Analyze results\n",[1207,25132,25134,25137,25139,25141,25144,25146,25149,25151,25154,25157,25160,25162,25164,25166,25168],{"class":1209,"line":25133},357,[1207,25135,25136],{"class":1620},"        successful_operations ",[1207,25138,1961],{"class":1632},[1207,25140,9226],{"class":1632},[1207,25142,25143],{"class":1620},"r ",[1207,25145,14528],{"class":1616},[1207,25147,25148],{"class":1620}," r ",[1207,25150,5752],{"class":1616},[1207,25152,25153],{"class":1620}," results ",[1207,25155,25156],{"class":1616},"if",[1207,25158,25159],{"class":1620}," r",[1207,25161,2989],{"class":1632},[1207,25163,1965],{"class":1964},[1207,25165,2806],{"class":1224},[1207,25167,1965],{"class":1964},[1207,25169,9258],{"class":1632},[1207,25171,25173,25176,25178,25180,25182,25184,25186,25188,25190,25192,25194,25196,25198,25200,25202,25204],{"class":1209,"line":25172},358,[1207,25174,25175],{"class":1620},"        failed_operations ",[1207,25177,1961],{"class":1632},[1207,25179,9226],{"class":1632},[1207,25181,25143],{"class":1620},[1207,25183,14528],{"class":1616},[1207,25185,25148],{"class":1620},[1207,25187,5752],{"class":1616},[1207,25189,25153],{"class":1620},[1207,25191,25156],{"class":1616},[1207,25193,3853],{"class":2163},[1207,25195,25159],{"class":1620},[1207,25197,2989],{"class":1632},[1207,25199,1965],{"class":1964},[1207,25201,2806],{"class":1224},[1207,25203,1965],{"class":1964},[1207,25205,9258],{"class":1632},[1207,25207,25209],{"class":1209,"line":25208},359,[1207,25210,1836],{"class":1620},[1207,25212,25214,25216,25218,25220,25223,25225,25227,25229,25232,25234,25236,25238],{"class":1209,"line":25213},360,[1207,25215,20998],{"class":5160},[1207,25217,1811],{"class":1632},[1207,25219,12545],{"class":1735},[1207,25221,25222],{"class":1224},"\"Successful operations: ",[1207,25224,3288],{"class":3287},[1207,25226,12635],{"class":5160},[1207,25228,1811],{"class":1632},[1207,25230,25231],{"class":1862},"successful_operations",[1207,25233,2328],{"class":1632},[1207,25235,3294],{"class":3287},[1207,25237,3297],{"class":1224},[1207,25239,2136],{"class":1632},[1207,25241,25243,25245,25247,25249,25252,25254,25256,25258,25261,25263,25265,25267],{"class":1209,"line":25242},361,[1207,25244,20998],{"class":5160},[1207,25246,1811],{"class":1632},[1207,25248,12545],{"class":1735},[1207,25250,25251],{"class":1224},"\"Failed operations: ",[1207,25253,3288],{"class":3287},[1207,25255,12635],{"class":5160},[1207,25257,1811],{"class":1632},[1207,25259,25260],{"class":1862},"failed_operations",[1207,25262,2328],{"class":1632},[1207,25264,3294],{"class":3287},[1207,25266,3297],{"class":1224},[1207,25268,2136],{"class":1632},[1207,25270,25272],{"class":1209,"line":25271},362,[1207,25273,1836],{"class":1620},[1207,25275,25277],{"class":1209,"line":25276},363,[1207,25278,25279],{"class":1213},"        # Print failure details\n",[1207,25281,25283,25285,25288,25290,25293],{"class":1209,"line":25282},364,[1207,25284,5838],{"class":1616},[1207,25286,25287],{"class":1620}," failure ",[1207,25289,5752],{"class":1616},[1207,25291,25292],{"class":1620}," failed_operations",[1207,25294,1743],{"class":1632},[1207,25296,25298,25300,25302,25304,25307,25309,25312,25314,25316,25318,25320,25322,25324,25326],{"class":1209,"line":25297},365,[1207,25299,23733],{"class":5160},[1207,25301,1811],{"class":1632},[1207,25303,12545],{"class":1735},[1207,25305,25306],{"class":1224},"\"  Failed: ",[1207,25308,3288],{"class":3287},[1207,25310,25311],{"class":1862},"failure",[1207,25313,2989],{"class":1632},[1207,25315,1965],{"class":1964},[1207,25317,10907],{"class":1224},[1207,25319,1965],{"class":1964},[1207,25321,3010],{"class":1632},[1207,25323,3294],{"class":3287},[1207,25325,3297],{"class":1224},[1207,25327,2136],{"class":1632},[1207,25329,25331],{"class":1209,"line":25330},366,[1207,25332,1836],{"class":1620},[1207,25334,25336],{"class":1209,"line":25335},367,[1207,25337,25338],{"class":1213},"        # Assert that most operations succeeded\n",[1207,25340,25342],{"class":1209,"line":25341},368,[1207,25343,25344],{"class":1213},"        # We allow some failures due to race conditions or resource constraints\n",[1207,25346,25348,25351,25353,25355,25357,25359,25361,25364,25366,25368,25370],{"class":1209,"line":25347},369,[1207,25349,25350],{"class":1620},"        success_rate ",[1207,25352,1961],{"class":1632},[1207,25354,5812],{"class":5160},[1207,25356,1811],{"class":1632},[1207,25358,25231],{"class":1862},[1207,25360,2328],{"class":1632},[1207,25362,25363],{"class":2163}," /",[1207,25365,5812],{"class":5160},[1207,25367,1811],{"class":1632},[1207,25369,7042],{"class":1862},[1207,25371,2136],{"class":1632},[1207,25373,25375,25377,25380,25383,25386,25388,25390,25393,25395,25398,25401,25403],{"class":1209,"line":25374},370,[1207,25376,2153],{"class":1616},[1207,25378,25379],{"class":1620}," success_rate ",[1207,25381,25382],{"class":2163},">=",[1207,25384,25385],{"class":1231}," 0.8",[1207,25387,1644],{"class":1632},[1207,25389,3281],{"class":1735},[1207,25391,25392],{"class":1224},"\"Success rate too low: ",[1207,25394,3288],{"class":3287},[1207,25396,25397],{"class":1620},"success_rate",[1207,25399,25400],{"class":1735},":.2%",[1207,25402,3294],{"class":3287},[1207,25404,11115],{"class":1224},[1207,25406,25408],{"class":1209,"line":25407},371,[1207,25409,1836],{"class":1620},[1207,25411,25413,25415,25417,25419,25422,25424,25426,25428,25430,25433],{"class":1209,"line":25412},372,[1207,25414,20998],{"class":5160},[1207,25416,1811],{"class":1632},[1207,25418,12545],{"class":1735},[1207,25420,25421],{"class":1224},"\"✓ Concurrent operations test passed with ",[1207,25423,3288],{"class":3287},[1207,25425,25397],{"class":1862},[1207,25427,25400],{"class":1735},[1207,25429,3294],{"class":3287},[1207,25431,25432],{"class":1224}," success rate\"",[1207,25434,2136],{"class":1632},[1207,25436,25438],{"class":1209,"line":25437},373,[1207,25439,1763],{"class":1620},[1207,25441,25443,25445,25448,25450,25452,25454,25456],{"class":1209,"line":25442},374,[1207,25444,1806],{"class":1735},[1207,25446,25447],{"class":1794}," test_service_failure_resilience",[1207,25449,1811],{"class":1632},[1207,25451,1815],{"class":1814},[1207,25453,1644],{"class":1632},[1207,25455,20720],{"class":2051},[1207,25457,1818],{"class":1632},[1207,25459,25461],{"class":1209,"line":25460},375,[1207,25462,1824],{"class":1749},[1207,25464,25466],{"class":1209,"line":25465},376,[1207,25467,25468],{"class":1756},"        Test system resilience when individual services fail\n",[1207,25470,25472],{"class":1209,"line":25471},377,[1207,25473,1836],{"class":1756},[1207,25475,25477],{"class":1209,"line":25476},378,[1207,25478,25479],{"class":1756},"        This test verifies that the system can handle partial failures\n",[1207,25481,25483],{"class":1209,"line":25482},379,[1207,25484,25485],{"class":1756},"        gracefully without completely breaking down.\n",[1207,25487,25489],{"class":1209,"line":25488},380,[1207,25490,1824],{"class":1749},[1207,25492,25494,25496,25498,25500,25503,25505],{"class":1209,"line":25493},381,[1207,25495,20998],{"class":5160},[1207,25497,1811],{"class":1632},[1207,25499,3297],{"class":1964},[1207,25501,25502],{"class":1224},"Testing service failure resilience...",[1207,25504,3297],{"class":1964},[1207,25506,2136],{"class":1632},[1207,25508,25510],{"class":1209,"line":25509},382,[1207,25511,1836],{"class":1620},[1207,25513,25515],{"class":1209,"line":25514},383,[1207,25516,25517],{"class":1213},"        # This test would require the ability to stop/start services\n",[1207,25519,25521],{"class":1209,"line":25520},384,[1207,25522,25523],{"class":1213},"        # In a real environment, you might use chaos engineering tools\n",[1207,25525,25527],{"class":1209,"line":25526},385,[1207,25528,25529],{"class":1213},"        # like Chaos Monkey to randomly fail services\n",[1207,25531,25533],{"class":1209,"line":25532},386,[1207,25534,1836],{"class":1620},[1207,25536,25538],{"class":1209,"line":25537},387,[1207,25539,25540],{"class":1213},"        # For now, we'll test timeout handling\n",[1207,25542,25544,25546,25548,25550,25553,25555],{"class":1209,"line":25543},388,[1207,25545,20998],{"class":5160},[1207,25547,1811],{"class":1632},[1207,25549,3297],{"class":1964},[1207,25551,25552],{"class":1224},"Testing timeout handling...",[1207,25554,3297],{"class":1964},[1207,25556,2136],{"class":1632},[1207,25558,25560],{"class":1209,"line":25559},389,[1207,25561,1836],{"class":1620},[1207,25563,25565],{"class":1209,"line":25564},390,[1207,25566,25567],{"class":1213},"        # Create a user first\n",[1207,25569,25571,25573,25575],{"class":1209,"line":25570},391,[1207,25572,2440],{"class":1620},[1207,25574,1961],{"class":1632},[1207,25576,2445],{"class":1632},[1207,25578,25580,25582,25584,25586,25588,25590,25593,25595],{"class":1209,"line":25579},392,[1207,25581,2451],{"class":1964},[1207,25583,2183],{"class":1224},[1207,25585,1965],{"class":1964},[1207,25587,2458],{"class":1632},[1207,25589,2188],{"class":1964},[1207,25591,25592],{"class":1224},"resilience_user",[1207,25594,1965],{"class":1964},[1207,25596,1973],{"class":1632},[1207,25598,25600,25602,25604,25606,25608,25610,25613,25615],{"class":1209,"line":25599},393,[1207,25601,2451],{"class":1964},[1207,25603,2204],{"class":1224},[1207,25605,1965],{"class":1964},[1207,25607,2458],{"class":1632},[1207,25609,2188],{"class":1964},[1207,25611,25612],{"class":1224},"resilience@example.com",[1207,25614,1965],{"class":1964},[1207,25616,1973],{"class":1632},[1207,25618,25620,25622,25624,25626,25628,25630,25632],{"class":1209,"line":25619},394,[1207,25621,2451],{"class":1964},[1207,25623,2495],{"class":1224},[1207,25625,1965],{"class":1964},[1207,25627,2458],{"class":1632},[1207,25629,2188],{"class":1964},[1207,25631,2003],{"class":1224},[1207,25633,2006],{"class":1964},[1207,25635,25637],{"class":1209,"line":25636},395,[1207,25638,2554],{"class":1632},[1207,25640,25642],{"class":1209,"line":25641},396,[1207,25643,1836],{"class":1620},[1207,25645,25647,25649,25651,25653,25655,25657],{"class":1209,"line":25646},397,[1207,25648,21491],{"class":1620},[1207,25650,1961],{"class":1632},[1207,25652,21075],{"class":1620},[1207,25654,1633],{"class":1632},[1207,25656,7368],{"class":1862},[1207,25658,1951],{"class":1632},[1207,25660,25662,25664,25666,25668],{"class":1209,"line":25661},398,[1207,25663,2451],{"class":1964},[1207,25665,21508],{"class":1224},[1207,25667,1965],{"class":1964},[1207,25669,1973],{"class":1632},[1207,25671,25673,25675,25677,25679],{"class":1209,"line":25672},399,[1207,25674,13896],{"class":1957},[1207,25676,1961],{"class":1632},[1207,25678,2583],{"class":1862},[1207,25680,1973],{"class":1632},[1207,25682,25684,25686,25688],{"class":1209,"line":25683},400,[1207,25685,21527],{"class":1957},[1207,25687,1961],{"class":1632},[1207,25689,21532],{"class":1231},[1207,25691,25693],{"class":1209,"line":25692},401,[1207,25694,2012],{"class":1632},[1207,25696,25698,25700,25702,25704,25706,25708],{"class":1209,"line":25697},402,[1207,25699,2153],{"class":1616},[1207,25701,21543],{"class":1620},[1207,25703,1633],{"class":1632},[1207,25705,2772],{"class":1942},[1207,25707,2164],{"class":2163},[1207,25709,25710],{"class":1231}," 201\n",[1207,25712,25714],{"class":1209,"line":25713},403,[1207,25715,1836],{"class":1620},[1207,25717,25719],{"class":1209,"line":25718},404,[1207,25720,25721],{"class":1213},"        # Test with very short timeout to simulate service failure\n",[1207,25723,25725,25727],{"class":1209,"line":25724},405,[1207,25726,11079],{"class":1616},[1207,25728,1743],{"class":1632},[1207,25730,25732,25735,25737,25739],{"class":1209,"line":25731},406,[1207,25733,25734],{"class":1620},"            requests",[1207,25736,1633],{"class":1632},[1207,25738,5111],{"class":1862},[1207,25740,1951],{"class":1632},[1207,25742,25744,25746,25748,25750],{"class":1209,"line":25743},407,[1207,25745,4969],{"class":1964},[1207,25747,22519],{"class":1224},[1207,25749,1965],{"class":1964},[1207,25751,1973],{"class":1632},[1207,25753,25755,25757,25759,25762],{"class":1209,"line":25754},408,[1207,25756,23399],{"class":1957},[1207,25758,1961],{"class":1632},[1207,25760,25761],{"class":1231},"0.001",[1207,25763,25764],{"class":1213},"  # Extremely short timeout\n",[1207,25766,25768],{"class":1209,"line":25767},409,[1207,25769,13157],{"class":1632},[1207,25771,25773,25775,25777,25779,25781,25784],{"class":1209,"line":25772},410,[1207,25774,5862],{"class":1616},[1207,25776,11104],{"class":2813},[1207,25778,1644],{"class":1632},[1207,25780,11109],{"class":1964},[1207,25782,25783],{"class":1224},"Expected timeout exception",[1207,25785,11115],{"class":1964},[1207,25787,25789,25791,25793,25795,25798],{"class":1209,"line":25788},411,[1207,25790,11120],{"class":1616},[1207,25792,21075],{"class":1620},[1207,25794,1633],{"class":1632},[1207,25796,25797],{"class":1942},"Timeout",[1207,25799,1743],{"class":1632},[1207,25801,25803,25805,25807,25809,25812,25814],{"class":1209,"line":25802},412,[1207,25804,23733],{"class":5160},[1207,25806,1811],{"class":1632},[1207,25808,3297],{"class":1964},[1207,25810,25811],{"class":1224},"✓ Timeout handling works correctly",[1207,25813,3297],{"class":1964},[1207,25815,2136],{"class":1632},[1207,25817,25819],{"class":1209,"line":25818},413,[1207,25820,1836],{"class":1620},[1207,25822,25824,25826,25828,25830,25833,25835],{"class":1209,"line":25823},414,[1207,25825,20998],{"class":5160},[1207,25827,1811],{"class":1632},[1207,25829,3297],{"class":1964},[1207,25831,25832],{"class":1224},"✓ Service failure resilience test completed",[1207,25834,3297],{"class":1964},[1207,25836,2136],{"class":1632},[1207,25838,25840],{"class":1209,"line":25839},415,[1207,25841,1527],{"emptyLinePlaceholder":1526},[1207,25843,25845],{"class":1209,"line":25844},416,[1207,25846,25847],{"class":1213},"# Helper functions for E2E test setup\n",[1207,25849,25851,25853,25856],{"class":1209,"line":25850},417,[1207,25852,9532],{"class":1735},[1207,25854,25855],{"class":1794}," setup_test_data",[1207,25857,9538],{"class":1632},[1207,25859,25861],{"class":1209,"line":25860},418,[1207,25862,1750],{"class":1749},[1207,25864,25866],{"class":1209,"line":25865},419,[1207,25867,25868],{"class":1756},"    Set up test data needed for E2E tests\n",[1207,25870,25872],{"class":1209,"line":25871},420,[1207,25873,1763],{"class":1756},[1207,25875,25877],{"class":1209,"line":25876},421,[1207,25878,25879],{"class":1756},"    This function creates any necessary test data like products,\n",[1207,25881,25883],{"class":1209,"line":25882},422,[1207,25884,25885],{"class":1756},"    categories, or configuration needed for E2E tests.\n",[1207,25887,25889],{"class":1209,"line":25888},423,[1207,25890,1750],{"class":1749},[1207,25892,25894],{"class":1209,"line":25893},424,[1207,25895,25896],{"class":1213},"    # Create test products\n",[1207,25898,25900,25903,25905],{"class":1209,"line":25899},425,[1207,25901,25902],{"class":1620},"    products_data ",[1207,25904,1961],{"class":1632},[1207,25906,5664],{"class":1632},[1207,25908,25910],{"class":1209,"line":25909},426,[1207,25911,25912],{"class":1632},"        {\n",[1207,25914,25916,25918,25921,25923,25925,25927,25930,25932],{"class":1209,"line":25915},427,[1207,25917,2451],{"class":1964},[1207,25919,25920],{"class":1224},"name",[1207,25922,1965],{"class":1964},[1207,25924,2458],{"class":1632},[1207,25926,2188],{"class":1964},[1207,25928,25929],{"class":1224},"Test Product 1",[1207,25931,1965],{"class":1964},[1207,25933,1973],{"class":1632},[1207,25935,25937,25939,25941,25943,25945,25948],{"class":1209,"line":25936},428,[1207,25938,2451],{"class":1964},[1207,25940,22204],{"class":1224},[1207,25942,1965],{"class":1964},[1207,25944,2458],{"class":1632},[1207,25946,25947],{"class":1231}," 29.99",[1207,25949,1973],{"class":1632},[1207,25951,25953,25955,25957,25959,25961,25964],{"class":1209,"line":25952},429,[1207,25954,2451],{"class":1964},[1207,25956,23455],{"class":1224},[1207,25958,1965],{"class":1964},[1207,25960,2458],{"class":1632},[1207,25962,25963],{"class":1231}," 100",[1207,25965,1973],{"class":1632},[1207,25967,25969,25971,25974,25976,25978,25980,25983],{"class":1209,"line":25968},430,[1207,25970,2451],{"class":1964},[1207,25972,25973],{"class":1224},"description",[1207,25975,1965],{"class":1964},[1207,25977,2458],{"class":1632},[1207,25979,2188],{"class":1964},[1207,25981,25982],{"class":1224},"A test product for E2E testing",[1207,25984,2006],{"class":1964},[1207,25986,25988],{"class":1209,"line":25987},431,[1207,25989,25990],{"class":1632},"        },\n",[1207,25992,25994],{"class":1209,"line":25993},432,[1207,25995,25912],{"class":1632},[1207,25997,25999,26001,26003,26005,26007,26009,26012,26014],{"class":1209,"line":25998},433,[1207,26000,2451],{"class":1964},[1207,26002,25920],{"class":1224},[1207,26004,1965],{"class":1964},[1207,26006,2458],{"class":1632},[1207,26008,2188],{"class":1964},[1207,26010,26011],{"class":1224},"Test Product 2",[1207,26013,1965],{"class":1964},[1207,26015,1973],{"class":1632},[1207,26017,26019,26021,26023,26025,26027,26030],{"class":1209,"line":26018},434,[1207,26020,2451],{"class":1964},[1207,26022,22204],{"class":1224},[1207,26024,1965],{"class":1964},[1207,26026,2458],{"class":1632},[1207,26028,26029],{"class":1231}," 49.99",[1207,26031,1973],{"class":1632},[1207,26033,26035,26037,26039,26041,26043,26046],{"class":1209,"line":26034},435,[1207,26036,2451],{"class":1964},[1207,26038,23455],{"class":1224},[1207,26040,1965],{"class":1964},[1207,26042,2458],{"class":1632},[1207,26044,26045],{"class":1231}," 50",[1207,26047,1973],{"class":1632},[1207,26049,26051,26053,26055,26057,26059,26061,26064],{"class":1209,"line":26050},436,[1207,26052,2451],{"class":1964},[1207,26054,25973],{"class":1224},[1207,26056,1965],{"class":1964},[1207,26058,2458],{"class":1632},[1207,26060,2188],{"class":1964},[1207,26062,26063],{"class":1224},"Another test product for E2E testing",[1207,26065,2006],{"class":1964},[1207,26067,26069],{"class":1209,"line":26068},437,[1207,26070,2554],{"class":1632},[1207,26072,26074],{"class":1209,"line":26073},438,[1207,26075,26076],{"class":1632},"    ]\n",[1207,26078,26080],{"class":1209,"line":26079},439,[1207,26081,1763],{"class":1620},[1207,26083,26085,26087,26090,26092,26095],{"class":1209,"line":26084},440,[1207,26086,12505],{"class":1616},[1207,26088,26089],{"class":1620}," product_data ",[1207,26091,5752],{"class":1616},[1207,26093,26094],{"class":1620}," products_data",[1207,26096,1743],{"class":1632},[1207,26098,26100,26103,26105,26107],{"class":1209,"line":26099},441,[1207,26101,26102],{"class":1620},"        requests",[1207,26104,1633],{"class":1632},[1207,26106,7368],{"class":1862},[1207,26108,1951],{"class":1632},[1207,26110,26112,26114,26116,26118],{"class":1209,"line":26111},442,[1207,26113,2451],{"class":1964},[1207,26115,21949],{"class":1224},[1207,26117,1965],{"class":1964},[1207,26119,1973],{"class":1632},[1207,26121,26123,26125,26127,26130],{"class":1209,"line":26122},443,[1207,26124,13896],{"class":1957},[1207,26126,1961],{"class":1632},[1207,26128,26129],{"class":1862},"product_data",[1207,26131,1973],{"class":1632},[1207,26133,26135,26137,26139,26141,26143,26145,26147,26149,26152,26154,26156],{"class":1209,"line":26134},444,[1207,26136,21958],{"class":1957},[1207,26138,8186],{"class":1632},[1207,26140,1965],{"class":1964},[1207,26142,21868],{"class":1224},[1207,26144,1965],{"class":1964},[1207,26146,2458],{"class":1632},[1207,26148,2188],{"class":1964},[1207,26150,26151],{"class":1224},"Bearer admin-token",[1207,26153,1965],{"class":1964},[1207,26155,3294],{"class":1632},[1207,26157,26158],{"class":1213},"  # Admin token\n",[1207,26160,26162],{"class":1209,"line":26161},445,[1207,26163,2012],{"class":1632},[1207,26165,26167],{"class":1209,"line":26166},446,[1207,26168,1527],{"emptyLinePlaceholder":1526},[1207,26170,26172,26174,26177],{"class":1209,"line":26171},447,[1207,26173,9532],{"class":1735},[1207,26175,26176],{"class":1794}," cleanup_test_data",[1207,26178,9538],{"class":1632},[1207,26180,26182],{"class":1209,"line":26181},448,[1207,26183,1750],{"class":1749},[1207,26185,26187],{"class":1209,"line":26186},449,[1207,26188,26189],{"class":1756},"    Clean up test data after E2E tests\n",[1207,26191,26193],{"class":1209,"line":26192},450,[1207,26194,1763],{"class":1756},[1207,26196,26198],{"class":1209,"line":26197},451,[1207,26199,26200],{"class":1756},"    This function removes any test data created during E2E tests\n",[1207,26202,26204],{"class":1209,"line":26203},452,[1207,26205,26206],{"class":1756},"    to ensure a clean state for subsequent test runs.\n",[1207,26208,26210],{"class":1209,"line":26209},453,[1207,26211,1750],{"class":1749},[1207,26213,26215],{"class":1209,"line":26214},454,[1207,26216,26217],{"class":1213},"    # Clean up test users\n",[1207,26219,26221,26224,26226,26228,26230,26232],{"class":1209,"line":26220},455,[1207,26222,26223],{"class":1620},"    test_users ",[1207,26225,1961],{"class":1632},[1207,26227,21075],{"class":1620},[1207,26229,1633],{"class":1632},[1207,26231,5111],{"class":1862},[1207,26233,1951],{"class":1632},[1207,26235,26237,26239,26242,26244],{"class":1209,"line":26236},456,[1207,26238,9762],{"class":1964},[1207,26240,26241],{"class":1224},"http://user-service:8000/api/users/?username__startswith=e2e",[1207,26243,1965],{"class":1964},[1207,26245,1973],{"class":1632},[1207,26247,26249,26252,26254,26256,26258,26260,26262,26264,26266,26268],{"class":1209,"line":26248},457,[1207,26250,26251],{"class":1957},"        headers",[1207,26253,8186],{"class":1632},[1207,26255,1965],{"class":1964},[1207,26257,21868],{"class":1224},[1207,26259,1965],{"class":1964},[1207,26261,2458],{"class":1632},[1207,26263,2188],{"class":1964},[1207,26265,26151],{"class":1224},[1207,26267,1965],{"class":1964},[1207,26269,2817],{"class":1632},[1207,26271,26273],{"class":1209,"line":26272},458,[1207,26274,11928],{"class":1632},[1207,26276,26278],{"class":1209,"line":26277},459,[1207,26279,1763],{"class":1620},[1207,26281,26283,26286,26289,26291,26293,26295,26297],{"class":1209,"line":26282},460,[1207,26284,26285],{"class":1616},"    if",[1207,26287,26288],{"class":1620}," test_users",[1207,26290,1633],{"class":1632},[1207,26292,2772],{"class":1942},[1207,26294,2164],{"class":2163},[1207,26296,21109],{"class":1231},[1207,26298,1743],{"class":1632},[1207,26300,26302,26304,26306,26308,26310,26312,26314,26316,26318,26320,26322,26324,26326,26328],{"class":1209,"line":26301},461,[1207,26303,5838],{"class":1616},[1207,26305,5846],{"class":1620},[1207,26307,5752],{"class":1616},[1207,26309,26288],{"class":1620},[1207,26311,1633],{"class":1632},[1207,26313,2792],{"class":1862},[1207,26315,12477],{"class":1632},[1207,26317,5111],{"class":1862},[1207,26319,1811],{"class":1632},[1207,26321,1965],{"class":1964},[1207,26323,7042],{"class":1224},[1207,26325,1965],{"class":1964},[1207,26327,1644],{"class":1632},[1207,26329,26330],{"class":1632}," []):\n",[1207,26332,26334,26336,26338,26340],{"class":1209,"line":26333},462,[1207,26335,25734],{"class":1620},[1207,26337,1633],{"class":1632},[1207,26339,12220],{"class":1862},[1207,26341,1951],{"class":1632},[1207,26343,26345,26347,26350,26352,26354,26356,26358,26360,26362,26364,26366,26368],{"class":1209,"line":26344},463,[1207,26346,23359],{"class":1735},[1207,26348,26349],{"class":1224},"'http://user-service:8000/api/users/",[1207,26351,3288],{"class":3287},[1207,26353,2643],{"class":1862},[1207,26355,2989],{"class":1632},[1207,26357,3297],{"class":1964},[1207,26359,2133],{"class":1224},[1207,26361,3297],{"class":1964},[1207,26363,3010],{"class":1632},[1207,26365,3294],{"class":3287},[1207,26367,23121],{"class":1224},[1207,26369,1973],{"class":1632},[1207,26371,26373,26375,26377,26379,26381,26383,26385,26387,26389,26391],{"class":1209,"line":26372},464,[1207,26374,23388],{"class":1957},[1207,26376,8186],{"class":1632},[1207,26378,1965],{"class":1964},[1207,26380,21868],{"class":1224},[1207,26382,1965],{"class":1964},[1207,26384,2458],{"class":1632},[1207,26386,2188],{"class":1964},[1207,26388,26151],{"class":1224},[1207,26390,1965],{"class":1964},[1207,26392,2817],{"class":1632},[1207,26394,26396],{"class":1209,"line":26395},465,[1207,26397,13157],{"class":1632},[1026,26399,26400],{},[1045,26401,26402],{},"Running E2E Tests:",[1197,26404,26406],{"className":1199,"code":26405,"language":1201,"meta":1202,"style":1202},"# Start all services first\ndocker-compose up -d\n\n# Wait for services to be ready\nsleep 30\n\n# Run E2E tests\npytest tests/e2e/ -v -s\n\n# Run with specific markers\npytest tests/e2e/ -m \"not slow\" -v\n\n# Run single test\npytest tests/e2e/test_user_order_flow.py::TestUserOrderFlow::test_complete_user_order_flow -v -s\n",[1204,26407,26408,26413,26424,26428,26433,26440,26444,26449,26462,26466,26471,26488,26492,26497],{"__ignoreMap":1202},[1207,26409,26410],{"class":1209,"line":1210},[1207,26411,26412],{"class":1213},"# Start all services first\n",[1207,26414,26415,26418,26421],{"class":1209,"line":1217},[1207,26416,26417],{"class":1220},"docker-compose",[1207,26419,26420],{"class":1224}," up",[1207,26422,26423],{"class":13424}," -d\n",[1207,26425,26426],{"class":1209,"line":1238},[1207,26427,1527],{"emptyLinePlaceholder":1526},[1207,26429,26430],{"class":1209,"line":1254},[1207,26431,26432],{"class":1213},"# Wait for services to be ready\n",[1207,26434,26435,26437],{"class":1209,"line":1270},[1207,26436,21201],{"class":1220},[1207,26438,26439],{"class":1231}," 30\n",[1207,26441,26442],{"class":1209,"line":1535},[1207,26443,1527],{"emptyLinePlaceholder":1526},[1207,26445,26446],{"class":1209,"line":1710},[1207,26447,26448],{"class":1213},"# Run E2E tests\n",[1207,26450,26451,26453,26456,26459],{"class":1209,"line":1727},[1207,26452,1795],{"class":1220},[1207,26454,26455],{"class":1224}," tests/e2e/",[1207,26457,26458],{"class":13424}," -v",[1207,26460,26461],{"class":13424}," -s\n",[1207,26463,26464],{"class":1209,"line":1732},[1207,26465,1527],{"emptyLinePlaceholder":1526},[1207,26467,26468],{"class":1209,"line":1746},[1207,26469,26470],{"class":1213},"# Run with specific markers\n",[1207,26472,26473,26475,26477,26479,26481,26484,26486],{"class":1209,"line":1753},[1207,26474,1795],{"class":1220},[1207,26476,26455],{"class":1224},[1207,26478,20410],{"class":13424},[1207,26480,11109],{"class":1964},[1207,26482,26483],{"class":1224},"not slow",[1207,26485,3297],{"class":1964},[1207,26487,20450],{"class":13424},[1207,26489,26490],{"class":1209,"line":1760},[1207,26491,1527],{"emptyLinePlaceholder":1526},[1207,26493,26494],{"class":1209,"line":1766},[1207,26495,26496],{"class":1213},"# Run single test\n",[1207,26498,26499,26501,26504,26506],{"class":1209,"line":1772},[1207,26500,1795],{"class":1220},[1207,26502,26503],{"class":1224}," tests/e2e/test_user_order_flow.py::TestUserOrderFlow::test_complete_user_order_flow",[1207,26505,26458],{"class":13424},[1207,26507,26461],{"class":13424},[1026,26509,26510],{},[1045,26511,26512],{},"E2E Test Environment Setup:",[1197,26514,26516],{"className":20157,"code":26515,"language":20159,"meta":1202,"style":1202},"# docker-compose.e2e.yml\nversion: '3.8'\nservices:\n  user-service:\n    build: ./user_service\n    ports:\n      - \"8000:8000\"\n    environment:\n      - DATABASE_URL=postgresql://postgres:postgres@postgres:5432/e2e_db\n      - REDIS_URL=redis://redis:6379/0\n    depends_on:\n      - postgres\n      - redis\n    \n  order-service:\n    build: ./order_service\n    ports:\n      - \"8001:8000\"\n    environment:\n      - DATABASE_URL=postgresql://postgres:postgres@postgres:5432/e2e_db\n      - USER_SERVICE_URL=http://user-service:8000\n    depends_on:\n      - postgres\n      - user-service\n    \n  # ... other services\n  \n  postgres:\n    image: postgres:13\n    environment:\n      POSTGRES_DB: e2e_db\n      POSTGRES_USER: postgres\n      POSTGRES_PASSWORD: postgres\n    \n  redis:\n    image: redis:7-alpine\n",[1204,26517,26518,26523,26535,26541,26548,26558,26564,26575,26581,26588,26595,26602,26608,26614,26618,26625,26634,26640,26651,26657,26663,26670,26676,26682,26689,26693,26698,26703,26710,26718,26724,26733,26741,26749,26753,26760],{"__ignoreMap":1202},[1207,26519,26520],{"class":1209,"line":1210},[1207,26521,26522],{"class":1213},"# docker-compose.e2e.yml\n",[1207,26524,26525,26527,26529,26531,26533],{"class":1209,"line":1217},[1207,26526,20172],{"class":20171},[1207,26528,2458],{"class":1632},[1207,26530,2188],{"class":1964},[1207,26532,20179],{"class":1224},[1207,26534,2006],{"class":1964},[1207,26536,26537,26539],{"class":1209,"line":1238},[1207,26538,20186],{"class":20171},[1207,26540,1743],{"class":1632},[1207,26542,26543,26546],{"class":1209,"line":1254},[1207,26544,26545],{"class":20171},"  user-service",[1207,26547,1743],{"class":1632},[1207,26549,26550,26553,26555],{"class":1209,"line":1270},[1207,26551,26552],{"class":20171},"    build",[1207,26554,2458],{"class":1632},[1207,26556,26557],{"class":1224}," ./user_service\n",[1207,26559,26560,26562],{"class":1209,"line":1535},[1207,26561,20247],{"class":20171},[1207,26563,1743],{"class":1632},[1207,26565,26566,26568,26570,26573],{"class":1209,"line":1710},[1207,26567,20254],{"class":1632},[1207,26569,11109],{"class":1964},[1207,26571,26572],{"class":1224},"8000:8000",[1207,26574,11115],{"class":1964},[1207,26576,26577,26579],{"class":1209,"line":1727},[1207,26578,20210],{"class":20171},[1207,26580,1743],{"class":1632},[1207,26582,26583,26585],{"class":1209,"line":1732},[1207,26584,20254],{"class":1632},[1207,26586,26587],{"class":1224}," DATABASE_URL=postgresql://postgres:postgres@postgres:5432/e2e_db\n",[1207,26589,26590,26592],{"class":1209,"line":1746},[1207,26591,20254],{"class":1632},[1207,26593,26594],{"class":1224}," REDIS_URL=redis://redis:6379/0\n",[1207,26596,26597,26600],{"class":1209,"line":1753},[1207,26598,26599],{"class":20171},"    depends_on",[1207,26601,1743],{"class":1632},[1207,26603,26604,26606],{"class":1209,"line":1760},[1207,26605,20254],{"class":1632},[1207,26607,17140],{"class":1224},[1207,26609,26610,26612],{"class":1209,"line":1766},[1207,26611,20254],{"class":1632},[1207,26613,17241],{"class":1224},[1207,26615,26616],{"class":1209,"line":1772},[1207,26617,1763],{"class":1620},[1207,26619,26620,26623],{"class":1209,"line":1778},[1207,26621,26622],{"class":20171},"  order-service",[1207,26624,1743],{"class":1632},[1207,26626,26627,26629,26631],{"class":1209,"line":1783},[1207,26628,26552],{"class":20171},[1207,26630,2458],{"class":1632},[1207,26632,26633],{"class":1224}," ./order_service\n",[1207,26635,26636,26638],{"class":1209,"line":1788},[1207,26637,20247],{"class":20171},[1207,26639,1743],{"class":1632},[1207,26641,26642,26644,26646,26649],{"class":1209,"line":1803},[1207,26643,20254],{"class":1632},[1207,26645,11109],{"class":1964},[1207,26647,26648],{"class":1224},"8001:8000",[1207,26650,11115],{"class":1964},[1207,26652,26653,26655],{"class":1209,"line":1821},[1207,26654,20210],{"class":20171},[1207,26656,1743],{"class":1632},[1207,26658,26659,26661],{"class":1209,"line":1827},[1207,26660,20254],{"class":1632},[1207,26662,26587],{"class":1224},[1207,26664,26665,26667],{"class":1209,"line":1833},[1207,26666,20254],{"class":1632},[1207,26668,26669],{"class":1224}," USER_SERVICE_URL=http://user-service:8000\n",[1207,26671,26672,26674],{"class":1209,"line":1839},[1207,26673,26599],{"class":20171},[1207,26675,1743],{"class":1632},[1207,26677,26678,26680],{"class":1209,"line":1845},[1207,26679,20254],{"class":1632},[1207,26681,17140],{"class":1224},[1207,26683,26684,26686],{"class":1209,"line":1851},[1207,26685,20254],{"class":1632},[1207,26687,26688],{"class":1224}," user-service\n",[1207,26690,26691],{"class":1209,"line":1856},[1207,26692,1763],{"class":1620},[1207,26694,26695],{"class":1209,"line":1869},[1207,26696,26697],{"class":1213},"  # ... other services\n",[1207,26699,26700],{"class":1209,"line":1874},[1207,26701,26702],{"class":1620},"  \n",[1207,26704,26705,26708],{"class":1209,"line":1885},[1207,26706,26707],{"class":20171},"  postgres",[1207,26709,1743],{"class":1632},[1207,26711,26712,26714,26716],{"class":1209,"line":1899},[1207,26713,20200],{"class":20171},[1207,26715,2458],{"class":1632},[1207,26717,20205],{"class":1224},[1207,26719,26720,26722],{"class":1209,"line":1904},[1207,26721,20210],{"class":20171},[1207,26723,1743],{"class":1632},[1207,26725,26726,26728,26730],{"class":1209,"line":1910},[1207,26727,20217],{"class":20171},[1207,26729,2458],{"class":1632},[1207,26731,26732],{"class":1224}," e2e_db\n",[1207,26734,26735,26737,26739],{"class":1209,"line":1915},[1207,26736,20227],{"class":20171},[1207,26738,2458],{"class":1632},[1207,26740,17140],{"class":1224},[1207,26742,26743,26745,26747],{"class":1209,"line":1921},[1207,26744,20237],{"class":20171},[1207,26746,2458],{"class":1632},[1207,26748,17140],{"class":1224},[1207,26750,26751],{"class":1209,"line":1927},[1207,26752,1763],{"class":1620},[1207,26754,26755,26758],{"class":1209,"line":1932},[1207,26756,26757],{"class":20171},"  redis",[1207,26759,1743],{"class":1632},[1207,26761,26762,26764,26766],{"class":1209,"line":1954},[1207,26763,20200],{"class":20171},[1207,26765,2458],{"class":1632},[1207,26767,26768],{"class":1224}," redis:7-alpine\n",[1026,26770,26771],{},[1045,26772,26773],{},"Best Practices for E2E Testing:",[1123,26775,26776,26782,26788,26794,26800,26806,26812,26818],{},[1084,26777,26778,26781],{},[1045,26779,26780],{},"Keep Tests Independent",": Each test should be able to run in isolation",[1084,26783,26784,26787],{},[1045,26785,26786],{},"Use Realistic Data",": Test with data that resembles production",[1084,26789,26790,26793],{},[1045,26791,26792],{},"Handle Timing Issues",": Add appropriate waits for async operations",[1084,26795,26796,26799],{},[1045,26797,26798],{},"Test Critical Paths",": Focus on the most important user journeys",[1084,26801,26802,26805],{},[1045,26803,26804],{},"Make Tests Stable",": Avoid flaky tests that fail intermittently",[1084,26807,26808,26811],{},[1045,26809,26810],{},"Clean Up",": Always clean up test data after tests complete",[1084,26813,26814,26817],{},[1045,26815,26816],{},"Monitor Performance",": E2E tests can reveal performance issues",[1084,26819,26820,26823],{},[1045,26821,26822],{},"Use Proper Timeouts",": Set reasonable timeouts for network operations",[1030,26825,26827],{"id":26826},"load-testing","Load Testing",[1026,26829,26830],{},"Load testing verifies that your microservices can handle expected (and unexpected) levels of traffic. While functional tests verify that your code works correctly, load tests verify that it works correctly under stress.",[1038,26832,26834],{"id":26833},"why-load-testing-matters","Why Load Testing Matters",[1026,26836,26837],{},"In microservices, load testing is critical because:",[1081,26839,26840,26846,26852,26858],{},[1084,26841,26842,26845],{},[1045,26843,26844],{},"Distributed Bottlenecks",": Performance issues might only appear when multiple services are under load",[1084,26847,26848,26851],{},[1045,26849,26850],{},"Resource Limits",": Each service has memory, CPU, and connection limits",[1084,26853,26854,26857],{},[1045,26855,26856],{},"Cascading Failures",": One slow service can cause problems throughout the system",[1084,26859,26860,26863],{},[1045,26861,26862],{},"Scalability Validation",": Verify that your services scale as expected",[1038,26865,26867],{"id":26866},"understanding-load-testing-metrics","Understanding Load Testing Metrics",[1026,26869,26870],{},[1045,26871,26872],{},"Key metrics to monitor:",[1081,26874,26875,26881,26887,26893,26899],{},[1084,26876,26877,26880],{},[1045,26878,26879],{},"Response Time",": How long requests take (p50, p95, p99 percentiles)",[1084,26882,26883,26886],{},[1045,26884,26885],{},"Throughput",": Requests per second the system can handle",[1084,26888,26889,26892],{},[1045,26890,26891],{},"Error Rate",": Percentage of failed requests",[1084,26894,26895,26898],{},[1045,26896,26897],{},"Resource Usage",": CPU, memory, database connections",[1084,26900,26901,26904],{},[1045,26902,26903],{},"Concurrent Users",": Number of simultaneous users the system supports",[1038,26906,26908],{"id":26907},"locust-load-testing","Locust Load Testing",[1026,26910,26911],{},"Locust is a Python-based load testing tool that's perfect for testing microservices. It allows you to define user behavior in Python code and simulate thousands of concurrent users.",[1197,26913,26915],{"className":1602,"code":26914,"language":1604,"meta":1202,"style":1202},"# tests/load/locustfile.py\nfrom locust import HttpUser, task, between, events\nimport json\nimport random\nimport logging\n\n# Set up logging\nlogging.basicConfig(level=logging.INFO)\nlogger = logging.getLogger(__name__)\n\nclass UserServiceLoadTest(HttpUser):\n    \"\"\"\n    Load test for User Service\n    \n    This class simulates user behavior for the User Service.\n    Each instance represents a virtual user performing various operations.\n    \"\"\"\n    \n    # Wait time between tasks (simulates user think time)\n    wait_time = between(1, 3)  # Wait 1-3 seconds between requests\n    \n    def on_start(self):\n        \"\"\"\n        Called when a simulated user starts\n        \n        This method runs once per user when they start their session.\n        Use it to set up any user-specific data or perform login.\n        \"\"\"\n        self.user_id = None\n        self.auth_token = None\n        \n        # Create a user and authenticate\n        self.create_and_authenticate_user()\n    \n    def create_and_authenticate_user(self):\n        \"\"\"Create a user and get authentication token\"\"\"\n        # Generate unique username\n        username = f'loadtest_user_{random.randint(1000, 999999)}'\n        \n        # Create user\n        user_data = {\n            'username': username,\n            'email': f'{username}@example.com',\n            'password': 'testpass123',\n            'first_name': 'Load',\n            'last_name': 'Test'\n        }\n        \n        with self.client.post(\n            '/api/users/',\n            json=user_data,\n            catch_response=True,\n            name=\"Create User\"\n        ) as response:\n            if response.status_code == 201:\n                user = response.json()\n                self.user_id = user['id']\n                response.success()\n            else:\n                response.failure(f\"Failed to create user: {response.text}\")\n                return\n        \n        # Authenticate\n        auth_data = {\n            'username': username,\n            'password': 'testpass123'\n        }\n        \n        with self.client.post(\n            '/api/auth/login/',\n            json=auth_data,\n            catch_response=True,\n            name=\"Login\"\n        ) as response:\n            if response.status_code == 200:\n                auth = response.json()\n                self.auth_token = auth.get('token') or auth.get('access_token')\n                response.success()\n            else:\n                response.failure(f\"Failed to authenticate: {response.text}\")\n    \n    @property\n    def headers(self):\n        \"\"\"Get authentication headers\"\"\"\n        if self.auth_token:\n            return {'Authorization': f'Bearer {self.auth_token}'}\n        return {}\n    \n    @task(5)  # Weight: 5 (runs 5x more often than weight 1 tasks)\n    def get_user_list(self):\n        \"\"\"\n        Test user list endpoint\n        \n        This simulates users browsing the user list.\n        The @task decorator with weight 5 means this runs more frequently.\n        \"\"\"\n        with self.client.get(\n            '/api/users/',\n            headers=self.headers,\n            catch_response=True,\n            name=\"Get User List\"\n        ) as response:\n            if response.status_code == 200:\n                data = response.json()\n                if 'results' in data:\n                    response.success()\n                else:\n                    response.failure(\"Invalid response format\")\n            else:\n                response.failure(f\"Status code: {response.status_code}\")\n    \n    @task(3)\n    def get_user_detail(self):\n        \"\"\"\n        Test user detail endpoint\n        \n        This simulates users viewing profile details.\n        \"\"\"\n        if not self.user_id:\n            return\n        \n        with self.client.get(\n            f'/api/users/{self.user_id}/',\n            headers=self.headers,\n            catch_response=True,\n            name=\"Get User Detail\"\n        ) as response:\n            if response.status_code == 200:\n                user = response.json()\n                if 'username' in user:\n                    response.success()\n                else:\n                    response.failure(\"Invalid user data\")\n            else:\n                response.failure(f\"Status code: {response.status_code}\")\n    \n    @task(2)\n    def update_user(self):\n        \"\"\"\n        Test user update endpoint\n        \n        This simulates users updating their profiles.\n        \"\"\"\n        if not self.user_id:\n            return\n        \n        update_data = {\n            'first_name': f'Updated_{random.randint(100, 999)}',\n            'bio': f'Updated bio at {random.randint(1000, 9999)}'\n        }\n        \n        with self.client.patch(\n            f'/api/users/{self.user_id}/',\n            json=update_data,\n            headers=self.headers,\n            catch_response=True,\n            name=\"Update User\"\n        ) as response:\n            if response.status_code == 200:\n                response.success()\n            else:\n                response.failure(f\"Status code: {response.status_code}\")\n    \n    @task(1)\n    def search_users(self):\n        \"\"\"\n        Test user search functionality\n        \n        This simulates users searching for other users.\n        \"\"\"\n        search_terms = ['test', 'user', 'load', 'john', 'jane']\n        search_term = random.choice(search_terms)\n        \n        with self.client.get(\n            f'/api/users/?search={search_term}',\n            headers=self.headers,\n            catch_response=True,\n            name=\"Search Users\"\n        ) as response:\n            if response.status_code == 200:\n                response.success()\n            else:\n                response.failure(f\"Status code: {response.status_code}\")\n\nclass OrderServiceLoadTest(HttpUser):\n    \"\"\"\n    Load test for Order Service\n    \n    This simulates realistic order creation and management patterns.\n    \"\"\"\n    \n    wait_time = between(2, 5)  # Orders take longer to think about\n    \n    def on_start(self):\n        \"\"\"Set up user and authentication\"\"\"\n        self.user_id = None\n        self.auth_token = None\n        self.order_ids = []\n        \n        # Create and authenticate user\n        self.create_user()\n    \n    def create_user(self):\n        \"\"\"Create a user for order testing\"\"\"\n        username = f'order_user_{random.randint(1000, 999999)}'\n        \n        user_data = {\n            'username': username,\n            'email': f'{username}@example.com',\n            'password': 'testpass123'\n        }\n        \n        response = self.client.post('/api/users/', json=user_data)\n        if response.status_code == 201:\n            user = response.json()\n            self.user_id = user['id']\n            \n            # Authenticate\n            auth_response = self.client.post(\n                '/api/auth/login/',\n                json={'username': username, 'password': 'testpass123'}\n            )\n            if auth_response.status_code == 200:\n                auth = auth_response.json()\n                self.auth_token = auth.get('token') or auth.get('access_token')\n    \n    @property\n    def headers(self):\n        \"\"\"Get authentication headers\"\"\"\n        if self.auth_token:\n            return {'Authorization': f'Bearer {self.auth_token}'}\n        return {}\n    \n    @task(3)\n    def create_order(self):\n        \"\"\"\n        Test order creation with realistic data\n        \n        This simulates users placing orders with varying numbers of items.\n        \"\"\"\n        if not self.user_id:\n            return\n        \n        # Generate realistic order data\n        num_items = random.randint(1, 5)\n        items = [\n            {\n                'product_id': random.randint(1, 100),\n                'quantity': random.randint(1, 3),\n                'price': round(random.uniform(10.0, 200.0), 2)\n            }\n            for _ in range(num_items)\n        ]\n        \n        order_data = {\n            'user_id': self.user_id,\n            'items': items,\n            'shipping_address': {\n                'street': f'{random.randint(100, 9999)} Test Street',\n                'city': 'Test City',\n                'state': 'TS',\n                'zip_code': f'{random.randint(10000, 99999)}',\n                'country': 'US'\n            }\n        }\n        \n        with self.client.post(\n            '/api/orders/',\n            json=order_data,\n            headers=self.headers,\n            catch_response=True,\n            name=\"Create Order\"\n        ) as response:\n            if response.status_code == 201:\n                order = response.json()\n                self.order_ids.append(order['id'])\n                response.success()\n            else:\n                response.failure(f\"Failed to create order: {response.text}\")\n    \n    @task(5)\n    def get_user_orders(self):\n        \"\"\"\n        Test retrieving user's orders\n        \n        This simulates users checking their order history.\n        \"\"\"\n        if not self.user_id:\n            return\n        \n        with self.client.get(\n            f'/api/users/{self.user_id}/orders/',\n            headers=self.headers,\n            catch_response=True,\n            name=\"Get User Orders\"\n        ) as response:\n            if response.status_code == 200:\n                response.success()\n            else:\n                response.failure(f\"Status code: {response.status_code}\")\n    \n    @task(2)\n    def get_order_detail(self):\n        \"\"\"\n        Test retrieving order details\n        \n        This simulates users checking specific order details.\n        \"\"\"\n        if not self.order_ids:\n            return\n        \n        order_id = random.choice(self.order_ids)\n        \n        with self.client.get(\n            f'/api/orders/{order_id}/',\n            headers=self.headers,\n            catch_response=True,\n            name=\"Get Order Detail\"\n        ) as response:\n            if response.status_code == 200:\n                response.success()\n            else:\n                response.failure(f\"Status code: {response.status_code}\")\n\n# Event handlers for custom metrics\n@events.request.add_listener\ndef on_request(request_type, name, response_time, response_length, exception, **kwargs):\n    \"\"\"\n    Custom request handler for additional logging\n    \n    This handler is called for every request and can be used to\n    collect custom metrics or log specific events.\n    \"\"\"\n    if exception:\n        logger.error(f\"Request failed: {name} - {exception}\")\n    elif response_time > 2000:  # Log slow requests (> 2 seconds)\n        logger.warning(f\"Slow request: {name} took {response_time}ms\")\n\n@events.test_start.add_listener\ndef on_test_start(environment, **kwargs):\n    \"\"\"\n    Called when load test starts\n    \n    Use this to set up any test-wide configuration or logging.\n    \"\"\"\n    logger.info(\"Load test starting...\")\n    logger.info(f\"Target host: {environment.host}\")\n\n@events.test_stop.add_listener\ndef on_test_stop(environment, **kwargs):\n    \"\"\"\n    Called when load test stops\n    \n    Use this to clean up or generate final reports.\n    \"\"\"\n    logger.info(\"Load test completed\")\n    logger.info(f\"Total requests: {environment.stats.total.num_requests}\")\n    logger.info(f\"Total failures: {environment.stats.total.num_failures}\")\n",[1204,26916,26917,26922,26949,26955,26962,26969,26973,26978,27004,27027,27031,27045,27049,27054,27058,27063,27068,27072,27076,27081,27103,27107,27120,27124,27129,27133,27138,27143,27147,27160,27172,27176,27181,27192,27196,27209,27218,27223,27260,27264,27269,27277,27292,27316,27334,27353,27369,27373,27377,27395,27405,27415,27426,27440,27451,27467,27481,27504,27515,27522,27551,27556,27560,27565,27573,27587,27603,27607,27611,27627,27638,27649,27659,27672,27682,27698,27713,27758,27768,27774,27803,27807,27814,27827,27836,27848,27880,27887,27891,27907,27920,27924,27929,27933,27938,27943,27947,27963,27973,27987,27997,28010,28020,28036,28051,28067,28078,28085,28104,28110,28139,28143,28155,28168,28172,28177,28181,28186,28190,28204,28209,28213,28229,28250,28264,28274,28287,28297,28313,28327,28343,28353,28359,28378,28384,28412,28416,28428,28441,28445,28450,28454,28459,28463,28477,28481,28485,28493,28533,28571,28575,28579,28595,28615,28625,28639,28649,28662,28672,28688,28698,28704,28732,28736,28748,28761,28765,28770,28774,28779,28783,28835,28857,28861,28877,28895,28909,28919,28932,28942,28958,28968,28974,29002,29006,29019,29023,29028,29032,29037,29041,29045,29067,29071,29083,29092,29104,29116,29129,29133,29138,29148,29152,29164,29173,29206,29210,29218,29232,29256,29272,29276,29280,29314,29330,29345,29367,29371,29376,29395,29405,29440,29444,29460,29474,29518,29522,29528,29540,29548,29560,29592,29598,29602,29614,29627,29631,29636,29640,29645,29649,29663,29667,29671,29676,29699,29708,29712,29738,29764,29802,29806,29824,29828,29832,29840,29858,29873,29885,29923,29941,29959,29999,30015,30019,30023,30027,30043,30054,30064,30078,30088,30101,30111,30127,30141,30167,30177,30183,30212,30216,30228,30241,30245,30250,30254,30259,30263,30277,30281,30285,30301,30322,30336,30346,30359,30369,30385,30395,30401,30429,30433,30445,30458,30462,30467,30471,30476,30480,30494,30498,30502,30524,30528,30544,30561,30575,30585,30598,30608,30624,30634,30640,30668,30672,30677,30693,30734,30738,30743,30747,30752,30757,30761,30769,30805,30824,30861,30865,30880,30900,30904,30909,30913,30918,30922,30943,30973,30977,30992,31011,31015,31020,31024,31029,31033,31052,31092],{"__ignoreMap":1202},[1207,26918,26919],{"class":1209,"line":1210},[1207,26920,26921],{"class":1213},"# tests/load/locustfile.py\n",[1207,26923,26924,26926,26929,26931,26934,26936,26939,26941,26944,26946],{"class":1209,"line":1217},[1207,26925,1626],{"class":1616},[1207,26927,26928],{"class":1620}," locust ",[1207,26930,1617],{"class":1616},[1207,26932,26933],{"class":1620}," HttpUser",[1207,26935,1644],{"class":1632},[1207,26937,26938],{"class":1620}," task",[1207,26940,1644],{"class":1632},[1207,26942,26943],{"class":1620}," between",[1207,26945,1644],{"class":1632},[1207,26947,26948],{"class":1620}," events\n",[1207,26950,26951,26953],{"class":1209,"line":1238},[1207,26952,1617],{"class":1616},[1207,26954,6574],{"class":1620},[1207,26956,26957,26959],{"class":1209,"line":1254},[1207,26958,1617],{"class":1616},[1207,26960,26961],{"class":1620}," random\n",[1207,26963,26964,26966],{"class":1209,"line":1270},[1207,26965,1617],{"class":1616},[1207,26967,26968],{"class":1620}," logging\n",[1207,26970,26971],{"class":1209,"line":1535},[1207,26972,1527],{"emptyLinePlaceholder":1526},[1207,26974,26975],{"class":1209,"line":1710},[1207,26976,26977],{"class":1213},"# Set up logging\n",[1207,26979,26980,26983,26985,26988,26990,26993,26995,26997,26999,27002],{"class":1209,"line":1727},[1207,26981,26982],{"class":1620},"logging",[1207,26984,1633],{"class":1632},[1207,26986,26987],{"class":1862},"basicConfig",[1207,26989,1811],{"class":1632},[1207,26991,26992],{"class":1957},"level",[1207,26994,1961],{"class":1632},[1207,26996,26982],{"class":1862},[1207,26998,1633],{"class":1632},[1207,27000,27001],{"class":7008},"INFO",[1207,27003,2136],{"class":1632},[1207,27005,27006,27009,27011,27014,27016,27019,27021,27025],{"class":1209,"line":1732},[1207,27007,27008],{"class":1620},"logger ",[1207,27010,1961],{"class":1632},[1207,27012,27013],{"class":1620}," logging",[1207,27015,1633],{"class":1632},[1207,27017,27018],{"class":1862},"getLogger",[1207,27020,1811],{"class":1632},[1207,27022,27024],{"class":27023},"s131V","__name__",[1207,27026,2136],{"class":1632},[1207,27028,27029],{"class":1209,"line":1746},[1207,27030,1527],{"emptyLinePlaceholder":1526},[1207,27032,27033,27035,27038,27040,27043],{"class":1209,"line":1753},[1207,27034,1736],{"class":1735},[1207,27036,27037],{"class":1739}," UserServiceLoadTest",[1207,27039,1811],{"class":1632},[1207,27041,27042],{"class":1220},"HttpUser",[1207,27044,1818],{"class":1632},[1207,27046,27047],{"class":1209,"line":1760},[1207,27048,1750],{"class":1749},[1207,27050,27051],{"class":1209,"line":1766},[1207,27052,27053],{"class":1756},"    Load test for User Service\n",[1207,27055,27056],{"class":1209,"line":1772},[1207,27057,1763],{"class":1756},[1207,27059,27060],{"class":1209,"line":1778},[1207,27061,27062],{"class":1756},"    This class simulates user behavior for the User Service.\n",[1207,27064,27065],{"class":1209,"line":1783},[1207,27066,27067],{"class":1756},"    Each instance represents a virtual user performing various operations.\n",[1207,27069,27070],{"class":1209,"line":1788},[1207,27071,1750],{"class":1749},[1207,27073,27074],{"class":1209,"line":1803},[1207,27075,1763],{"class":1620},[1207,27077,27078],{"class":1209,"line":1821},[1207,27079,27080],{"class":1213},"    # Wait time between tasks (simulates user think time)\n",[1207,27082,27083,27086,27088,27090,27092,27094,27096,27098,27100],{"class":1209,"line":1827},[1207,27084,27085],{"class":1620},"    wait_time ",[1207,27087,1961],{"class":1632},[1207,27089,26943],{"class":1862},[1207,27091,1811],{"class":1632},[1207,27093,2998],{"class":1231},[1207,27095,1644],{"class":1632},[1207,27097,14496],{"class":1231},[1207,27099,2328],{"class":1632},[1207,27101,27102],{"class":1213},"  # Wait 1-3 seconds between requests\n",[1207,27104,27105],{"class":1209,"line":1833},[1207,27106,1763],{"class":1620},[1207,27108,27109,27111,27114,27116,27118],{"class":1209,"line":1839},[1207,27110,1806],{"class":1735},[1207,27112,27113],{"class":1794}," on_start",[1207,27115,1811],{"class":1632},[1207,27117,1815],{"class":1814},[1207,27119,1818],{"class":1632},[1207,27121,27122],{"class":1209,"line":1845},[1207,27123,1824],{"class":1749},[1207,27125,27126],{"class":1209,"line":1851},[1207,27127,27128],{"class":1756},"        Called when a simulated user starts\n",[1207,27130,27131],{"class":1209,"line":1856},[1207,27132,1836],{"class":1756},[1207,27134,27135],{"class":1209,"line":1869},[1207,27136,27137],{"class":1756},"        This method runs once per user when they start their session.\n",[1207,27139,27140],{"class":1209,"line":1874},[1207,27141,27142],{"class":1756},"        Use it to set up any user-specific data or perform login.\n",[1207,27144,27145],{"class":1209,"line":1885},[1207,27146,1824],{"class":1749},[1207,27148,27149,27152,27154,27156,27158],{"class":1209,"line":1899},[1207,27150,27151],{"class":13428},"        self",[1207,27153,1633],{"class":1632},[1207,27155,21625],{"class":1942},[1207,27157,2775],{"class":1632},[1207,27159,3856],{"class":2813},[1207,27161,27162,27164,27166,27168,27170],{"class":1209,"line":1904},[1207,27163,27151],{"class":13428},[1207,27165,1633],{"class":1632},[1207,27167,21882],{"class":1942},[1207,27169,2775],{"class":1632},[1207,27171,3856],{"class":2813},[1207,27173,27174],{"class":1209,"line":1910},[1207,27175,1836],{"class":1620},[1207,27177,27178],{"class":1209,"line":1915},[1207,27179,27180],{"class":1213},"        # Create a user and authenticate\n",[1207,27182,27183,27185,27187,27190],{"class":1209,"line":1921},[1207,27184,27151],{"class":13428},[1207,27186,1633],{"class":1632},[1207,27188,27189],{"class":1862},"create_and_authenticate_user",[1207,27191,1866],{"class":1632},[1207,27193,27194],{"class":1209,"line":1927},[1207,27195,1763],{"class":1620},[1207,27197,27198,27200,27203,27205,27207],{"class":1209,"line":1932},[1207,27199,1806],{"class":1735},[1207,27201,27202],{"class":1794}," create_and_authenticate_user",[1207,27204,1811],{"class":1632},[1207,27206,1815],{"class":1814},[1207,27208,1818],{"class":1632},[1207,27210,27211,27213,27216],{"class":1209,"line":1954},[1207,27212,6843],{"class":1749},[1207,27214,27215],{"class":1756},"Create a user and get authentication token",[1207,27217,6849],{"class":1749},[1207,27219,27220],{"class":1209,"line":1976},[1207,27221,27222],{"class":1213},"        # Generate unique username\n",[1207,27224,27225,27228,27230,27232,27235,27237,27240,27242,27245,27247,27249,27251,27254,27256,27258],{"class":1209,"line":1993},[1207,27226,27227],{"class":1620},"        username ",[1207,27229,1961],{"class":1632},[1207,27231,3281],{"class":1735},[1207,27233,27234],{"class":1224},"'loadtest_user_",[1207,27236,3288],{"class":3287},[1207,27238,27239],{"class":1620},"random",[1207,27241,1633],{"class":1632},[1207,27243,27244],{"class":1862},"randint",[1207,27246,1811],{"class":1632},[1207,27248,19428],{"class":1231},[1207,27250,1644],{"class":1632},[1207,27252,27253],{"class":1231}," 999999",[1207,27255,2328],{"class":1632},[1207,27257,3294],{"class":3287},[1207,27259,2006],{"class":1224},[1207,27261,27262],{"class":1209,"line":2009},[1207,27263,1836],{"class":1620},[1207,27265,27266],{"class":1209,"line":2015},[1207,27267,27268],{"class":1213},"        # Create user\n",[1207,27270,27271,27273,27275],{"class":1209,"line":2020},[1207,27272,2440],{"class":1620},[1207,27274,1961],{"class":1632},[1207,27276,2445],{"class":1632},[1207,27278,27279,27281,27283,27285,27287,27290],{"class":1209,"line":2037},[1207,27280,2451],{"class":1964},[1207,27282,2183],{"class":1224},[1207,27284,1965],{"class":1964},[1207,27286,2458],{"class":1632},[1207,27288,27289],{"class":1620}," username",[1207,27291,1973],{"class":1632},[1207,27293,27294,27296,27298,27300,27302,27304,27306,27308,27310,27312,27314],{"class":1209,"line":2060},[1207,27295,2451],{"class":1964},[1207,27297,2204],{"class":1224},[1207,27299,1965],{"class":1964},[1207,27301,2458],{"class":1632},[1207,27303,3281],{"class":1735},[1207,27305,1965],{"class":1224},[1207,27307,3288],{"class":3287},[1207,27309,2183],{"class":1620},[1207,27311,3294],{"class":3287},[1207,27313,5719],{"class":1224},[1207,27315,1973],{"class":1632},[1207,27317,27318,27320,27322,27324,27326,27328,27330,27332],{"class":1209,"line":2065},[1207,27319,2451],{"class":1964},[1207,27321,2495],{"class":1224},[1207,27323,1965],{"class":1964},[1207,27325,2458],{"class":1632},[1207,27327,2188],{"class":1964},[1207,27329,2003],{"class":1224},[1207,27331,1965],{"class":1964},[1207,27333,1973],{"class":1632},[1207,27335,27336,27338,27340,27342,27344,27346,27349,27351],{"class":1209,"line":2071},[1207,27337,2451],{"class":1964},[1207,27339,2516],{"class":1224},[1207,27341,1965],{"class":1964},[1207,27343,2458],{"class":1632},[1207,27345,2188],{"class":1964},[1207,27347,27348],{"class":1224},"Load",[1207,27350,1965],{"class":1964},[1207,27352,1973],{"class":1632},[1207,27354,27355,27357,27359,27361,27363,27365,27367],{"class":1209,"line":2076},[1207,27356,2451],{"class":1964},[1207,27358,2537],{"class":1224},[1207,27360,1965],{"class":1964},[1207,27362,2458],{"class":1632},[1207,27364,2188],{"class":1964},[1207,27366,9849],{"class":1224},[1207,27368,2006],{"class":1964},[1207,27370,27371],{"class":1209,"line":2082},[1207,27372,2554],{"class":1632},[1207,27374,27375],{"class":1209,"line":2088},[1207,27376,1836],{"class":1620},[1207,27378,27379,27381,27384,27386,27389,27391,27393],{"class":1209,"line":2094},[1207,27380,2295],{"class":1616},[1207,27382,27383],{"class":13428}," self",[1207,27385,1633],{"class":1632},[1207,27387,27388],{"class":1942},"client",[1207,27390,1633],{"class":1632},[1207,27392,7368],{"class":1862},[1207,27394,1951],{"class":1632},[1207,27396,27397,27399,27401,27403],{"class":1209,"line":2100},[1207,27398,2451],{"class":1964},[1207,27400,10693],{"class":1224},[1207,27402,1965],{"class":1964},[1207,27404,1973],{"class":1632},[1207,27406,27407,27409,27411,27413],{"class":1209,"line":2105},[1207,27408,13896],{"class":1957},[1207,27410,1961],{"class":1632},[1207,27412,2583],{"class":1862},[1207,27414,1973],{"class":1632},[1207,27416,27417,27420,27422,27424],{"class":1209,"line":2111},[1207,27418,27419],{"class":1957},"            catch_response",[1207,27421,1961],{"class":1632},[1207,27423,9899],{"class":2813},[1207,27425,1973],{"class":1632},[1207,27427,27428,27431,27433,27435,27438],{"class":1209,"line":2139},[1207,27429,27430],{"class":1957},"            name",[1207,27432,1961],{"class":1632},[1207,27434,3297],{"class":1964},[1207,27436,27437],{"class":1224},"Create User",[1207,27439,11115],{"class":1964},[1207,27441,27442,27445,27447,27449],{"class":1209,"line":2144},[1207,27443,27444],{"class":1632},"        )",[1207,27446,13173],{"class":1616},[1207,27448,6994],{"class":1620},[1207,27450,1743],{"class":1632},[1207,27452,27453,27455,27457,27459,27461,27463,27465],{"class":1209,"line":2150},[1207,27454,14547],{"class":1616},[1207,27456,6994],{"class":1620},[1207,27458,1633],{"class":1632},[1207,27460,2772],{"class":1942},[1207,27462,2164],{"class":2163},[1207,27464,21552],{"class":1231},[1207,27466,1743],{"class":1632},[1207,27468,27469,27471,27473,27475,27477,27479],{"class":1209,"line":2174},[1207,27470,19817],{"class":1620},[1207,27472,1961],{"class":1632},[1207,27474,6994],{"class":1620},[1207,27476,1633],{"class":1632},[1207,27478,2792],{"class":1862},[1207,27480,1866],{"class":1632},[1207,27482,27483,27486,27488,27490,27492,27494,27496,27498,27500,27502],{"class":1209,"line":2195},[1207,27484,27485],{"class":13428},"                self",[1207,27487,1633],{"class":1632},[1207,27489,21625],{"class":1942},[1207,27491,2775],{"class":1632},[1207,27493,2604],{"class":1620},[1207,27495,2989],{"class":1632},[1207,27497,1965],{"class":1964},[1207,27499,2133],{"class":1224},[1207,27501,1965],{"class":1964},[1207,27503,13328],{"class":1632},[1207,27505,27506,27509,27511,27513],{"class":1209,"line":2215},[1207,27507,27508],{"class":1620},"                response",[1207,27510,1633],{"class":1632},[1207,27512,2806],{"class":1862},[1207,27514,1866],{"class":1632},[1207,27516,27517,27520],{"class":1209,"line":2220},[1207,27518,27519],{"class":1616},"            else",[1207,27521,1743],{"class":1632},[1207,27523,27524,27526,27528,27530,27532,27534,27537,27539,27541,27543,27545,27547,27549],{"class":1209,"line":2235},[1207,27525,27508],{"class":1620},[1207,27527,1633],{"class":1632},[1207,27529,25311],{"class":1862},[1207,27531,1811],{"class":1632},[1207,27533,12545],{"class":1735},[1207,27535,27536],{"class":1224},"\"Failed to create user: ",[1207,27538,3288],{"class":3287},[1207,27540,11684],{"class":1862},[1207,27542,1633],{"class":1632},[1207,27544,3552],{"class":1942},[1207,27546,3294],{"class":3287},[1207,27548,3297],{"class":1224},[1207,27550,2136],{"class":1632},[1207,27552,27553],{"class":1209,"line":2253},[1207,27554,27555],{"class":1616},"                return\n",[1207,27557,27558],{"class":1209,"line":2258},[1207,27559,1836],{"class":1620},[1207,27561,27562],{"class":1209,"line":2264},[1207,27563,27564],{"class":1213},"        # Authenticate\n",[1207,27566,27567,27569,27571],{"class":1209,"line":2269},[1207,27568,21781],{"class":1620},[1207,27570,1961],{"class":1632},[1207,27572,2445],{"class":1632},[1207,27574,27575,27577,27579,27581,27583,27585],{"class":1209,"line":2275},[1207,27576,2451],{"class":1964},[1207,27578,2183],{"class":1224},[1207,27580,1965],{"class":1964},[1207,27582,2458],{"class":1632},[1207,27584,27289],{"class":1620},[1207,27586,1973],{"class":1632},[1207,27588,27589,27591,27593,27595,27597,27599,27601],{"class":1209,"line":2281},[1207,27590,2451],{"class":1964},[1207,27592,2495],{"class":1224},[1207,27594,1965],{"class":1964},[1207,27596,2458],{"class":1632},[1207,27598,2188],{"class":1964},[1207,27600,2003],{"class":1224},[1207,27602,2006],{"class":1964},[1207,27604,27605],{"class":1209,"line":2286},[1207,27606,2554],{"class":1632},[1207,27608,27609],{"class":1209,"line":2292},[1207,27610,1836],{"class":1620},[1207,27612,27613,27615,27617,27619,27621,27623,27625],{"class":1209,"line":2313},[1207,27614,2295],{"class":1616},[1207,27616,27383],{"class":13428},[1207,27618,1633],{"class":1632},[1207,27620,27388],{"class":1942},[1207,27622,1633],{"class":1632},[1207,27624,7368],{"class":1862},[1207,27626,1951],{"class":1632},[1207,27628,27629,27631,27634,27636],{"class":1209,"line":2334},[1207,27630,2451],{"class":1964},[1207,27632,27633],{"class":1224},"/api/auth/login/",[1207,27635,1965],{"class":1964},[1207,27637,1973],{"class":1632},[1207,27639,27640,27642,27644,27647],{"class":1209,"line":2339},[1207,27641,13896],{"class":1957},[1207,27643,1961],{"class":1632},[1207,27645,27646],{"class":1862},"auth_data",[1207,27648,1973],{"class":1632},[1207,27650,27651,27653,27655,27657],{"class":1209,"line":2358},[1207,27652,27419],{"class":1957},[1207,27654,1961],{"class":1632},[1207,27656,9899],{"class":2813},[1207,27658,1973],{"class":1632},[1207,27660,27661,27663,27665,27667,27670],{"class":1209,"line":2381},[1207,27662,27430],{"class":1957},[1207,27664,1961],{"class":1632},[1207,27666,3297],{"class":1964},[1207,27668,27669],{"class":1224},"Login",[1207,27671,11115],{"class":1964},[1207,27673,27674,27676,27678,27680],{"class":1209,"line":2386},[1207,27675,27444],{"class":1632},[1207,27677,13173],{"class":1616},[1207,27679,6994],{"class":1620},[1207,27681,1743],{"class":1632},[1207,27683,27684,27686,27688,27690,27692,27694,27696],{"class":1209,"line":2392},[1207,27685,14547],{"class":1616},[1207,27687,6994],{"class":1620},[1207,27689,1633],{"class":1632},[1207,27691,2772],{"class":1942},[1207,27693,2164],{"class":2163},[1207,27695,21109],{"class":1231},[1207,27697,1743],{"class":1632},[1207,27699,27700,27703,27705,27707,27709,27711],{"class":1209,"line":2397},[1207,27701,27702],{"class":1620},"                auth ",[1207,27704,1961],{"class":1632},[1207,27706,6994],{"class":1620},[1207,27708,1633],{"class":1632},[1207,27710,2792],{"class":1862},[1207,27712,1866],{"class":1632},[1207,27714,27715,27717,27719,27721,27723,27726,27728,27730,27732,27734,27736,27738,27740,27742,27744,27746,27748,27750,27752,27754,27756],{"class":1209,"line":2403},[1207,27716,27485],{"class":13428},[1207,27718,1633],{"class":1632},[1207,27720,21882],{"class":1942},[1207,27722,2775],{"class":1632},[1207,27724,27725],{"class":1620}," auth",[1207,27727,1633],{"class":1632},[1207,27729,5111],{"class":1862},[1207,27731,1811],{"class":1632},[1207,27733,1965],{"class":1964},[1207,27735,16193],{"class":1224},[1207,27737,1965],{"class":1964},[1207,27739,2328],{"class":1632},[1207,27741,21818],{"class":2163},[1207,27743,27725],{"class":1620},[1207,27745,1633],{"class":1632},[1207,27747,5111],{"class":1862},[1207,27749,1811],{"class":1632},[1207,27751,1965],{"class":1964},[1207,27753,16208],{"class":1224},[1207,27755,1965],{"class":1964},[1207,27757,2136],{"class":1632},[1207,27759,27760,27762,27764,27766],{"class":1209,"line":2409},[1207,27761,27508],{"class":1620},[1207,27763,1633],{"class":1632},[1207,27765,2806],{"class":1862},[1207,27767,1866],{"class":1632},[1207,27769,27770,27772],{"class":1209,"line":2414},[1207,27771,27519],{"class":1616},[1207,27773,1743],{"class":1632},[1207,27775,27776,27778,27780,27782,27784,27786,27789,27791,27793,27795,27797,27799,27801],{"class":1209,"line":2420},[1207,27777,27508],{"class":1620},[1207,27779,1633],{"class":1632},[1207,27781,25311],{"class":1862},[1207,27783,1811],{"class":1632},[1207,27785,12545],{"class":1735},[1207,27787,27788],{"class":1224},"\"Failed to authenticate: ",[1207,27790,3288],{"class":3287},[1207,27792,11684],{"class":1862},[1207,27794,1633],{"class":1632},[1207,27796,3552],{"class":1942},[1207,27798,3294],{"class":3287},[1207,27800,3297],{"class":1224},[1207,27802,2136],{"class":1632},[1207,27804,27805],{"class":1209,"line":2426},[1207,27806,1763],{"class":1620},[1207,27808,27809,27811],{"class":1209,"line":2431},[1207,27810,1791],{"class":1632},[1207,27812,27813],{"class":4020},"property\n",[1207,27815,27816,27818,27821,27823,27825],{"class":1209,"line":2437},[1207,27817,1806],{"class":1735},[1207,27819,27820],{"class":1794}," headers",[1207,27822,1811],{"class":1632},[1207,27824,1815],{"class":1814},[1207,27826,1818],{"class":1632},[1207,27828,27829,27831,27834],{"class":1209,"line":2448},[1207,27830,6843],{"class":1749},[1207,27832,27833],{"class":1756},"Get authentication headers",[1207,27835,6849],{"class":1749},[1207,27837,27838,27840,27842,27844,27846],{"class":1209,"line":2470},[1207,27839,13065],{"class":1616},[1207,27841,27383],{"class":13428},[1207,27843,1633],{"class":1632},[1207,27845,21882],{"class":1942},[1207,27847,1743],{"class":1632},[1207,27849,27850,27852,27854,27856,27858,27860,27862,27864,27866,27868,27870,27872,27874,27876,27878],{"class":1209,"line":2490},[1207,27851,13086],{"class":1616},[1207,27853,2801],{"class":1632},[1207,27855,1965],{"class":1964},[1207,27857,21868],{"class":1224},[1207,27859,1965],{"class":1964},[1207,27861,2458],{"class":1632},[1207,27863,3281],{"class":1735},[1207,27865,21877],{"class":1224},[1207,27867,3288],{"class":3287},[1207,27869,1815],{"class":13428},[1207,27871,1633],{"class":1632},[1207,27873,21882],{"class":1942},[1207,27875,3294],{"class":3287},[1207,27877,1965],{"class":1224},[1207,27879,2817],{"class":1632},[1207,27881,27882,27884],{"class":1209,"line":2511},[1207,27883,1859],{"class":1616},[1207,27885,27886],{"class":1632}," {}\n",[1207,27888,27889],{"class":1209,"line":2532},[1207,27890,1763],{"class":1620},[1207,27892,27893,27895,27898,27900,27902,27904],{"class":1209,"line":2551},[1207,27894,1791],{"class":1632},[1207,27896,27897],{"class":1794},"task",[1207,27899,1811],{"class":1632},[1207,27901,4561],{"class":1231},[1207,27903,2328],{"class":1632},[1207,27905,27906],{"class":1213},"  # Weight: 5 (runs 5x more often than weight 1 tasks)\n",[1207,27908,27909,27911,27914,27916,27918],{"class":1209,"line":2557},[1207,27910,1806],{"class":1735},[1207,27912,27913],{"class":1794}," get_user_list",[1207,27915,1811],{"class":1632},[1207,27917,1815],{"class":1814},[1207,27919,1818],{"class":1632},[1207,27921,27922],{"class":1209,"line":2562},[1207,27923,1824],{"class":1749},[1207,27925,27926],{"class":1209,"line":2567},[1207,27927,27928],{"class":1756},"        Test user list endpoint\n",[1207,27930,27931],{"class":1209,"line":2588},[1207,27932,1836],{"class":1756},[1207,27934,27935],{"class":1209,"line":2593},[1207,27936,27937],{"class":1756},"        This simulates users browsing the user list.\n",[1207,27939,27940],{"class":1209,"line":2599},[1207,27941,27942],{"class":1756},"        The @task decorator with weight 5 means this runs more frequently.\n",[1207,27944,27945],{"class":1209,"line":2619},[1207,27946,1824],{"class":1749},[1207,27948,27949,27951,27953,27955,27957,27959,27961],{"class":1209,"line":2624},[1207,27950,2295],{"class":1616},[1207,27952,27383],{"class":13428},[1207,27954,1633],{"class":1632},[1207,27956,27388],{"class":1942},[1207,27958,1633],{"class":1632},[1207,27960,5111],{"class":1862},[1207,27962,1951],{"class":1632},[1207,27964,27965,27967,27969,27971],{"class":1209,"line":2630},[1207,27966,2451],{"class":1964},[1207,27968,10693],{"class":1224},[1207,27970,1965],{"class":1964},[1207,27972,1973],{"class":1632},[1207,27974,27975,27977,27979,27981,27983,27985],{"class":1209,"line":2652},[1207,27976,21958],{"class":1957},[1207,27978,1961],{"class":1632},[1207,27980,1815],{"class":13428},[1207,27982,1633],{"class":1632},[1207,27984,21963],{"class":1942},[1207,27986,1973],{"class":1632},[1207,27988,27989,27991,27993,27995],{"class":1209,"line":2657},[1207,27990,27419],{"class":1957},[1207,27992,1961],{"class":1632},[1207,27994,9899],{"class":2813},[1207,27996,1973],{"class":1632},[1207,27998,27999,28001,28003,28005,28008],{"class":1209,"line":2675},[1207,28000,27430],{"class":1957},[1207,28002,1961],{"class":1632},[1207,28004,3297],{"class":1964},[1207,28006,28007],{"class":1224},"Get User List",[1207,28009,11115],{"class":1964},[1207,28011,28012,28014,28016,28018],{"class":1209,"line":2702},[1207,28013,27444],{"class":1632},[1207,28015,13173],{"class":1616},[1207,28017,6994],{"class":1620},[1207,28019,1743],{"class":1632},[1207,28021,28022,28024,28026,28028,28030,28032,28034],{"class":1209,"line":2707},[1207,28023,14547],{"class":1616},[1207,28025,6994],{"class":1620},[1207,28027,1633],{"class":1632},[1207,28029,2772],{"class":1942},[1207,28031,2164],{"class":2163},[1207,28033,21109],{"class":1231},[1207,28035,1743],{"class":1632},[1207,28037,28038,28041,28043,28045,28047,28049],{"class":1209,"line":2713},[1207,28039,28040],{"class":1620},"                data ",[1207,28042,1961],{"class":1632},[1207,28044,6994],{"class":1620},[1207,28046,1633],{"class":1632},[1207,28048,2792],{"class":1862},[1207,28050,1866],{"class":1632},[1207,28052,28053,28055,28057,28059,28061,28063,28065],{"class":1209,"line":2718},[1207,28054,21098],{"class":1616},[1207,28056,2188],{"class":1964},[1207,28058,7042],{"class":1224},[1207,28060,1965],{"class":1964},[1207,28062,2983],{"class":2163},[1207,28064,7100],{"class":1620},[1207,28066,1743],{"class":1632},[1207,28068,28069,28072,28074,28076],{"class":1209,"line":2724},[1207,28070,28071],{"class":1620},"                    response",[1207,28073,1633],{"class":1632},[1207,28075,2806],{"class":1862},[1207,28077,1866],{"class":1632},[1207,28079,28080,28083],{"class":1209,"line":2730},[1207,28081,28082],{"class":1616},"                else",[1207,28084,1743],{"class":1632},[1207,28086,28087,28089,28091,28093,28095,28097,28100,28102],{"class":1209,"line":2736},[1207,28088,28071],{"class":1620},[1207,28090,1633],{"class":1632},[1207,28092,25311],{"class":1862},[1207,28094,1811],{"class":1632},[1207,28096,3297],{"class":1964},[1207,28098,28099],{"class":1224},"Invalid response format",[1207,28101,3297],{"class":1964},[1207,28103,2136],{"class":1632},[1207,28105,28106,28108],{"class":1209,"line":2742},[1207,28107,27519],{"class":1616},[1207,28109,1743],{"class":1632},[1207,28111,28112,28114,28116,28118,28120,28122,28125,28127,28129,28131,28133,28135,28137],{"class":1209,"line":2748},[1207,28113,27508],{"class":1620},[1207,28115,1633],{"class":1632},[1207,28117,25311],{"class":1862},[1207,28119,1811],{"class":1632},[1207,28121,12545],{"class":1735},[1207,28123,28124],{"class":1224},"\"Status code: ",[1207,28126,3288],{"class":3287},[1207,28128,11684],{"class":1862},[1207,28130,1633],{"class":1632},[1207,28132,2772],{"class":1942},[1207,28134,3294],{"class":3287},[1207,28136,3297],{"class":1224},[1207,28138,2136],{"class":1632},[1207,28140,28141],{"class":1209,"line":2753},[1207,28142,1763],{"class":1620},[1207,28144,28145,28147,28149,28151,28153],{"class":1209,"line":2759},[1207,28146,1791],{"class":1632},[1207,28148,27897],{"class":1794},[1207,28150,1811],{"class":1632},[1207,28152,6934],{"class":1231},[1207,28154,2136],{"class":1632},[1207,28156,28157,28159,28162,28164,28166],{"class":1209,"line":2781},[1207,28158,1806],{"class":1735},[1207,28160,28161],{"class":1794}," get_user_detail",[1207,28163,1811],{"class":1632},[1207,28165,1815],{"class":1814},[1207,28167,1818],{"class":1632},[1207,28169,28170],{"class":1209,"line":2820},[1207,28171,1824],{"class":1749},[1207,28173,28174],{"class":1209,"line":2825},[1207,28175,28176],{"class":1756},"        Test user detail endpoint\n",[1207,28178,28179],{"class":1209,"line":2830},[1207,28180,1836],{"class":1756},[1207,28182,28183],{"class":1209,"line":2846},[1207,28184,28185],{"class":1756},"        This simulates users viewing profile details.\n",[1207,28187,28188],{"class":1209,"line":2861},[1207,28189,1824],{"class":1749},[1207,28191,28192,28194,28196,28198,28200,28202],{"class":1209,"line":2884},[1207,28193,13065],{"class":1616},[1207,28195,3853],{"class":2163},[1207,28197,27383],{"class":13428},[1207,28199,1633],{"class":1632},[1207,28201,21625],{"class":1942},[1207,28203,1743],{"class":1632},[1207,28205,28206],{"class":1209,"line":2889},[1207,28207,28208],{"class":1616},"            return\n",[1207,28210,28211],{"class":1209,"line":2894},[1207,28212,1836],{"class":1620},[1207,28214,28215,28217,28219,28221,28223,28225,28227],{"class":1209,"line":2900},[1207,28216,2295],{"class":1616},[1207,28218,27383],{"class":13428},[1207,28220,1633],{"class":1632},[1207,28222,27388],{"class":1942},[1207,28224,1633],{"class":1632},[1207,28226,5111],{"class":1862},[1207,28228,1951],{"class":1632},[1207,28230,28231,28233,28236,28238,28240,28242,28244,28246,28248],{"class":1209,"line":2914},[1207,28232,23109],{"class":1735},[1207,28234,28235],{"class":1224},"'/api/users/",[1207,28237,3288],{"class":3287},[1207,28239,1815],{"class":13428},[1207,28241,1633],{"class":1632},[1207,28243,21625],{"class":1942},[1207,28245,3294],{"class":3287},[1207,28247,23121],{"class":1224},[1207,28249,1973],{"class":1632},[1207,28251,28252,28254,28256,28258,28260,28262],{"class":1209,"line":2919},[1207,28253,21958],{"class":1957},[1207,28255,1961],{"class":1632},[1207,28257,1815],{"class":13428},[1207,28259,1633],{"class":1632},[1207,28261,21963],{"class":1942},[1207,28263,1973],{"class":1632},[1207,28265,28266,28268,28270,28272],{"class":1209,"line":2925},[1207,28267,27419],{"class":1957},[1207,28269,1961],{"class":1632},[1207,28271,9899],{"class":2813},[1207,28273,1973],{"class":1632},[1207,28275,28276,28278,28280,28282,28285],{"class":1209,"line":2945},[1207,28277,27430],{"class":1957},[1207,28279,1961],{"class":1632},[1207,28281,3297],{"class":1964},[1207,28283,28284],{"class":1224},"Get User Detail",[1207,28286,11115],{"class":1964},[1207,28288,28289,28291,28293,28295],{"class":1209,"line":2950},[1207,28290,27444],{"class":1632},[1207,28292,13173],{"class":1616},[1207,28294,6994],{"class":1620},[1207,28296,1743],{"class":1632},[1207,28298,28299,28301,28303,28305,28307,28309,28311],{"class":1209,"line":2956},[1207,28300,14547],{"class":1616},[1207,28302,6994],{"class":1620},[1207,28304,1633],{"class":1632},[1207,28306,2772],{"class":1942},[1207,28308,2164],{"class":2163},[1207,28310,21109],{"class":1231},[1207,28312,1743],{"class":1632},[1207,28314,28315,28317,28319,28321,28323,28325],{"class":1209,"line":2971},[1207,28316,19817],{"class":1620},[1207,28318,1961],{"class":1632},[1207,28320,6994],{"class":1620},[1207,28322,1633],{"class":1632},[1207,28324,2792],{"class":1862},[1207,28326,1866],{"class":1632},[1207,28328,28329,28331,28333,28335,28337,28339,28341],{"class":1209,"line":3016},[1207,28330,21098],{"class":1616},[1207,28332,2188],{"class":1964},[1207,28334,2183],{"class":1224},[1207,28336,1965],{"class":1964},[1207,28338,2983],{"class":2163},[1207,28340,2604],{"class":1620},[1207,28342,1743],{"class":1632},[1207,28344,28345,28347,28349,28351],{"class":1209,"line":5981},[1207,28346,28071],{"class":1620},[1207,28348,1633],{"class":1632},[1207,28350,2806],{"class":1862},[1207,28352,1866],{"class":1632},[1207,28354,28355,28357],{"class":1209,"line":5987},[1207,28356,28082],{"class":1616},[1207,28358,1743],{"class":1632},[1207,28360,28361,28363,28365,28367,28369,28371,28374,28376],{"class":1209,"line":5992},[1207,28362,28071],{"class":1620},[1207,28364,1633],{"class":1632},[1207,28366,25311],{"class":1862},[1207,28368,1811],{"class":1632},[1207,28370,3297],{"class":1964},[1207,28372,28373],{"class":1224},"Invalid user data",[1207,28375,3297],{"class":1964},[1207,28377,2136],{"class":1632},[1207,28379,28380,28382],{"class":1209,"line":6003},[1207,28381,27519],{"class":1616},[1207,28383,1743],{"class":1632},[1207,28385,28386,28388,28390,28392,28394,28396,28398,28400,28402,28404,28406,28408,28410],{"class":1209,"line":6008},[1207,28387,27508],{"class":1620},[1207,28389,1633],{"class":1632},[1207,28391,25311],{"class":1862},[1207,28393,1811],{"class":1632},[1207,28395,12545],{"class":1735},[1207,28397,28124],{"class":1224},[1207,28399,3288],{"class":3287},[1207,28401,11684],{"class":1862},[1207,28403,1633],{"class":1632},[1207,28405,2772],{"class":1942},[1207,28407,3294],{"class":3287},[1207,28409,3297],{"class":1224},[1207,28411,2136],{"class":1632},[1207,28413,28414],{"class":1209,"line":6014},[1207,28415,1763],{"class":1620},[1207,28417,28418,28420,28422,28424,28426],{"class":1209,"line":6030},[1207,28419,1791],{"class":1632},[1207,28421,27897],{"class":1794},[1207,28423,1811],{"class":1632},[1207,28425,10437],{"class":1231},[1207,28427,2136],{"class":1632},[1207,28429,28430,28432,28435,28437,28439],{"class":1209,"line":6050},[1207,28431,1806],{"class":1735},[1207,28433,28434],{"class":1794}," update_user",[1207,28436,1811],{"class":1632},[1207,28438,1815],{"class":1814},[1207,28440,1818],{"class":1632},[1207,28442,28443],{"class":1209,"line":6070},[1207,28444,1824],{"class":1749},[1207,28446,28447],{"class":1209,"line":6089},[1207,28448,28449],{"class":1756},"        Test user update endpoint\n",[1207,28451,28452],{"class":1209,"line":6102},[1207,28453,1836],{"class":1756},[1207,28455,28456],{"class":1209,"line":6122},[1207,28457,28458],{"class":1756},"        This simulates users updating their profiles.\n",[1207,28460,28461],{"class":1209,"line":6140},[1207,28462,1824],{"class":1749},[1207,28464,28465,28467,28469,28471,28473,28475],{"class":1209,"line":6145},[1207,28466,13065],{"class":1616},[1207,28468,3853],{"class":2163},[1207,28470,27383],{"class":13428},[1207,28472,1633],{"class":1632},[1207,28474,21625],{"class":1942},[1207,28476,1743],{"class":1632},[1207,28478,28479],{"class":1209,"line":6151},[1207,28480,28208],{"class":1616},[1207,28482,28483],{"class":1209,"line":6156},[1207,28484,1836],{"class":1620},[1207,28486,28487,28489,28491],{"class":1209,"line":6162},[1207,28488,8100],{"class":1620},[1207,28490,1961],{"class":1632},[1207,28492,2445],{"class":1632},[1207,28494,28495,28497,28499,28501,28503,28505,28508,28510,28512,28514,28516,28518,28520,28522,28525,28527,28529,28531],{"class":1209,"line":6189},[1207,28496,2451],{"class":1964},[1207,28498,2516],{"class":1224},[1207,28500,1965],{"class":1964},[1207,28502,2458],{"class":1632},[1207,28504,3281],{"class":1735},[1207,28506,28507],{"class":1224},"'Updated_",[1207,28509,3288],{"class":3287},[1207,28511,27239],{"class":1620},[1207,28513,1633],{"class":1632},[1207,28515,27244],{"class":1862},[1207,28517,1811],{"class":1632},[1207,28519,11222],{"class":1231},[1207,28521,1644],{"class":1632},[1207,28523,28524],{"class":1231}," 999",[1207,28526,2328],{"class":1632},[1207,28528,3294],{"class":3287},[1207,28530,1965],{"class":1224},[1207,28532,1973],{"class":1632},[1207,28534,28535,28537,28539,28541,28543,28545,28548,28550,28552,28554,28556,28558,28560,28562,28565,28567,28569],{"class":1209,"line":6208},[1207,28536,2451],{"class":1964},[1207,28538,3867],{"class":1224},[1207,28540,1965],{"class":1964},[1207,28542,2458],{"class":1632},[1207,28544,3281],{"class":1735},[1207,28546,28547],{"class":1224},"'Updated bio at ",[1207,28549,3288],{"class":3287},[1207,28551,27239],{"class":1620},[1207,28553,1633],{"class":1632},[1207,28555,27244],{"class":1862},[1207,28557,1811],{"class":1632},[1207,28559,19428],{"class":1231},[1207,28561,1644],{"class":1632},[1207,28563,28564],{"class":1231}," 9999",[1207,28566,2328],{"class":1632},[1207,28568,3294],{"class":3287},[1207,28570,2006],{"class":1224},[1207,28572,28573],{"class":1209,"line":6228},[1207,28574,2554],{"class":1632},[1207,28576,28577],{"class":1209,"line":6241},[1207,28578,1836],{"class":1620},[1207,28580,28581,28583,28585,28587,28589,28591,28593],{"class":1209,"line":6261},[1207,28582,2295],{"class":1616},[1207,28584,27383],{"class":13428},[1207,28586,1633],{"class":1632},[1207,28588,27388],{"class":1942},[1207,28590,1633],{"class":1632},[1207,28592,2344],{"class":1862},[1207,28594,1951],{"class":1632},[1207,28596,28597,28599,28601,28603,28605,28607,28609,28611,28613],{"class":1209,"line":6279},[1207,28598,23109],{"class":1735},[1207,28600,28235],{"class":1224},[1207,28602,3288],{"class":3287},[1207,28604,1815],{"class":13428},[1207,28606,1633],{"class":1632},[1207,28608,21625],{"class":1942},[1207,28610,3294],{"class":3287},[1207,28612,23121],{"class":1224},[1207,28614,1973],{"class":1632},[1207,28616,28617,28619,28621,28623],{"class":1209,"line":6284},[1207,28618,13896],{"class":1957},[1207,28620,1961],{"class":1632},[1207,28622,8221],{"class":1862},[1207,28624,1973],{"class":1632},[1207,28626,28627,28629,28631,28633,28635,28637],{"class":1209,"line":6289},[1207,28628,21958],{"class":1957},[1207,28630,1961],{"class":1632},[1207,28632,1815],{"class":13428},[1207,28634,1633],{"class":1632},[1207,28636,21963],{"class":1942},[1207,28638,1973],{"class":1632},[1207,28640,28641,28643,28645,28647],{"class":1209,"line":6294},[1207,28642,27419],{"class":1957},[1207,28644,1961],{"class":1632},[1207,28646,9899],{"class":2813},[1207,28648,1973],{"class":1632},[1207,28650,28651,28653,28655,28657,28660],{"class":1209,"line":6300},[1207,28652,27430],{"class":1957},[1207,28654,1961],{"class":1632},[1207,28656,3297],{"class":1964},[1207,28658,28659],{"class":1224},"Update User",[1207,28661,11115],{"class":1964},[1207,28663,28664,28666,28668,28670],{"class":1209,"line":6320},[1207,28665,27444],{"class":1632},[1207,28667,13173],{"class":1616},[1207,28669,6994],{"class":1620},[1207,28671,1743],{"class":1632},[1207,28673,28674,28676,28678,28680,28682,28684,28686],{"class":1209,"line":6339},[1207,28675,14547],{"class":1616},[1207,28677,6994],{"class":1620},[1207,28679,1633],{"class":1632},[1207,28681,2772],{"class":1942},[1207,28683,2164],{"class":2163},[1207,28685,21109],{"class":1231},[1207,28687,1743],{"class":1632},[1207,28689,28690,28692,28694,28696],{"class":1209,"line":6344},[1207,28691,27508],{"class":1620},[1207,28693,1633],{"class":1632},[1207,28695,2806],{"class":1862},[1207,28697,1866],{"class":1632},[1207,28699,28700,28702],{"class":1209,"line":6350},[1207,28701,27519],{"class":1616},[1207,28703,1743],{"class":1632},[1207,28705,28706,28708,28710,28712,28714,28716,28718,28720,28722,28724,28726,28728,28730],{"class":1209,"line":6366},[1207,28707,27508],{"class":1620},[1207,28709,1633],{"class":1632},[1207,28711,25311],{"class":1862},[1207,28713,1811],{"class":1632},[1207,28715,12545],{"class":1735},[1207,28717,28124],{"class":1224},[1207,28719,3288],{"class":3287},[1207,28721,11684],{"class":1862},[1207,28723,1633],{"class":1632},[1207,28725,2772],{"class":1942},[1207,28727,3294],{"class":3287},[1207,28729,3297],{"class":1224},[1207,28731,2136],{"class":1632},[1207,28733,28734],{"class":1209,"line":6389},[1207,28735,1763],{"class":1620},[1207,28737,28738,28740,28742,28744,28746],{"class":1209,"line":6412},[1207,28739,1791],{"class":1632},[1207,28741,27897],{"class":1794},[1207,28743,1811],{"class":1632},[1207,28745,2998],{"class":1231},[1207,28747,2136],{"class":1632},[1207,28749,28750,28752,28755,28757,28759],{"class":1209,"line":6417},[1207,28751,1806],{"class":1735},[1207,28753,28754],{"class":1794}," search_users",[1207,28756,1811],{"class":1632},[1207,28758,1815],{"class":1814},[1207,28760,1818],{"class":1632},[1207,28762,28763],{"class":1209,"line":6423},[1207,28764,1824],{"class":1749},[1207,28766,28767],{"class":1209,"line":6468},[1207,28768,28769],{"class":1756},"        Test user search functionality\n",[1207,28771,28772],{"class":1209,"line":6487},[1207,28773,1836],{"class":1756},[1207,28775,28776],{"class":1209,"line":8226},[1207,28777,28778],{"class":1756},"        This simulates users searching for other users.\n",[1207,28780,28781],{"class":1209,"line":8239},[1207,28782,1824],{"class":1749},[1207,28784,28785,28788,28790,28792,28794,28796,28798,28800,28802,28804,28806,28808,28810,28813,28815,28817,28819,28822,28824,28826,28828,28831,28833],{"class":1209,"line":8244},[1207,28786,28787],{"class":1620},"        search_terms ",[1207,28789,1961],{"class":1632},[1207,28791,9226],{"class":1632},[1207,28793,1965],{"class":1964},[1207,28795,16481],{"class":1224},[1207,28797,1965],{"class":1964},[1207,28799,1644],{"class":1632},[1207,28801,2188],{"class":1964},[1207,28803,2643],{"class":1224},[1207,28805,1965],{"class":1964},[1207,28807,1644],{"class":1632},[1207,28809,2188],{"class":1964},[1207,28811,28812],{"class":1224},"load",[1207,28814,1965],{"class":1964},[1207,28816,1644],{"class":1632},[1207,28818,2188],{"class":1964},[1207,28820,28821],{"class":1224},"john",[1207,28823,1965],{"class":1964},[1207,28825,1644],{"class":1632},[1207,28827,2188],{"class":1964},[1207,28829,28830],{"class":1224},"jane",[1207,28832,1965],{"class":1964},[1207,28834,13328],{"class":1632},[1207,28836,28837,28840,28842,28845,28847,28850,28852,28855],{"class":1209,"line":8249},[1207,28838,28839],{"class":1620},"        search_term ",[1207,28841,1961],{"class":1632},[1207,28843,28844],{"class":1620}," random",[1207,28846,1633],{"class":1632},[1207,28848,28849],{"class":1862},"choice",[1207,28851,1811],{"class":1632},[1207,28853,28854],{"class":1862},"search_terms",[1207,28856,2136],{"class":1632},[1207,28858,28859],{"class":1209,"line":8255},[1207,28860,1836],{"class":1620},[1207,28862,28863,28865,28867,28869,28871,28873,28875],{"class":1209,"line":8274},[1207,28864,2295],{"class":1616},[1207,28866,27383],{"class":13428},[1207,28868,1633],{"class":1632},[1207,28870,27388],{"class":1942},[1207,28872,1633],{"class":1632},[1207,28874,5111],{"class":1862},[1207,28876,1951],{"class":1632},[1207,28878,28879,28881,28884,28886,28889,28891,28893],{"class":1209,"line":8279},[1207,28880,23109],{"class":1735},[1207,28882,28883],{"class":1224},"'/api/users/?search=",[1207,28885,3288],{"class":3287},[1207,28887,28888],{"class":1862},"search_term",[1207,28890,3294],{"class":3287},[1207,28892,1965],{"class":1224},[1207,28894,1973],{"class":1632},[1207,28896,28897,28899,28901,28903,28905,28907],{"class":1209,"line":8294},[1207,28898,21958],{"class":1957},[1207,28900,1961],{"class":1632},[1207,28902,1815],{"class":13428},[1207,28904,1633],{"class":1632},[1207,28906,21963],{"class":1942},[1207,28908,1973],{"class":1632},[1207,28910,28911,28913,28915,28917],{"class":1209,"line":8319},[1207,28912,27419],{"class":1957},[1207,28914,1961],{"class":1632},[1207,28916,9899],{"class":2813},[1207,28918,1973],{"class":1632},[1207,28920,28921,28923,28925,28927,28930],{"class":1209,"line":8344},[1207,28922,27430],{"class":1957},[1207,28924,1961],{"class":1632},[1207,28926,3297],{"class":1964},[1207,28928,28929],{"class":1224},"Search Users",[1207,28931,11115],{"class":1964},[1207,28933,28934,28936,28938,28940],{"class":1209,"line":8349},[1207,28935,27444],{"class":1632},[1207,28937,13173],{"class":1616},[1207,28939,6994],{"class":1620},[1207,28941,1743],{"class":1632},[1207,28943,28944,28946,28948,28950,28952,28954,28956],{"class":1209,"line":8355},[1207,28945,14547],{"class":1616},[1207,28947,6994],{"class":1620},[1207,28949,1633],{"class":1632},[1207,28951,2772],{"class":1942},[1207,28953,2164],{"class":2163},[1207,28955,21109],{"class":1231},[1207,28957,1743],{"class":1632},[1207,28959,28960,28962,28964,28966],{"class":1209,"line":8367},[1207,28961,27508],{"class":1620},[1207,28963,1633],{"class":1632},[1207,28965,2806],{"class":1862},[1207,28967,1866],{"class":1632},[1207,28969,28970,28972],{"class":1209,"line":8386},[1207,28971,27519],{"class":1616},[1207,28973,1743],{"class":1632},[1207,28975,28976,28978,28980,28982,28984,28986,28988,28990,28992,28994,28996,28998,29000],{"class":1209,"line":8405},[1207,28977,27508],{"class":1620},[1207,28979,1633],{"class":1632},[1207,28981,25311],{"class":1862},[1207,28983,1811],{"class":1632},[1207,28985,12545],{"class":1735},[1207,28987,28124],{"class":1224},[1207,28989,3288],{"class":3287},[1207,28991,11684],{"class":1862},[1207,28993,1633],{"class":1632},[1207,28995,2772],{"class":1942},[1207,28997,3294],{"class":3287},[1207,28999,3297],{"class":1224},[1207,29001,2136],{"class":1632},[1207,29003,29004],{"class":1209,"line":8410},[1207,29005,1527],{"emptyLinePlaceholder":1526},[1207,29007,29008,29010,29013,29015,29017],{"class":1209,"line":8428},[1207,29009,1736],{"class":1735},[1207,29011,29012],{"class":1739}," OrderServiceLoadTest",[1207,29014,1811],{"class":1632},[1207,29016,27042],{"class":1220},[1207,29018,1818],{"class":1632},[1207,29020,29021],{"class":1209,"line":8433},[1207,29022,1750],{"class":1749},[1207,29024,29025],{"class":1209,"line":8439},[1207,29026,29027],{"class":1756},"    Load test for Order Service\n",[1207,29029,29030],{"class":1209,"line":8444},[1207,29031,1763],{"class":1756},[1207,29033,29034],{"class":1209,"line":8450},[1207,29035,29036],{"class":1756},"    This simulates realistic order creation and management patterns.\n",[1207,29038,29039],{"class":1209,"line":8455},[1207,29040,1750],{"class":1749},[1207,29042,29043],{"class":1209,"line":8461},[1207,29044,1763],{"class":1620},[1207,29046,29047,29049,29051,29053,29055,29057,29059,29062,29064],{"class":1209,"line":8472},[1207,29048,27085],{"class":1620},[1207,29050,1961],{"class":1632},[1207,29052,26943],{"class":1862},[1207,29054,1811],{"class":1632},[1207,29056,10437],{"class":1231},[1207,29058,1644],{"class":1632},[1207,29060,29061],{"class":1231}," 5",[1207,29063,2328],{"class":1632},[1207,29065,29066],{"class":1213},"  # Orders take longer to think about\n",[1207,29068,29069],{"class":1209,"line":8477},[1207,29070,1763],{"class":1620},[1207,29072,29073,29075,29077,29079,29081],{"class":1209,"line":8483},[1207,29074,1806],{"class":1735},[1207,29076,27113],{"class":1794},[1207,29078,1811],{"class":1632},[1207,29080,1815],{"class":1814},[1207,29082,1818],{"class":1632},[1207,29084,29085,29087,29090],{"class":1209,"line":8498},[1207,29086,6843],{"class":1749},[1207,29088,29089],{"class":1756},"Set up user and authentication",[1207,29091,6849],{"class":1749},[1207,29093,29094,29096,29098,29100,29102],{"class":1209,"line":8534},[1207,29095,27151],{"class":13428},[1207,29097,1633],{"class":1632},[1207,29099,21625],{"class":1942},[1207,29101,2775],{"class":1632},[1207,29103,3856],{"class":2813},[1207,29105,29106,29108,29110,29112,29114],{"class":1209,"line":8539},[1207,29107,27151],{"class":13428},[1207,29109,1633],{"class":1632},[1207,29111,21882],{"class":1942},[1207,29113,2775],{"class":1632},[1207,29115,3856],{"class":2813},[1207,29117,29118,29120,29122,29125,29127],{"class":1209,"line":8544},[1207,29119,27151],{"class":13428},[1207,29121,1633],{"class":1632},[1207,29123,29124],{"class":1942},"order_ids",[1207,29126,2775],{"class":1632},[1207,29128,12500],{"class":1632},[1207,29130,29131],{"class":1209,"line":8550},[1207,29132,1836],{"class":1620},[1207,29134,29135],{"class":1209,"line":8570},[1207,29136,29137],{"class":1213},"        # Create and authenticate user\n",[1207,29139,29140,29142,29144,29146],{"class":1209,"line":8575},[1207,29141,27151],{"class":13428},[1207,29143,1633],{"class":1632},[1207,29145,1948],{"class":1862},[1207,29147,1866],{"class":1632},[1207,29149,29150],{"class":1209,"line":8593},[1207,29151,1763],{"class":1620},[1207,29153,29154,29156,29158,29160,29162],{"class":1209,"line":8598},[1207,29155,1806],{"class":1735},[1207,29157,19720],{"class":1794},[1207,29159,1811],{"class":1632},[1207,29161,1815],{"class":1814},[1207,29163,1818],{"class":1632},[1207,29165,29166,29168,29171],{"class":1209,"line":8604},[1207,29167,6843],{"class":1749},[1207,29169,29170],{"class":1756},"Create a user for order testing",[1207,29172,6849],{"class":1749},[1207,29174,29175,29177,29179,29181,29184,29186,29188,29190,29192,29194,29196,29198,29200,29202,29204],{"class":1209,"line":8609},[1207,29176,27227],{"class":1620},[1207,29178,1961],{"class":1632},[1207,29180,3281],{"class":1735},[1207,29182,29183],{"class":1224},"'order_user_",[1207,29185,3288],{"class":3287},[1207,29187,27239],{"class":1620},[1207,29189,1633],{"class":1632},[1207,29191,27244],{"class":1862},[1207,29193,1811],{"class":1632},[1207,29195,19428],{"class":1231},[1207,29197,1644],{"class":1632},[1207,29199,27253],{"class":1231},[1207,29201,2328],{"class":1632},[1207,29203,3294],{"class":3287},[1207,29205,2006],{"class":1224},[1207,29207,29208],{"class":1209,"line":8615},[1207,29209,1836],{"class":1620},[1207,29211,29212,29214,29216],{"class":1209,"line":8620},[1207,29213,2440],{"class":1620},[1207,29215,1961],{"class":1632},[1207,29217,2445],{"class":1632},[1207,29219,29220,29222,29224,29226,29228,29230],{"class":1209,"line":8626},[1207,29221,2451],{"class":1964},[1207,29223,2183],{"class":1224},[1207,29225,1965],{"class":1964},[1207,29227,2458],{"class":1632},[1207,29229,27289],{"class":1620},[1207,29231,1973],{"class":1632},[1207,29233,29234,29236,29238,29240,29242,29244,29246,29248,29250,29252,29254],{"class":1209,"line":8645},[1207,29235,2451],{"class":1964},[1207,29237,2204],{"class":1224},[1207,29239,1965],{"class":1964},[1207,29241,2458],{"class":1632},[1207,29243,3281],{"class":1735},[1207,29245,1965],{"class":1224},[1207,29247,3288],{"class":3287},[1207,29249,2183],{"class":1620},[1207,29251,3294],{"class":3287},[1207,29253,5719],{"class":1224},[1207,29255,1973],{"class":1632},[1207,29257,29258,29260,29262,29264,29266,29268,29270],{"class":1209,"line":8650},[1207,29259,2451],{"class":1964},[1207,29261,2495],{"class":1224},[1207,29263,1965],{"class":1964},[1207,29265,2458],{"class":1632},[1207,29267,2188],{"class":1964},[1207,29269,2003],{"class":1224},[1207,29271,2006],{"class":1964},[1207,29273,29274],{"class":1209,"line":8656},[1207,29275,2554],{"class":1632},[1207,29277,29278],{"class":1209,"line":8683},[1207,29279,1836],{"class":1620},[1207,29281,29282,29284,29286,29288,29290,29292,29294,29296,29298,29300,29302,29304,29306,29308,29310,29312],{"class":1209,"line":8688},[1207,29283,6953],{"class":1620},[1207,29285,1961],{"class":1632},[1207,29287,27383],{"class":13428},[1207,29289,1633],{"class":1632},[1207,29291,27388],{"class":1942},[1207,29293,1633],{"class":1632},[1207,29295,7368],{"class":1862},[1207,29297,1811],{"class":1632},[1207,29299,1965],{"class":1964},[1207,29301,10693],{"class":1224},[1207,29303,1965],{"class":1964},[1207,29305,1644],{"class":1632},[1207,29307,12918],{"class":1957},[1207,29309,1961],{"class":1632},[1207,29311,2583],{"class":1862},[1207,29313,2136],{"class":1632},[1207,29315,29316,29318,29320,29322,29324,29326,29328],{"class":1209,"line":8694},[1207,29317,13065],{"class":1616},[1207,29319,6994],{"class":1620},[1207,29321,1633],{"class":1632},[1207,29323,2772],{"class":1942},[1207,29325,2164],{"class":2163},[1207,29327,21552],{"class":1231},[1207,29329,1743],{"class":1632},[1207,29331,29332,29335,29337,29339,29341,29343],{"class":1209,"line":8713},[1207,29333,29334],{"class":1620},"            user ",[1207,29336,1961],{"class":1632},[1207,29338,6994],{"class":1620},[1207,29340,1633],{"class":1632},[1207,29342,2792],{"class":1862},[1207,29344,1866],{"class":1632},[1207,29346,29347,29349,29351,29353,29355,29357,29359,29361,29363,29365],{"class":1209,"line":8718},[1207,29348,20905],{"class":13428},[1207,29350,1633],{"class":1632},[1207,29352,21625],{"class":1942},[1207,29354,2775],{"class":1632},[1207,29356,2604],{"class":1620},[1207,29358,2989],{"class":1632},[1207,29360,1965],{"class":1964},[1207,29362,2133],{"class":1224},[1207,29364,1965],{"class":1964},[1207,29366,13328],{"class":1632},[1207,29368,29369],{"class":1209,"line":8733},[1207,29370,13162],{"class":1620},[1207,29372,29373],{"class":1209,"line":8749},[1207,29374,29375],{"class":1213},"            # Authenticate\n",[1207,29377,29378,29381,29383,29385,29387,29389,29391,29393],{"class":1209,"line":8764},[1207,29379,29380],{"class":1620},"            auth_response ",[1207,29382,1961],{"class":1632},[1207,29384,27383],{"class":13428},[1207,29386,1633],{"class":1632},[1207,29388,27388],{"class":1942},[1207,29390,1633],{"class":1632},[1207,29392,7368],{"class":1862},[1207,29394,1951],{"class":1632},[1207,29396,29397,29399,29401,29403],{"class":1209,"line":8780},[1207,29398,4969],{"class":1964},[1207,29400,27633],{"class":1224},[1207,29402,1965],{"class":1964},[1207,29404,1973],{"class":1632},[1207,29406,29407,29410,29412,29414,29416,29418,29420,29422,29424,29426,29428,29430,29432,29434,29436,29438],{"class":1209,"line":8796},[1207,29408,29409],{"class":1957},"                json",[1207,29411,8186],{"class":1632},[1207,29413,1965],{"class":1964},[1207,29415,2183],{"class":1224},[1207,29417,1965],{"class":1964},[1207,29419,2458],{"class":1632},[1207,29421,27289],{"class":1862},[1207,29423,1644],{"class":1632},[1207,29425,2188],{"class":1964},[1207,29427,2495],{"class":1224},[1207,29429,1965],{"class":1964},[1207,29431,2458],{"class":1632},[1207,29433,2188],{"class":1964},[1207,29435,2003],{"class":1224},[1207,29437,1965],{"class":1964},[1207,29439,2817],{"class":1632},[1207,29441,29442],{"class":1209,"line":8801},[1207,29443,13157],{"class":1632},[1207,29445,29446,29448,29450,29452,29454,29456,29458],{"class":1209,"line":8826},[1207,29447,14547],{"class":1616},[1207,29449,21744],{"class":1620},[1207,29451,1633],{"class":1632},[1207,29453,2772],{"class":1942},[1207,29455,2164],{"class":2163},[1207,29457,21109],{"class":1231},[1207,29459,1743],{"class":1632},[1207,29461,29462,29464,29466,29468,29470,29472],{"class":1209,"line":8856},[1207,29463,27702],{"class":1620},[1207,29465,1961],{"class":1632},[1207,29467,21744],{"class":1620},[1207,29469,1633],{"class":1632},[1207,29471,2792],{"class":1862},[1207,29473,1866],{"class":1632},[1207,29475,29476,29478,29480,29482,29484,29486,29488,29490,29492,29494,29496,29498,29500,29502,29504,29506,29508,29510,29512,29514,29516],{"class":1209,"line":8883},[1207,29477,27485],{"class":13428},[1207,29479,1633],{"class":1632},[1207,29481,21882],{"class":1942},[1207,29483,2775],{"class":1632},[1207,29485,27725],{"class":1620},[1207,29487,1633],{"class":1632},[1207,29489,5111],{"class":1862},[1207,29491,1811],{"class":1632},[1207,29493,1965],{"class":1964},[1207,29495,16193],{"class":1224},[1207,29497,1965],{"class":1964},[1207,29499,2328],{"class":1632},[1207,29501,21818],{"class":2163},[1207,29503,27725],{"class":1620},[1207,29505,1633],{"class":1632},[1207,29507,5111],{"class":1862},[1207,29509,1811],{"class":1632},[1207,29511,1965],{"class":1964},[1207,29513,16208],{"class":1224},[1207,29515,1965],{"class":1964},[1207,29517,2136],{"class":1632},[1207,29519,29520],{"class":1209,"line":8907},[1207,29521,1763],{"class":1620},[1207,29523,29524,29526],{"class":1209,"line":8912},[1207,29525,1791],{"class":1632},[1207,29527,27813],{"class":4020},[1207,29529,29530,29532,29534,29536,29538],{"class":1209,"line":8930},[1207,29531,1806],{"class":1735},[1207,29533,27820],{"class":1794},[1207,29535,1811],{"class":1632},[1207,29537,1815],{"class":1814},[1207,29539,1818],{"class":1632},[1207,29541,29542,29544,29546],{"class":1209,"line":8935},[1207,29543,6843],{"class":1749},[1207,29545,27833],{"class":1756},[1207,29547,6849],{"class":1749},[1207,29549,29550,29552,29554,29556,29558],{"class":1209,"line":8941},[1207,29551,13065],{"class":1616},[1207,29553,27383],{"class":13428},[1207,29555,1633],{"class":1632},[1207,29557,21882],{"class":1942},[1207,29559,1743],{"class":1632},[1207,29561,29562,29564,29566,29568,29570,29572,29574,29576,29578,29580,29582,29584,29586,29588,29590],{"class":1209,"line":8946},[1207,29563,13086],{"class":1616},[1207,29565,2801],{"class":1632},[1207,29567,1965],{"class":1964},[1207,29569,21868],{"class":1224},[1207,29571,1965],{"class":1964},[1207,29573,2458],{"class":1632},[1207,29575,3281],{"class":1735},[1207,29577,21877],{"class":1224},[1207,29579,3288],{"class":3287},[1207,29581,1815],{"class":13428},[1207,29583,1633],{"class":1632},[1207,29585,21882],{"class":1942},[1207,29587,3294],{"class":3287},[1207,29589,1965],{"class":1224},[1207,29591,2817],{"class":1632},[1207,29593,29594,29596],{"class":1209,"line":8952},[1207,29595,1859],{"class":1616},[1207,29597,27886],{"class":1632},[1207,29599,29600],{"class":1209,"line":8957},[1207,29601,1763],{"class":1620},[1207,29603,29604,29606,29608,29610,29612],{"class":1209,"line":8963},[1207,29605,1791],{"class":1632},[1207,29607,27897],{"class":1794},[1207,29609,1811],{"class":1632},[1207,29611,6934],{"class":1231},[1207,29613,2136],{"class":1632},[1207,29615,29616,29618,29621,29623,29625],{"class":1209,"line":8997},[1207,29617,1806],{"class":1735},[1207,29619,29620],{"class":1794}," create_order",[1207,29622,1811],{"class":1632},[1207,29624,1815],{"class":1814},[1207,29626,1818],{"class":1632},[1207,29628,29629],{"class":1209,"line":9030},[1207,29630,1824],{"class":1749},[1207,29632,29633],{"class":1209,"line":9063},[1207,29634,29635],{"class":1756},"        Test order creation with realistic data\n",[1207,29637,29638],{"class":1209,"line":9068},[1207,29639,1836],{"class":1756},[1207,29641,29642],{"class":1209,"line":9074},[1207,29643,29644],{"class":1756},"        This simulates users placing orders with varying numbers of items.\n",[1207,29646,29647],{"class":1209,"line":9089},[1207,29648,1824],{"class":1749},[1207,29650,29651,29653,29655,29657,29659,29661],{"class":1209,"line":9104},[1207,29652,13065],{"class":1616},[1207,29654,3853],{"class":2163},[1207,29656,27383],{"class":13428},[1207,29658,1633],{"class":1632},[1207,29660,21625],{"class":1942},[1207,29662,1743],{"class":1632},[1207,29664,29665],{"class":1209,"line":9130},[1207,29666,28208],{"class":1616},[1207,29668,29669],{"class":1209,"line":9135},[1207,29670,1836],{"class":1620},[1207,29672,29673],{"class":1209,"line":9140},[1207,29674,29675],{"class":1213},"        # Generate realistic order data\n",[1207,29677,29678,29681,29683,29685,29687,29689,29691,29693,29695,29697],{"class":1209,"line":9146},[1207,29679,29680],{"class":1620},"        num_items ",[1207,29682,1961],{"class":1632},[1207,29684,28844],{"class":1620},[1207,29686,1633],{"class":1632},[1207,29688,27244],{"class":1862},[1207,29690,1811],{"class":1632},[1207,29692,2998],{"class":1231},[1207,29694,1644],{"class":1632},[1207,29696,29061],{"class":1231},[1207,29698,2136],{"class":1632},[1207,29700,29701,29704,29706],{"class":1209,"line":9165},[1207,29702,29703],{"class":1620},"        items ",[1207,29705,1961],{"class":1632},[1207,29707,5664],{"class":1632},[1207,29709,29710],{"class":1209,"line":9170},[1207,29711,5669],{"class":1632},[1207,29713,29714,29716,29718,29720,29722,29724,29726,29728,29730,29732,29734,29736],{"class":1209,"line":9185},[1207,29715,4969],{"class":1964},[1207,29717,22160],{"class":1224},[1207,29719,1965],{"class":1964},[1207,29721,2458],{"class":1632},[1207,29723,28844],{"class":1620},[1207,29725,1633],{"class":1632},[1207,29727,27244],{"class":1862},[1207,29729,1811],{"class":1632},[1207,29731,2998],{"class":1231},[1207,29733,1644],{"class":1632},[1207,29735,25963],{"class":1231},[1207,29737,7386],{"class":1632},[1207,29739,29740,29742,29744,29746,29748,29750,29752,29754,29756,29758,29760,29762],{"class":1209,"line":9213},[1207,29741,4969],{"class":1964},[1207,29743,22189],{"class":1224},[1207,29745,1965],{"class":1964},[1207,29747,2458],{"class":1632},[1207,29749,28844],{"class":1620},[1207,29751,1633],{"class":1632},[1207,29753,27244],{"class":1862},[1207,29755,1811],{"class":1632},[1207,29757,2998],{"class":1231},[1207,29759,1644],{"class":1632},[1207,29761,14496],{"class":1231},[1207,29763,7386],{"class":1632},[1207,29765,29766,29768,29770,29772,29774,29777,29779,29781,29783,29786,29788,29791,29793,29796,29798,29800],{"class":1209,"line":9218},[1207,29767,4969],{"class":1964},[1207,29769,22204],{"class":1224},[1207,29771,1965],{"class":1964},[1207,29773,2458],{"class":1632},[1207,29775,29776],{"class":5160}," round",[1207,29778,1811],{"class":1632},[1207,29780,27239],{"class":1862},[1207,29782,1633],{"class":1632},[1207,29784,29785],{"class":1862},"uniform",[1207,29787,1811],{"class":1632},[1207,29789,29790],{"class":1231},"10.0",[1207,29792,1644],{"class":1632},[1207,29794,29795],{"class":1231}," 200.0",[1207,29797,9777],{"class":1632},[1207,29799,2939],{"class":1231},[1207,29801,2136],{"class":1632},[1207,29803,29804],{"class":1209,"line":9261},[1207,29805,5006],{"class":1632},[1207,29807,29808,29810,29813,29815,29817,29819,29822],{"class":1209,"line":9277},[1207,29809,5746],{"class":1616},[1207,29811,29812],{"class":1620}," _ ",[1207,29814,5752],{"class":1616},[1207,29816,5755],{"class":5160},[1207,29818,1811],{"class":1632},[1207,29820,29821],{"class":1862},"num_items",[1207,29823,2136],{"class":1632},[1207,29825,29826],{"class":1209,"line":9292},[1207,29827,5766],{"class":1632},[1207,29829,29830],{"class":1209,"line":16152},[1207,29831,1836],{"class":1620},[1207,29833,29834,29836,29838],{"class":1209,"line":16171},[1207,29835,22116],{"class":1620},[1207,29837,1961],{"class":1632},[1207,29839,2445],{"class":1632},[1207,29841,29842,29844,29846,29848,29850,29852,29854,29856],{"class":1209,"line":16186},[1207,29843,2451],{"class":1964},[1207,29845,21625],{"class":1224},[1207,29847,1965],{"class":1964},[1207,29849,2458],{"class":1632},[1207,29851,27383],{"class":13428},[1207,29853,1633],{"class":1632},[1207,29855,21625],{"class":1942},[1207,29857,1973],{"class":1632},[1207,29859,29860,29862,29864,29866,29868,29871],{"class":1209,"line":16217},[1207,29861,2451],{"class":1964},[1207,29863,22142],{"class":1224},[1207,29865,1965],{"class":1964},[1207,29867,2458],{"class":1632},[1207,29869,29870],{"class":1620}," items",[1207,29872,1973],{"class":1632},[1207,29874,29875,29877,29879,29881,29883],{"class":1209,"line":16222},[1207,29876,2451],{"class":1964},[1207,29878,22382],{"class":1224},[1207,29880,1965],{"class":1964},[1207,29882,2458],{"class":1632},[1207,29884,2445],{"class":1632},[1207,29886,29887,29889,29891,29893,29895,29897,29899,29901,29903,29905,29907,29909,29911,29913,29915,29917,29919,29921],{"class":1209,"line":16228},[1207,29888,4969],{"class":1964},[1207,29890,22395],{"class":1224},[1207,29892,1965],{"class":1964},[1207,29894,2458],{"class":1632},[1207,29896,3281],{"class":1735},[1207,29898,1965],{"class":1224},[1207,29900,3288],{"class":3287},[1207,29902,27239],{"class":1620},[1207,29904,1633],{"class":1632},[1207,29906,27244],{"class":1862},[1207,29908,1811],{"class":1632},[1207,29910,11222],{"class":1231},[1207,29912,1644],{"class":1632},[1207,29914,28564],{"class":1231},[1207,29916,2328],{"class":1632},[1207,29918,3294],{"class":3287},[1207,29920,24569],{"class":1224},[1207,29922,1973],{"class":1632},[1207,29924,29925,29927,29929,29931,29933,29935,29937,29939],{"class":1209,"line":16237},[1207,29926,4969],{"class":1964},[1207,29928,22415],{"class":1224},[1207,29930,1965],{"class":1964},[1207,29932,2458],{"class":1632},[1207,29934,2188],{"class":1964},[1207,29936,22424],{"class":1224},[1207,29938,1965],{"class":1964},[1207,29940,1973],{"class":1632},[1207,29942,29943,29945,29947,29949,29951,29953,29955,29957],{"class":1209,"line":16256},[1207,29944,4969],{"class":1964},[1207,29946,12954],{"class":1224},[1207,29948,1965],{"class":1964},[1207,29950,2458],{"class":1632},[1207,29952,2188],{"class":1964},[1207,29954,22443],{"class":1224},[1207,29956,1965],{"class":1964},[1207,29958,1973],{"class":1632},[1207,29960,29961,29963,29965,29967,29969,29971,29973,29975,29977,29979,29981,29983,29986,29988,29991,29993,29995,29997],{"class":1209,"line":16274},[1207,29962,4969],{"class":1964},[1207,29964,22454],{"class":1224},[1207,29966,1965],{"class":1964},[1207,29968,2458],{"class":1632},[1207,29970,3281],{"class":1735},[1207,29972,1965],{"class":1224},[1207,29974,3288],{"class":3287},[1207,29976,27239],{"class":1620},[1207,29978,1633],{"class":1632},[1207,29980,27244],{"class":1862},[1207,29982,1811],{"class":1632},[1207,29984,29985],{"class":1231},"10000",[1207,29987,1644],{"class":1632},[1207,29989,29990],{"class":1231}," 99999",[1207,29992,2328],{"class":1632},[1207,29994,3294],{"class":3287},[1207,29996,1965],{"class":1224},[1207,29998,1973],{"class":1632},[1207,30000,30001,30003,30005,30007,30009,30011,30013],{"class":1209,"line":16279},[1207,30002,4969],{"class":1964},[1207,30004,22474],{"class":1224},[1207,30006,1965],{"class":1964},[1207,30008,2458],{"class":1632},[1207,30010,2188],{"class":1964},[1207,30012,22483],{"class":1224},[1207,30014,2006],{"class":1964},[1207,30016,30017],{"class":1209,"line":16284},[1207,30018,5006],{"class":1632},[1207,30020,30021],{"class":1209,"line":16299},[1207,30022,2554],{"class":1632},[1207,30024,30025],{"class":1209,"line":16314},[1207,30026,1836],{"class":1620},[1207,30028,30029,30031,30033,30035,30037,30039,30041],{"class":1209,"line":16325},[1207,30030,2295],{"class":1616},[1207,30032,27383],{"class":13428},[1207,30034,1633],{"class":1632},[1207,30036,27388],{"class":1942},[1207,30038,1633],{"class":1632},[1207,30040,7368],{"class":1862},[1207,30042,1951],{"class":1632},[1207,30044,30045,30047,30050,30052],{"class":1209,"line":16338},[1207,30046,2451],{"class":1964},[1207,30048,30049],{"class":1224},"/api/orders/",[1207,30051,1965],{"class":1964},[1207,30053,1973],{"class":1632},[1207,30055,30056,30058,30060,30062],{"class":1209,"line":16343},[1207,30057,13896],{"class":1957},[1207,30059,1961],{"class":1632},[1207,30061,22532],{"class":1862},[1207,30063,1973],{"class":1632},[1207,30065,30066,30068,30070,30072,30074,30076],{"class":1209,"line":16348},[1207,30067,21958],{"class":1957},[1207,30069,1961],{"class":1632},[1207,30071,1815],{"class":13428},[1207,30073,1633],{"class":1632},[1207,30075,21963],{"class":1942},[1207,30077,1973],{"class":1632},[1207,30079,30080,30082,30084,30086],{"class":1209,"line":16367},[1207,30081,27419],{"class":1957},[1207,30083,1961],{"class":1632},[1207,30085,9899],{"class":2813},[1207,30087,1973],{"class":1632},[1207,30089,30090,30092,30094,30096,30099],{"class":1209,"line":16372},[1207,30091,27430],{"class":1957},[1207,30093,1961],{"class":1632},[1207,30095,3297],{"class":1964},[1207,30097,30098],{"class":1224},"Create Order",[1207,30100,11115],{"class":1964},[1207,30102,30103,30105,30107,30109],{"class":1209,"line":16401},[1207,30104,27444],{"class":1632},[1207,30106,13173],{"class":1616},[1207,30108,6994],{"class":1620},[1207,30110,1743],{"class":1632},[1207,30112,30113,30115,30117,30119,30121,30123,30125],{"class":1209,"line":16407},[1207,30114,14547],{"class":1616},[1207,30116,6994],{"class":1620},[1207,30118,1633],{"class":1632},[1207,30120,2772],{"class":1942},[1207,30122,2164],{"class":2163},[1207,30124,21552],{"class":1231},[1207,30126,1743],{"class":1632},[1207,30128,30129,30131,30133,30135,30137,30139],{"class":1209,"line":16466},[1207,30130,24804],{"class":1620},[1207,30132,1961],{"class":1632},[1207,30134,6994],{"class":1620},[1207,30136,1633],{"class":1632},[1207,30138,2792],{"class":1862},[1207,30140,1866],{"class":1632},[1207,30142,30143,30145,30147,30149,30151,30153,30155,30157,30159,30161,30163,30165],{"class":1209,"line":16528},[1207,30144,27485],{"class":13428},[1207,30146,1633],{"class":1632},[1207,30148,29124],{"class":1942},[1207,30150,1633],{"class":1632},[1207,30152,12601],{"class":1862},[1207,30154,1811],{"class":1632},[1207,30156,23634],{"class":1862},[1207,30158,2989],{"class":1632},[1207,30160,1965],{"class":1964},[1207,30162,2133],{"class":1224},[1207,30164,1965],{"class":1964},[1207,30166,12856],{"class":1632},[1207,30168,30169,30171,30173,30175],{"class":1209,"line":16590},[1207,30170,27508],{"class":1620},[1207,30172,1633],{"class":1632},[1207,30174,2806],{"class":1862},[1207,30176,1866],{"class":1632},[1207,30178,30179,30181],{"class":1209,"line":16638},[1207,30180,27519],{"class":1616},[1207,30182,1743],{"class":1632},[1207,30184,30185,30187,30189,30191,30193,30195,30198,30200,30202,30204,30206,30208,30210],{"class":1209,"line":16644},[1207,30186,27508],{"class":1620},[1207,30188,1633],{"class":1632},[1207,30190,25311],{"class":1862},[1207,30192,1811],{"class":1632},[1207,30194,12545],{"class":1735},[1207,30196,30197],{"class":1224},"\"Failed to create order: ",[1207,30199,3288],{"class":3287},[1207,30201,11684],{"class":1862},[1207,30203,1633],{"class":1632},[1207,30205,3552],{"class":1942},[1207,30207,3294],{"class":3287},[1207,30209,3297],{"class":1224},[1207,30211,2136],{"class":1632},[1207,30213,30214],{"class":1209,"line":16672},[1207,30215,1763],{"class":1620},[1207,30217,30218,30220,30222,30224,30226],{"class":1209,"line":16677},[1207,30219,1791],{"class":1632},[1207,30221,27897],{"class":1794},[1207,30223,1811],{"class":1632},[1207,30225,4561],{"class":1231},[1207,30227,2136],{"class":1632},[1207,30229,30230,30232,30235,30237,30239],{"class":1209,"line":16683},[1207,30231,1806],{"class":1735},[1207,30233,30234],{"class":1794}," get_user_orders",[1207,30236,1811],{"class":1632},[1207,30238,1815],{"class":1814},[1207,30240,1818],{"class":1632},[1207,30242,30243],{"class":1209,"line":16688},[1207,30244,1824],{"class":1749},[1207,30246,30247],{"class":1209,"line":16694},[1207,30248,30249],{"class":1756},"        Test retrieving user's orders\n",[1207,30251,30252],{"class":1209,"line":16700},[1207,30253,1836],{"class":1756},[1207,30255,30256],{"class":1209,"line":16705},[1207,30257,30258],{"class":1756},"        This simulates users checking their order history.\n",[1207,30260,30261],{"class":1209,"line":16711},[1207,30262,1824],{"class":1749},[1207,30264,30265,30267,30269,30271,30273,30275],{"class":1209,"line":16726},[1207,30266,13065],{"class":1616},[1207,30268,3853],{"class":2163},[1207,30270,27383],{"class":13428},[1207,30272,1633],{"class":1632},[1207,30274,21625],{"class":1942},[1207,30276,1743],{"class":1632},[1207,30278,30279],{"class":1209,"line":16741},[1207,30280,28208],{"class":1616},[1207,30282,30283],{"class":1209,"line":16752},[1207,30284,1836],{"class":1620},[1207,30286,30287,30289,30291,30293,30295,30297,30299],{"class":1209,"line":16765},[1207,30288,2295],{"class":1616},[1207,30290,27383],{"class":13428},[1207,30292,1633],{"class":1632},[1207,30294,27388],{"class":1942},[1207,30296,1633],{"class":1632},[1207,30298,5111],{"class":1862},[1207,30300,1951],{"class":1632},[1207,30302,30303,30305,30307,30309,30311,30313,30315,30317,30320],{"class":1209,"line":16770},[1207,30304,23109],{"class":1735},[1207,30306,28235],{"class":1224},[1207,30308,3288],{"class":3287},[1207,30310,1815],{"class":13428},[1207,30312,1633],{"class":1632},[1207,30314,21625],{"class":1942},[1207,30316,3294],{"class":3287},[1207,30318,30319],{"class":1224},"/orders/'",[1207,30321,1973],{"class":1632},[1207,30323,30324,30326,30328,30330,30332,30334],{"class":1209,"line":16775},[1207,30325,21958],{"class":1957},[1207,30327,1961],{"class":1632},[1207,30329,1815],{"class":13428},[1207,30331,1633],{"class":1632},[1207,30333,21963],{"class":1942},[1207,30335,1973],{"class":1632},[1207,30337,30338,30340,30342,30344],{"class":1209,"line":16781},[1207,30339,27419],{"class":1957},[1207,30341,1961],{"class":1632},[1207,30343,9899],{"class":2813},[1207,30345,1973],{"class":1632},[1207,30347,30348,30350,30352,30354,30357],{"class":1209,"line":16800},[1207,30349,27430],{"class":1957},[1207,30351,1961],{"class":1632},[1207,30353,3297],{"class":1964},[1207,30355,30356],{"class":1224},"Get User Orders",[1207,30358,11115],{"class":1964},[1207,30360,30361,30363,30365,30367],{"class":1209,"line":16815},[1207,30362,27444],{"class":1632},[1207,30364,13173],{"class":1616},[1207,30366,6994],{"class":1620},[1207,30368,1743],{"class":1632},[1207,30370,30371,30373,30375,30377,30379,30381,30383],{"class":1209,"line":19912},[1207,30372,14547],{"class":1616},[1207,30374,6994],{"class":1620},[1207,30376,1633],{"class":1632},[1207,30378,2772],{"class":1942},[1207,30380,2164],{"class":2163},[1207,30382,21109],{"class":1231},[1207,30384,1743],{"class":1632},[1207,30386,30387,30389,30391,30393],{"class":1209,"line":19950},[1207,30388,27508],{"class":1620},[1207,30390,1633],{"class":1632},[1207,30392,2806],{"class":1862},[1207,30394,1866],{"class":1632},[1207,30396,30397,30399],{"class":1209,"line":19967},[1207,30398,27519],{"class":1616},[1207,30400,1743],{"class":1632},[1207,30402,30403,30405,30407,30409,30411,30413,30415,30417,30419,30421,30423,30425,30427],{"class":1209,"line":19972},[1207,30404,27508],{"class":1620},[1207,30406,1633],{"class":1632},[1207,30408,25311],{"class":1862},[1207,30410,1811],{"class":1632},[1207,30412,12545],{"class":1735},[1207,30414,28124],{"class":1224},[1207,30416,3288],{"class":3287},[1207,30418,11684],{"class":1862},[1207,30420,1633],{"class":1632},[1207,30422,2772],{"class":1942},[1207,30424,3294],{"class":3287},[1207,30426,3297],{"class":1224},[1207,30428,2136],{"class":1632},[1207,30430,30431],{"class":1209,"line":19978},[1207,30432,1763],{"class":1620},[1207,30434,30435,30437,30439,30441,30443],{"class":1209,"line":19993},[1207,30436,1791],{"class":1632},[1207,30438,27897],{"class":1794},[1207,30440,1811],{"class":1632},[1207,30442,10437],{"class":1231},[1207,30444,2136],{"class":1632},[1207,30446,30447,30449,30452,30454,30456],{"class":1209,"line":20006},[1207,30448,1806],{"class":1735},[1207,30450,30451],{"class":1794}," get_order_detail",[1207,30453,1811],{"class":1632},[1207,30455,1815],{"class":1814},[1207,30457,1818],{"class":1632},[1207,30459,30460],{"class":1209,"line":20011},[1207,30461,1824],{"class":1749},[1207,30463,30464],{"class":1209,"line":20017},[1207,30465,30466],{"class":1756},"        Test retrieving order details\n",[1207,30468,30469],{"class":1209,"line":20030},[1207,30470,1836],{"class":1756},[1207,30472,30473],{"class":1209,"line":20042},[1207,30474,30475],{"class":1756},"        This simulates users checking specific order details.\n",[1207,30477,30478],{"class":1209,"line":20047},[1207,30479,1824],{"class":1749},[1207,30481,30482,30484,30486,30488,30490,30492],{"class":1209,"line":20053},[1207,30483,13065],{"class":1616},[1207,30485,3853],{"class":2163},[1207,30487,27383],{"class":13428},[1207,30489,1633],{"class":1632},[1207,30491,29124],{"class":1942},[1207,30493,1743],{"class":1632},[1207,30495,30496],{"class":1209,"line":20071},[1207,30497,28208],{"class":1616},[1207,30499,30500],{"class":1209,"line":20089},[1207,30501,1836],{"class":1620},[1207,30503,30504,30506,30508,30510,30512,30514,30516,30518,30520,30522],{"class":1209,"line":20094},[1207,30505,22616],{"class":1620},[1207,30507,1961],{"class":1632},[1207,30509,28844],{"class":1620},[1207,30511,1633],{"class":1632},[1207,30513,28849],{"class":1862},[1207,30515,1811],{"class":1632},[1207,30517,1815],{"class":13428},[1207,30519,1633],{"class":1632},[1207,30521,29124],{"class":1942},[1207,30523,2136],{"class":1632},[1207,30525,30526],{"class":1209,"line":20100},[1207,30527,1836],{"class":1620},[1207,30529,30530,30532,30534,30536,30538,30540,30542],{"class":1209,"line":20126},[1207,30531,2295],{"class":1616},[1207,30533,27383],{"class":13428},[1207,30535,1633],{"class":1632},[1207,30537,27388],{"class":1942},[1207,30539,1633],{"class":1632},[1207,30541,5111],{"class":1862},[1207,30543,1951],{"class":1632},[1207,30545,30546,30548,30551,30553,30555,30557,30559],{"class":1209,"line":24574},[1207,30547,23109],{"class":1735},[1207,30549,30550],{"class":1224},"'/api/orders/",[1207,30552,3288],{"class":3287},[1207,30554,22647],{"class":1862},[1207,30556,3294],{"class":3287},[1207,30558,23121],{"class":1224},[1207,30560,1973],{"class":1632},[1207,30562,30563,30565,30567,30569,30571,30573],{"class":1209,"line":24593},[1207,30564,21958],{"class":1957},[1207,30566,1961],{"class":1632},[1207,30568,1815],{"class":13428},[1207,30570,1633],{"class":1632},[1207,30572,21963],{"class":1942},[1207,30574,1973],{"class":1632},[1207,30576,30577,30579,30581,30583],{"class":1209,"line":24612},[1207,30578,27419],{"class":1957},[1207,30580,1961],{"class":1632},[1207,30582,9899],{"class":2813},[1207,30584,1973],{"class":1632},[1207,30586,30587,30589,30591,30593,30596],{"class":1209,"line":24631},[1207,30588,27430],{"class":1957},[1207,30590,1961],{"class":1632},[1207,30592,3297],{"class":1964},[1207,30594,30595],{"class":1224},"Get Order Detail",[1207,30597,11115],{"class":1964},[1207,30599,30600,30602,30604,30606],{"class":1209,"line":24648},[1207,30601,27444],{"class":1632},[1207,30603,13173],{"class":1616},[1207,30605,6994],{"class":1620},[1207,30607,1743],{"class":1632},[1207,30609,30610,30612,30614,30616,30618,30620,30622],{"class":1209,"line":24654},[1207,30611,14547],{"class":1616},[1207,30613,6994],{"class":1620},[1207,30615,1633],{"class":1632},[1207,30617,2772],{"class":1942},[1207,30619,2164],{"class":2163},[1207,30621,21109],{"class":1231},[1207,30623,1743],{"class":1632},[1207,30625,30626,30628,30630,30632],{"class":1209,"line":24659},[1207,30627,27508],{"class":1620},[1207,30629,1633],{"class":1632},[1207,30631,2806],{"class":1862},[1207,30633,1866],{"class":1632},[1207,30635,30636,30638],{"class":1209,"line":24664},[1207,30637,27519],{"class":1616},[1207,30639,1743],{"class":1632},[1207,30641,30642,30644,30646,30648,30650,30652,30654,30656,30658,30660,30662,30664,30666],{"class":1209,"line":24680},[1207,30643,27508],{"class":1620},[1207,30645,1633],{"class":1632},[1207,30647,25311],{"class":1862},[1207,30649,1811],{"class":1632},[1207,30651,12545],{"class":1735},[1207,30653,28124],{"class":1224},[1207,30655,3288],{"class":3287},[1207,30657,11684],{"class":1862},[1207,30659,1633],{"class":1632},[1207,30661,2772],{"class":1942},[1207,30663,3294],{"class":3287},[1207,30665,3297],{"class":1224},[1207,30667,2136],{"class":1632},[1207,30669,30670],{"class":1209,"line":24691},[1207,30671,1527],{"emptyLinePlaceholder":1526},[1207,30673,30674],{"class":1209,"line":24702},[1207,30675,30676],{"class":1213},"# Event handlers for custom metrics\n",[1207,30678,30679,30681,30684,30686,30688,30690],{"class":1209,"line":24714},[1207,30680,3707],{"class":1632},[1207,30682,30683],{"class":1794},"events",[1207,30685,1633],{"class":1632},[1207,30687,12868],{"class":1794},[1207,30689,1633],{"class":1632},[1207,30691,30692],{"class":1794},"add_listener\n",[1207,30694,30695,30697,30700,30702,30705,30707,30709,30711,30714,30716,30719,30721,30724,30726,30729,30732],{"class":1209,"line":24723},[1207,30696,9532],{"class":1735},[1207,30698,30699],{"class":1794}," on_request",[1207,30701,1811],{"class":1632},[1207,30703,30704],{"class":2051},"request_type",[1207,30706,1644],{"class":1632},[1207,30708,13312],{"class":2051},[1207,30710,1644],{"class":1632},[1207,30712,30713],{"class":2051}," response_time",[1207,30715,1644],{"class":1632},[1207,30717,30718],{"class":2051}," response_length",[1207,30720,1644],{"class":1632},[1207,30722,30723],{"class":2051}," exception",[1207,30725,1644],{"class":1632},[1207,30727,30728],{"class":2163}," **",[1207,30730,30731],{"class":2051},"kwargs",[1207,30733,1818],{"class":1632},[1207,30735,30736],{"class":1209,"line":24728},[1207,30737,1750],{"class":1749},[1207,30739,30740],{"class":1209,"line":24733},[1207,30741,30742],{"class":1756},"    Custom request handler for additional logging\n",[1207,30744,30745],{"class":1209,"line":24750},[1207,30746,1763],{"class":1756},[1207,30748,30749],{"class":1209,"line":24796},[1207,30750,30751],{"class":1756},"    This handler is called for every request and can be used to\n",[1207,30753,30754],{"class":1209,"line":24801},[1207,30755,30756],{"class":1756},"    collect custom metrics or log specific events.\n",[1207,30758,30759],{"class":1209,"line":24817},[1207,30760,1750],{"class":1749},[1207,30762,30763,30765,30767],{"class":1209,"line":24822},[1207,30764,26285],{"class":1616},[1207,30766,30723],{"class":1620},[1207,30768,1743],{"class":1632},[1207,30770,30771,30774,30776,30778,30780,30782,30785,30787,30789,30791,30794,30796,30799,30801,30803],{"class":1209,"line":24830},[1207,30772,30773],{"class":1620},"        logger",[1207,30775,1633],{"class":1632},[1207,30777,10907],{"class":1862},[1207,30779,1811],{"class":1632},[1207,30781,12545],{"class":1735},[1207,30783,30784],{"class":1224},"\"Request failed: ",[1207,30786,3288],{"class":3287},[1207,30788,25920],{"class":1862},[1207,30790,3294],{"class":3287},[1207,30792,30793],{"class":1224}," - ",[1207,30795,3288],{"class":3287},[1207,30797,30798],{"class":1862},"exception",[1207,30800,3294],{"class":3287},[1207,30802,3297],{"class":1224},[1207,30804,2136],{"class":1632},[1207,30806,30807,30810,30813,30816,30819,30821],{"class":1209,"line":24845},[1207,30808,30809],{"class":1616},"    elif",[1207,30811,30812],{"class":1620}," response_time ",[1207,30814,30815],{"class":2163},">",[1207,30817,30818],{"class":1231}," 2000",[1207,30820,2458],{"class":1632},[1207,30822,30823],{"class":1213},"  # Log slow requests (> 2 seconds)\n",[1207,30825,30826,30828,30830,30833,30835,30837,30840,30842,30844,30846,30849,30851,30854,30856,30859],{"class":1209,"line":24868},[1207,30827,30773],{"class":1620},[1207,30829,1633],{"class":1632},[1207,30831,30832],{"class":1862},"warning",[1207,30834,1811],{"class":1632},[1207,30836,12545],{"class":1735},[1207,30838,30839],{"class":1224},"\"Slow request: ",[1207,30841,3288],{"class":3287},[1207,30843,25920],{"class":1862},[1207,30845,3294],{"class":3287},[1207,30847,30848],{"class":1224}," took ",[1207,30850,3288],{"class":3287},[1207,30852,30853],{"class":1862},"response_time",[1207,30855,3294],{"class":3287},[1207,30857,30858],{"class":1224},"ms\"",[1207,30860,2136],{"class":1632},[1207,30862,30863],{"class":1209,"line":24891},[1207,30864,1527],{"emptyLinePlaceholder":1526},[1207,30866,30867,30869,30871,30873,30876,30878],{"class":1209,"line":24905},[1207,30868,3707],{"class":1632},[1207,30870,30683],{"class":1794},[1207,30872,1633],{"class":1632},[1207,30874,30875],{"class":1794},"test_start",[1207,30877,1633],{"class":1632},[1207,30879,30692],{"class":1794},[1207,30881,30882,30884,30887,30889,30892,30894,30896,30898],{"class":1209,"line":24910},[1207,30883,9532],{"class":1735},[1207,30885,30886],{"class":1794}," on_test_start",[1207,30888,1811],{"class":1632},[1207,30890,30891],{"class":2051},"environment",[1207,30893,1644],{"class":1632},[1207,30895,30728],{"class":2163},[1207,30897,30731],{"class":2051},[1207,30899,1818],{"class":1632},[1207,30901,30902],{"class":1209,"line":24915},[1207,30903,1750],{"class":1749},[1207,30905,30906],{"class":1209,"line":24928},[1207,30907,30908],{"class":1756},"    Called when load test starts\n",[1207,30910,30911],{"class":1209,"line":24964},[1207,30912,1763],{"class":1756},[1207,30914,30915],{"class":1209,"line":24969},[1207,30916,30917],{"class":1756},"    Use this to set up any test-wide configuration or logging.\n",[1207,30919,30920],{"class":1209,"line":24975},[1207,30921,1750],{"class":1749},[1207,30923,30924,30927,30929,30932,30934,30936,30939,30941],{"class":1209,"line":24991},[1207,30925,30926],{"class":1620},"    logger",[1207,30928,1633],{"class":1632},[1207,30930,30931],{"class":1862},"info",[1207,30933,1811],{"class":1632},[1207,30935,3297],{"class":1964},[1207,30937,30938],{"class":1224},"Load test starting...",[1207,30940,3297],{"class":1964},[1207,30942,2136],{"class":1632},[1207,30944,30945,30947,30949,30951,30953,30955,30958,30960,30962,30964,30967,30969,30971],{"class":1209,"line":25017},[1207,30946,30926],{"class":1620},[1207,30948,1633],{"class":1632},[1207,30950,30931],{"class":1862},[1207,30952,1811],{"class":1632},[1207,30954,12545],{"class":1735},[1207,30956,30957],{"class":1224},"\"Target host: ",[1207,30959,3288],{"class":3287},[1207,30961,30891],{"class":1862},[1207,30963,1633],{"class":1632},[1207,30965,30966],{"class":1942},"host",[1207,30968,3294],{"class":3287},[1207,30970,3297],{"class":1224},[1207,30972,2136],{"class":1632},[1207,30974,30975],{"class":1209,"line":25023},[1207,30976,1527],{"emptyLinePlaceholder":1526},[1207,30978,30979,30981,30983,30985,30988,30990],{"class":1209,"line":25033},[1207,30980,3707],{"class":1632},[1207,30982,30683],{"class":1794},[1207,30984,1633],{"class":1632},[1207,30986,30987],{"class":1794},"test_stop",[1207,30989,1633],{"class":1632},[1207,30991,30692],{"class":1794},[1207,30993,30994,30996,30999,31001,31003,31005,31007,31009],{"class":1209,"line":25057},[1207,30995,9532],{"class":1735},[1207,30997,30998],{"class":1794}," on_test_stop",[1207,31000,1811],{"class":1632},[1207,31002,30891],{"class":2051},[1207,31004,1644],{"class":1632},[1207,31006,30728],{"class":2163},[1207,31008,30731],{"class":2051},[1207,31010,1818],{"class":1632},[1207,31012,31013],{"class":1209,"line":25075},[1207,31014,1750],{"class":1749},[1207,31016,31017],{"class":1209,"line":25080},[1207,31018,31019],{"class":1756},"    Called when load test stops\n",[1207,31021,31022],{"class":1209,"line":25085},[1207,31023,1763],{"class":1756},[1207,31025,31026],{"class":1209,"line":25091},[1207,31027,31028],{"class":1756},"    Use this to clean up or generate final reports.\n",[1207,31030,31031],{"class":1209,"line":25122},[1207,31032,1750],{"class":1749},[1207,31034,31035,31037,31039,31041,31043,31045,31048,31050],{"class":1209,"line":25127},[1207,31036,30926],{"class":1620},[1207,31038,1633],{"class":1632},[1207,31040,30931],{"class":1862},[1207,31042,1811],{"class":1632},[1207,31044,3297],{"class":1964},[1207,31046,31047],{"class":1224},"Load test completed",[1207,31049,3297],{"class":1964},[1207,31051,2136],{"class":1632},[1207,31053,31054,31056,31058,31060,31062,31064,31067,31069,31071,31073,31076,31078,31081,31083,31086,31088,31090],{"class":1209,"line":25133},[1207,31055,30926],{"class":1620},[1207,31057,1633],{"class":1632},[1207,31059,30931],{"class":1862},[1207,31061,1811],{"class":1632},[1207,31063,12545],{"class":1735},[1207,31065,31066],{"class":1224},"\"Total requests: ",[1207,31068,3288],{"class":3287},[1207,31070,30891],{"class":1862},[1207,31072,1633],{"class":1632},[1207,31074,31075],{"class":1942},"stats",[1207,31077,1633],{"class":1632},[1207,31079,31080],{"class":1942},"total",[1207,31082,1633],{"class":1632},[1207,31084,31085],{"class":1942},"num_requests",[1207,31087,3294],{"class":3287},[1207,31089,3297],{"class":1224},[1207,31091,2136],{"class":1632},[1207,31093,31094,31096,31098,31100,31102,31104,31107,31109,31111,31113,31115,31117,31119,31121,31124,31126,31128],{"class":1209,"line":25172},[1207,31095,30926],{"class":1620},[1207,31097,1633],{"class":1632},[1207,31099,30931],{"class":1862},[1207,31101,1811],{"class":1632},[1207,31103,12545],{"class":1735},[1207,31105,31106],{"class":1224},"\"Total failures: ",[1207,31108,3288],{"class":3287},[1207,31110,30891],{"class":1862},[1207,31112,1633],{"class":1632},[1207,31114,31075],{"class":1942},[1207,31116,1633],{"class":1632},[1207,31118,31080],{"class":1942},[1207,31120,1633],{"class":1632},[1207,31122,31123],{"class":1942},"num_failures",[1207,31125,3294],{"class":3287},[1207,31127,3297],{"class":1224},[1207,31129,2136],{"class":1632},[1026,31131,31132],{},[1045,31133,31134],{},"Running Load Tests:",[1197,31136,31138],{"className":1199,"code":31137,"language":1201,"meta":1202,"style":1202},"# Install Locust\npip install locust\n\n# Run load test with web UI\nlocust -f tests/load/locustfile.py --host=http://localhost:8000\n\n# Then open http://localhost:8089 in your browser to configure and start the test\n\n# Run load test from command line (headless)\nlocust -f tests/load/locustfile.py \\\n       --host=http://localhost:8000 \\\n       --users 100 \\\n       --spawn-rate 10 \\\n       --run-time 5m \\\n       --headless\n\n# Run with specific user class\nlocust -f tests/load/locustfile.py \\\n       --host=http://localhost:8000 \\\n       UserServiceLoadTest\n\n# Generate HTML report\nlocust -f tests/load/locustfile.py \\\n       --host=http://localhost:8000 \\\n       --users 100 \\\n       --spawn-rate 10 \\\n       --run-time 5m \\\n       --headless \\\n       --html=load_test_report.html\n",[1204,31139,31140,31145,31154,31158,31163,31177,31181,31186,31190,31195,31205,31212,31221,31230,31240,31245,31249,31254,31264,31270,31275,31279,31284,31294,31300,31308,31316,31324,31331],{"__ignoreMap":1202},[1207,31141,31142],{"class":1209,"line":1210},[1207,31143,31144],{"class":1213},"# Install Locust\n",[1207,31146,31147,31149,31151],{"class":1209,"line":1217},[1207,31148,1221],{"class":1220},[1207,31150,1225],{"class":1224},[1207,31152,31153],{"class":1224}," locust\n",[1207,31155,31156],{"class":1209,"line":1238},[1207,31157,1527],{"emptyLinePlaceholder":1526},[1207,31159,31160],{"class":1209,"line":1254},[1207,31161,31162],{"class":1213},"# Run load test with web UI\n",[1207,31164,31165,31168,31171,31174],{"class":1209,"line":1270},[1207,31166,31167],{"class":1220},"locust",[1207,31169,31170],{"class":13424}," -f",[1207,31172,31173],{"class":1224}," tests/load/locustfile.py",[1207,31175,31176],{"class":13424}," --host=http://localhost:8000\n",[1207,31178,31179],{"class":1209,"line":1535},[1207,31180,1527],{"emptyLinePlaceholder":1526},[1207,31182,31183],{"class":1209,"line":1710},[1207,31184,31185],{"class":1213},"# Then open http://localhost:8089 in your browser to configure and start the test\n",[1207,31187,31188],{"class":1209,"line":1727},[1207,31189,1527],{"emptyLinePlaceholder":1526},[1207,31191,31192],{"class":1209,"line":1732},[1207,31193,31194],{"class":1213},"# Run load test from command line (headless)\n",[1207,31196,31197,31199,31201,31203],{"class":1209,"line":1746},[1207,31198,31167],{"class":1220},[1207,31200,31170],{"class":13424},[1207,31202,31173],{"class":1224},[1207,31204,13429],{"class":13428},[1207,31206,31207,31210],{"class":1209,"line":1753},[1207,31208,31209],{"class":13424},"       --host=http://localhost:8000",[1207,31211,13429],{"class":13428},[1207,31213,31214,31217,31219],{"class":1209,"line":1760},[1207,31215,31216],{"class":13424},"       --users",[1207,31218,25963],{"class":1231},[1207,31220,13429],{"class":13428},[1207,31222,31223,31226,31228],{"class":1209,"line":1766},[1207,31224,31225],{"class":13424},"       --spawn-rate",[1207,31227,20146],{"class":1231},[1207,31229,13429],{"class":13428},[1207,31231,31232,31235,31238],{"class":1209,"line":1772},[1207,31233,31234],{"class":13424},"       --run-time",[1207,31236,31237],{"class":1224}," 5m",[1207,31239,13429],{"class":13428},[1207,31241,31242],{"class":1209,"line":1778},[1207,31243,31244],{"class":13424},"       --headless\n",[1207,31246,31247],{"class":1209,"line":1783},[1207,31248,1527],{"emptyLinePlaceholder":1526},[1207,31250,31251],{"class":1209,"line":1788},[1207,31252,31253],{"class":1213},"# Run with specific user class\n",[1207,31255,31256,31258,31260,31262],{"class":1209,"line":1803},[1207,31257,31167],{"class":1220},[1207,31259,31170],{"class":13424},[1207,31261,31173],{"class":1224},[1207,31263,13429],{"class":13428},[1207,31265,31266,31268],{"class":1209,"line":1821},[1207,31267,31209],{"class":13424},[1207,31269,13429],{"class":13428},[1207,31271,31272],{"class":1209,"line":1827},[1207,31273,31274],{"class":1224},"       UserServiceLoadTest\n",[1207,31276,31277],{"class":1209,"line":1833},[1207,31278,1527],{"emptyLinePlaceholder":1526},[1207,31280,31281],{"class":1209,"line":1839},[1207,31282,31283],{"class":1213},"# Generate HTML report\n",[1207,31285,31286,31288,31290,31292],{"class":1209,"line":1845},[1207,31287,31167],{"class":1220},[1207,31289,31170],{"class":13424},[1207,31291,31173],{"class":1224},[1207,31293,13429],{"class":13428},[1207,31295,31296,31298],{"class":1209,"line":1851},[1207,31297,31209],{"class":13424},[1207,31299,13429],{"class":13428},[1207,31301,31302,31304,31306],{"class":1209,"line":1856},[1207,31303,31216],{"class":13424},[1207,31305,25963],{"class":1231},[1207,31307,13429],{"class":13428},[1207,31309,31310,31312,31314],{"class":1209,"line":1869},[1207,31311,31225],{"class":13424},[1207,31313,20146],{"class":1231},[1207,31315,13429],{"class":13428},[1207,31317,31318,31320,31322],{"class":1209,"line":1874},[1207,31319,31234],{"class":13424},[1207,31321,31237],{"class":1224},[1207,31323,13429],{"class":13428},[1207,31325,31326,31329],{"class":1209,"line":1885},[1207,31327,31328],{"class":13424},"       --headless",[1207,31330,13429],{"class":13428},[1207,31332,31333],{"class":1209,"line":1899},[1207,31334,31335],{"class":13424},"       --html=load_test_report.html\n",[1026,31337,31338],{},[1045,31339,31340],{},"Interpreting Load Test Results:",[1197,31342,31346],{"className":31343,"code":31345,"language":3552},[31344],"language-text","Key metrics to analyze:\n\n1. Response Time Percentiles:\n   - p50 (median): 50% of requests are faster than this\n   - p95: 95% of requests are faster than this\n   - p99: 99% of requests are faster than this\n   \n   Example: If p95 is 500ms, 95% of users get responses in under 500ms\n\n2. Requests per Second (RPS):\n   - Total throughput your system can handle\n   - Should increase linearly with users (up to a point)\n   \n3. Failure Rate:\n   - Percentage of failed requests\n   - Should be \u003C 1% under normal load\n   - Spikes indicate system breaking points\n\n4. Response Time vs Users:\n   - Response time should stay relatively flat as users increase\n   - Sharp increases indicate bottlenecks\n",[1204,31347,31345],{"__ignoreMap":1202},[1026,31349,31350],{},[1045,31351,31352],{},"Load Testing Best Practices:",[1123,31354,31355,31361,31367,31373,31379,31385,31391,31397],{},[1084,31356,31357,31360],{},[1045,31358,31359],{},"Start Small",": Begin with low load and gradually increase",[1084,31362,31363,31366],{},[1045,31364,31365],{},"Test Realistic Scenarios",": Simulate actual user behavior patterns",[1084,31368,31369,31372],{},[1045,31370,31371],{},"Monitor Resources",": Watch CPU, memory, database connections",[1084,31374,31375,31378],{},[1045,31376,31377],{},"Test Different Patterns",": Steady load, spike tests, soak tests",[1084,31380,31381,31384],{},[1045,31382,31383],{},"Identify Bottlenecks",": Use profiling tools to find slow code",[1084,31386,31387,31390],{},[1045,31388,31389],{},"Test in Production-Like Environment",": Results vary by environment",[1084,31392,31393,31396],{},[1045,31394,31395],{},"Automate",": Run load tests regularly in CI/CD",[1084,31398,31399,31402],{},[1045,31400,31401],{},"Set Baselines",": Track performance over time",[1026,31404,31405],{},[1045,31406,31407],{},"Types of Load Tests:",[1197,31409,31411],{"className":1602,"code":31410,"language":1604,"meta":1202,"style":1202},"# Spike Test: Sudden increase in load\n# Run with: --users 1000 --spawn-rate 100 --run-time 2m\n\n# Soak Test: Sustained load over time\n# Run with: --users 100 --spawn-rate 10 --run-time 2h\n\n# Stress Test: Find breaking point\n# Run with: --users 5000 --spawn-rate 50 --run-time 10m\n\n# Scalability Test: Verify horizontal scaling\n# Run against multiple instances and compare results\n",[1204,31412,31413,31418,31423,31427,31432,31437,31441,31446,31451,31455,31460],{"__ignoreMap":1202},[1207,31414,31415],{"class":1209,"line":1210},[1207,31416,31417],{"class":1213},"# Spike Test: Sudden increase in load\n",[1207,31419,31420],{"class":1209,"line":1217},[1207,31421,31422],{"class":1213},"# Run with: --users 1000 --spawn-rate 100 --run-time 2m\n",[1207,31424,31425],{"class":1209,"line":1238},[1207,31426,1527],{"emptyLinePlaceholder":1526},[1207,31428,31429],{"class":1209,"line":1254},[1207,31430,31431],{"class":1213},"# Soak Test: Sustained load over time\n",[1207,31433,31434],{"class":1209,"line":1270},[1207,31435,31436],{"class":1213},"# Run with: --users 100 --spawn-rate 10 --run-time 2h\n",[1207,31438,31439],{"class":1209,"line":1535},[1207,31440,1527],{"emptyLinePlaceholder":1526},[1207,31442,31443],{"class":1209,"line":1710},[1207,31444,31445],{"class":1213},"# Stress Test: Find breaking point\n",[1207,31447,31448],{"class":1209,"line":1727},[1207,31449,31450],{"class":1213},"# Run with: --users 5000 --spawn-rate 50 --run-time 10m\n",[1207,31452,31453],{"class":1209,"line":1732},[1207,31454,1527],{"emptyLinePlaceholder":1526},[1207,31456,31457],{"class":1209,"line":1746},[1207,31458,31459],{"class":1213},"# Scalability Test: Verify horizontal scaling\n",[1207,31461,31462],{"class":1209,"line":1753},[1207,31463,31464],{"class":1213},"# Run against multiple instances and compare results\n",[1026,31466,31467],{},"This completes the comprehensive testing chapter with all major testing strategies for Django microservices!",[1030,31469,31471],{"id":31470},"testing-configuration-and-cicd","Testing Configuration and CI/CD",[1026,31473,31474],{},"Setting up proper testing configuration and continuous integration is crucial for maintaining code quality in microservices. This section covers how to configure your testing environment and integrate tests into your development workflow.",[1038,31476,31478],{"id":31477},"pytest-configuration","Pytest Configuration",[1026,31480,31481],{},"Pytest is highly configurable and can be customized to work perfectly with Django microservices. Here's a comprehensive configuration:",[1197,31483,31487],{"className":31484,"code":31485,"language":31486,"meta":1202,"style":1202},"language-ini shiki shiki-themes material-theme-lighter vitesse-light vitesse-dark","# pytest.ini\n[tool:pytest]\n# Django settings module for tests\nDJANGO_SETTINGS_MODULE = user_service.settings.test\n\n# Test discovery patterns\npython_files = tests.py test_*.py *_tests.py\npython_classes = Test*\npython_functions = test_*\n\n# Command line options that are always applied\naddopts = \n    --verbose                    # Show detailed test output\n    --tb=short                  # Shorter traceback format\n    --strict-markers            # Treat unknown markers as errors\n    --strict-config             # Treat config errors as errors\n    --disable-warnings          # Disable pytest warnings\n    --cov=user_service          # Code coverage for user_service package\n    --cov-report=term-missing   # Show missing lines in terminal\n    --cov-report=html           # Generate HTML coverage report\n    --cov-report=xml            # Generate XML coverage report (for CI)\n    --cov-fail-under=80         # Fail if coverage is below 80%\n    --maxfail=5                 # Stop after 5 failures\n    --durations=10              # Show 10 slowest tests\n\n# Test markers for categorizing tests\nmarkers =\n    unit: Unit tests (fast, isolated)\n    integration: Integration tests (database, external services)\n    contract: Contract tests (API agreements)\n    e2e: End-to-end tests (full system)\n    slow: Slow running tests (> 1 second)\n    smoke: Smoke tests (basic functionality)\n    regression: Regression tests (bug fixes)\n    security: Security-related tests\n    performance: Performance tests\n\n# Minimum Python version\nminversion = 6.0\n\n# Test paths\ntestpaths = tests\n\n# Ignore certain directories\nnorecursedirs = \n    .git\n    .tox\n    dist\n    build\n    *.egg\n    node_modules\n    .venv\n    venv\n","ini",[1204,31488,31489,31494,31499,31504,31509,31513,31518,31523,31528,31533,31537,31542,31547,31552,31557,31562,31567,31572,31577,31582,31587,31592,31597,31602,31607,31611,31616,31621,31626,31631,31636,31641,31646,31651,31656,31661,31666,31670,31675,31680,31684,31689,31694,31698,31703,31708,31713,31718,31723,31728,31733,31738,31743],{"__ignoreMap":1202},[1207,31490,31491],{"class":1209,"line":1210},[1207,31492,31493],{},"# pytest.ini\n",[1207,31495,31496],{"class":1209,"line":1217},[1207,31497,31498],{},"[tool:pytest]\n",[1207,31500,31501],{"class":1209,"line":1238},[1207,31502,31503],{},"# Django settings module for tests\n",[1207,31505,31506],{"class":1209,"line":1254},[1207,31507,31508],{},"DJANGO_SETTINGS_MODULE = user_service.settings.test\n",[1207,31510,31511],{"class":1209,"line":1270},[1207,31512,1527],{"emptyLinePlaceholder":1526},[1207,31514,31515],{"class":1209,"line":1535},[1207,31516,31517],{},"# Test discovery patterns\n",[1207,31519,31520],{"class":1209,"line":1710},[1207,31521,31522],{},"python_files = tests.py test_*.py *_tests.py\n",[1207,31524,31525],{"class":1209,"line":1727},[1207,31526,31527],{},"python_classes = Test*\n",[1207,31529,31530],{"class":1209,"line":1732},[1207,31531,31532],{},"python_functions = test_*\n",[1207,31534,31535],{"class":1209,"line":1746},[1207,31536,1527],{"emptyLinePlaceholder":1526},[1207,31538,31539],{"class":1209,"line":1753},[1207,31540,31541],{},"# Command line options that are always applied\n",[1207,31543,31544],{"class":1209,"line":1760},[1207,31545,31546],{},"addopts = \n",[1207,31548,31549],{"class":1209,"line":1766},[1207,31550,31551],{},"    --verbose                    # Show detailed test output\n",[1207,31553,31554],{"class":1209,"line":1772},[1207,31555,31556],{},"    --tb=short                  # Shorter traceback format\n",[1207,31558,31559],{"class":1209,"line":1778},[1207,31560,31561],{},"    --strict-markers            # Treat unknown markers as errors\n",[1207,31563,31564],{"class":1209,"line":1783},[1207,31565,31566],{},"    --strict-config             # Treat config errors as errors\n",[1207,31568,31569],{"class":1209,"line":1788},[1207,31570,31571],{},"    --disable-warnings          # Disable pytest warnings\n",[1207,31573,31574],{"class":1209,"line":1803},[1207,31575,31576],{},"    --cov=user_service          # Code coverage for user_service package\n",[1207,31578,31579],{"class":1209,"line":1821},[1207,31580,31581],{},"    --cov-report=term-missing   # Show missing lines in terminal\n",[1207,31583,31584],{"class":1209,"line":1827},[1207,31585,31586],{},"    --cov-report=html           # Generate HTML coverage report\n",[1207,31588,31589],{"class":1209,"line":1833},[1207,31590,31591],{},"    --cov-report=xml            # Generate XML coverage report (for CI)\n",[1207,31593,31594],{"class":1209,"line":1839},[1207,31595,31596],{},"    --cov-fail-under=80         # Fail if coverage is below 80%\n",[1207,31598,31599],{"class":1209,"line":1845},[1207,31600,31601],{},"    --maxfail=5                 # Stop after 5 failures\n",[1207,31603,31604],{"class":1209,"line":1851},[1207,31605,31606],{},"    --durations=10              # Show 10 slowest tests\n",[1207,31608,31609],{"class":1209,"line":1856},[1207,31610,1527],{"emptyLinePlaceholder":1526},[1207,31612,31613],{"class":1209,"line":1869},[1207,31614,31615],{},"# Test markers for categorizing tests\n",[1207,31617,31618],{"class":1209,"line":1874},[1207,31619,31620],{},"markers =\n",[1207,31622,31623],{"class":1209,"line":1885},[1207,31624,31625],{},"    unit: Unit tests (fast, isolated)\n",[1207,31627,31628],{"class":1209,"line":1899},[1207,31629,31630],{},"    integration: Integration tests (database, external services)\n",[1207,31632,31633],{"class":1209,"line":1904},[1207,31634,31635],{},"    contract: Contract tests (API agreements)\n",[1207,31637,31638],{"class":1209,"line":1910},[1207,31639,31640],{},"    e2e: End-to-end tests (full system)\n",[1207,31642,31643],{"class":1209,"line":1915},[1207,31644,31645],{},"    slow: Slow running tests (> 1 second)\n",[1207,31647,31648],{"class":1209,"line":1921},[1207,31649,31650],{},"    smoke: Smoke tests (basic functionality)\n",[1207,31652,31653],{"class":1209,"line":1927},[1207,31654,31655],{},"    regression: Regression tests (bug fixes)\n",[1207,31657,31658],{"class":1209,"line":1932},[1207,31659,31660],{},"    security: Security-related tests\n",[1207,31662,31663],{"class":1209,"line":1954},[1207,31664,31665],{},"    performance: Performance tests\n",[1207,31667,31668],{"class":1209,"line":1976},[1207,31669,1527],{"emptyLinePlaceholder":1526},[1207,31671,31672],{"class":1209,"line":1993},[1207,31673,31674],{},"# Minimum Python version\n",[1207,31676,31677],{"class":1209,"line":2009},[1207,31678,31679],{},"minversion = 6.0\n",[1207,31681,31682],{"class":1209,"line":2015},[1207,31683,1527],{"emptyLinePlaceholder":1526},[1207,31685,31686],{"class":1209,"line":2020},[1207,31687,31688],{},"# Test paths\n",[1207,31690,31691],{"class":1209,"line":2037},[1207,31692,31693],{},"testpaths = tests\n",[1207,31695,31696],{"class":1209,"line":2060},[1207,31697,1527],{"emptyLinePlaceholder":1526},[1207,31699,31700],{"class":1209,"line":2065},[1207,31701,31702],{},"# Ignore certain directories\n",[1207,31704,31705],{"class":1209,"line":2071},[1207,31706,31707],{},"norecursedirs = \n",[1207,31709,31710],{"class":1209,"line":2076},[1207,31711,31712],{},"    .git\n",[1207,31714,31715],{"class":1209,"line":2082},[1207,31716,31717],{},"    .tox\n",[1207,31719,31720],{"class":1209,"line":2088},[1207,31721,31722],{},"    dist\n",[1207,31724,31725],{"class":1209,"line":2094},[1207,31726,31727],{},"    build\n",[1207,31729,31730],{"class":1209,"line":2100},[1207,31731,31732],{},"    *.egg\n",[1207,31734,31735],{"class":1209,"line":2105},[1207,31736,31737],{},"    node_modules\n",[1207,31739,31740],{"class":1209,"line":2111},[1207,31741,31742],{},"    .venv\n",[1207,31744,31745],{"class":1209,"line":2139},[1207,31746,31747],{},"    venv\n",[1038,31749,31751],{"id":31750},"test-settings-configuration","Test Settings Configuration",[1026,31753,31754],{},"Create separate settings for testing to ensure tests run in isolation:",[1197,31756,31758],{"className":1602,"code":31757,"language":1604,"meta":1202,"style":1202},"# user_service/settings/test.py\n\"\"\"\nTest-specific Django settings\n\nThese settings optimize Django for testing by:\n- Using faster password hashers\n- Disabling migrations\n- Using in-memory databases\n- Disabling caching\n- Simplifying logging\n\"\"\"\n\nfrom .base import *\n\n# Test database - use SQLite in memory for speed\nDATABASES = {\n    'default': {\n        'ENGINE': 'django.db.backends.sqlite3',\n        'NAME': ':memory:',  # In-memory database for speed\n        'OPTIONS': {\n            'timeout': 20,\n        }\n    }\n}\n\n# Alternative: Use PostgreSQL for more realistic testing\n# DATABASES = {\n#     'default': {\n#         'ENGINE': 'django.db.backends.postgresql',\n#         'NAME': 'test_user_service',\n#         'USER': 'test_user',\n#         'PASSWORD': 'test_password',\n#         'HOST': 'localhost',\n#         'PORT': '5432',\n#         'TEST': {\n#             'NAME': 'test_user_service',\n#         }\n#     }\n# }\n\n# Disable migrations for faster tests\nclass DisableMigrations:\n    \"\"\"\n    Disable Django migrations during testing\n    \n    This speeds up tests by not running migrations.\n    Instead, Django creates tables directly from models.\n    \"\"\"\n    def __contains__(self, item):\n        return True\n    \n    def __getitem__(self, item):\n        return None\n\nMIGRATION_MODULES = DisableMigrations()\n\n# Use faster password hashers for tests\nPASSWORD_HASHERS = [\n    'django.contrib.auth.hashers.MD5PasswordHasher',  # Fast but insecure (OK for tests)\n]\n\n# Disable caching during tests\nCACHES = {\n    'default': {\n        'BACKEND': 'django.core.cache.backends.dummy.DummyCache',\n    }\n}\n\n# Test Celery settings - run tasks synchronously\nCELERY_TASK_ALWAYS_EAGER = True           # Execute tasks immediately\nCELERY_TASK_EAGER_PROPAGATES = True       # Propagate exceptions\nCELERY_BROKER_URL = 'memory://'            # Use in-memory broker\n\n# Disable logging during tests (unless debugging)\nLOGGING = {\n    'version': 1,\n    'disable_existing_loggers': False,\n    'handlers': {\n        'null': {\n            'class': 'logging.NullHandler',\n        },\n    },\n    'root': {\n        'handlers': ['null'],\n    },\n    'loggers': {\n        'django': {\n            'handlers': ['null'],\n            'propagate': False,\n        },\n        'user_service': {\n            'handlers': ['null'],\n            'propagate': False,\n        }\n    }\n}\n\n# Test-specific settings\nDEBUG = False                              # Disable debug mode\nTEMPLATE_DEBUG = False                     # Disable template debug\nEMAIL_BACKEND = 'django.core.mail.backends.locmem.EmailBackend'  # In-memory email\nSECRET_KEY = 'test-secret-key-not-for-production'\n\n# Media files for tests\nMEDIA_ROOT = '/tmp/test_media'\n\n# Static files\nSTATIC_ROOT = '/tmp/test_static'\n\n# Security settings (can be relaxed for tests)\nALLOWED_HOSTS = ['*']\nCORS_ALLOW_ALL_ORIGINS = True\n\n# Test-specific middleware (remove unnecessary middleware)\nMIDDLEWARE = [\n    'django.middleware.security.SecurityMiddleware',\n    'django.contrib.sessions.middleware.SessionMiddleware',\n    'django.middleware.common.CommonMiddleware',\n    'django.middleware.csrf.CsrfViewMiddleware',\n    'django.contrib.auth.middleware.AuthenticationMiddleware',\n    'django.contrib.messages.middleware.MessageMiddleware',\n]\n\n# Disable external service calls during tests\nEXTERNAL_SERVICES = {\n    'user_service_url': 'http://mock-user-service',\n    'order_service_url': 'http://mock-order-service',\n    'payment_service_url': 'http://mock-payment-service',\n}\n",[1204,31759,31760,31765,31769,31774,31778,31783,31788,31793,31798,31803,31808,31812,31816,31830,31834,31839,31848,31861,31880,31902,31914,31928,31932,31936,31940,31944,31949,31954,31959,31964,31969,31974,31979,31984,31989,31994,31999,32004,32009,32014,32018,32023,32032,32036,32041,32045,32050,32055,32059,32077,32083,32087,32104,32110,32114,32125,32129,32134,32143,32157,32161,32165,32170,32179,32191,32210,32214,32218,32222,32227,32239,32251,32268,32272,32277,32286,32300,32315,32328,32341,32360,32364,32369,32382,32402,32406,32419,32431,32451,32466,32470,32483,32503,32517,32521,32525,32529,32533,32538,32550,32562,32579,32593,32597,32602,32616,32620,32625,32639,32643,32648,32666,32675,32679,32684,32693,32704,32715,32726,32737,32748,32759,32763,32767,32772,32781,32801,32821,32841],{"__ignoreMap":1202},[1207,31761,31762],{"class":1209,"line":1210},[1207,31763,31764],{"class":1213},"# user_service/settings/test.py\n",[1207,31766,31767],{"class":1209,"line":1217},[1207,31768,6849],{"class":1749},[1207,31770,31771],{"class":1209,"line":1238},[1207,31772,31773],{"class":1756},"Test-specific Django settings\n",[1207,31775,31776],{"class":1209,"line":1254},[1207,31777,1527],{"emptyLinePlaceholder":1526},[1207,31779,31780],{"class":1209,"line":1270},[1207,31781,31782],{"class":1756},"These settings optimize Django for testing by:\n",[1207,31784,31785],{"class":1209,"line":1535},[1207,31786,31787],{"class":1756},"- Using faster password hashers\n",[1207,31789,31790],{"class":1209,"line":1710},[1207,31791,31792],{"class":1756},"- Disabling migrations\n",[1207,31794,31795],{"class":1209,"line":1727},[1207,31796,31797],{"class":1756},"- Using in-memory databases\n",[1207,31799,31800],{"class":1209,"line":1732},[1207,31801,31802],{"class":1756},"- Disabling caching\n",[1207,31804,31805],{"class":1209,"line":1746},[1207,31806,31807],{"class":1756},"- Simplifying logging\n",[1207,31809,31810],{"class":1209,"line":1753},[1207,31811,6849],{"class":1749},[1207,31813,31814],{"class":1209,"line":1760},[1207,31815,1527],{"emptyLinePlaceholder":1526},[1207,31817,31818,31820,31822,31825,31827],{"class":1209,"line":1766},[1207,31819,1626],{"class":1616},[1207,31821,13259],{"class":1632},[1207,31823,31824],{"class":1620},"base ",[1207,31826,1617],{"class":1616},[1207,31828,31829],{"class":2163}," *\n",[1207,31831,31832],{"class":1209,"line":1772},[1207,31833,1527],{"emptyLinePlaceholder":1526},[1207,31835,31836],{"class":1209,"line":1778},[1207,31837,31838],{"class":1213},"# Test database - use SQLite in memory for speed\n",[1207,31840,31841,31844,31846],{"class":1209,"line":1783},[1207,31842,31843],{"class":13428},"DATABASES",[1207,31845,2775],{"class":1632},[1207,31847,2445],{"class":1632},[1207,31849,31850,31853,31855,31857,31859],{"class":1209,"line":1788},[1207,31851,31852],{"class":1964},"    '",[1207,31854,17374],{"class":1224},[1207,31856,1965],{"class":1964},[1207,31858,2458],{"class":1632},[1207,31860,2445],{"class":1632},[1207,31862,31863,31865,31867,31869,31871,31873,31876,31878],{"class":1209,"line":1803},[1207,31864,9762],{"class":1964},[1207,31866,17387],{"class":1224},[1207,31868,1965],{"class":1964},[1207,31870,2458],{"class":1632},[1207,31872,2188],{"class":1964},[1207,31874,31875],{"class":1224},"django.db.backends.sqlite3",[1207,31877,1965],{"class":1964},[1207,31879,1973],{"class":1632},[1207,31881,31882,31884,31886,31888,31890,31892,31895,31897,31899],{"class":1209,"line":1821},[1207,31883,9762],{"class":1964},[1207,31885,17407],{"class":1224},[1207,31887,1965],{"class":1964},[1207,31889,2458],{"class":1632},[1207,31891,2188],{"class":1964},[1207,31893,31894],{"class":1224},":memory:",[1207,31896,1965],{"class":1964},[1207,31898,1644],{"class":1632},[1207,31900,31901],{"class":1213},"  # In-memory database for speed\n",[1207,31903,31904,31906,31908,31910,31912],{"class":1209,"line":1827},[1207,31905,9762],{"class":1964},[1207,31907,17770],{"class":1224},[1207,31909,1965],{"class":1964},[1207,31911,2458],{"class":1632},[1207,31913,2445],{"class":1632},[1207,31915,31916,31918,31920,31922,31924,31926],{"class":1209,"line":1833},[1207,31917,2451],{"class":1964},[1207,31919,21241],{"class":1224},[1207,31921,1965],{"class":1964},[1207,31923,2458],{"class":1632},[1207,31925,8850],{"class":1231},[1207,31927,1973],{"class":1632},[1207,31929,31930],{"class":1209,"line":1839},[1207,31931,2554],{"class":1632},[1207,31933,31934],{"class":1209,"line":1845},[1207,31935,10004],{"class":1632},[1207,31937,31938],{"class":1209,"line":1851},[1207,31939,2817],{"class":1632},[1207,31941,31942],{"class":1209,"line":1856},[1207,31943,1527],{"emptyLinePlaceholder":1526},[1207,31945,31946],{"class":1209,"line":1869},[1207,31947,31948],{"class":1213},"# Alternative: Use PostgreSQL for more realistic testing\n",[1207,31950,31951],{"class":1209,"line":1874},[1207,31952,31953],{"class":1213},"# DATABASES = {\n",[1207,31955,31956],{"class":1209,"line":1885},[1207,31957,31958],{"class":1213},"#     'default': {\n",[1207,31960,31961],{"class":1209,"line":1899},[1207,31962,31963],{"class":1213},"#         'ENGINE': 'django.db.backends.postgresql',\n",[1207,31965,31966],{"class":1209,"line":1904},[1207,31967,31968],{"class":1213},"#         'NAME': 'test_user_service',\n",[1207,31970,31971],{"class":1209,"line":1910},[1207,31972,31973],{"class":1213},"#         'USER': 'test_user',\n",[1207,31975,31976],{"class":1209,"line":1915},[1207,31977,31978],{"class":1213},"#         'PASSWORD': 'test_password',\n",[1207,31980,31981],{"class":1209,"line":1921},[1207,31982,31983],{"class":1213},"#         'HOST': 'localhost',\n",[1207,31985,31986],{"class":1209,"line":1927},[1207,31987,31988],{"class":1213},"#         'PORT': '5432',\n",[1207,31990,31991],{"class":1209,"line":1932},[1207,31992,31993],{"class":1213},"#         'TEST': {\n",[1207,31995,31996],{"class":1209,"line":1954},[1207,31997,31998],{"class":1213},"#             'NAME': 'test_user_service',\n",[1207,32000,32001],{"class":1209,"line":1976},[1207,32002,32003],{"class":1213},"#         }\n",[1207,32005,32006],{"class":1209,"line":1993},[1207,32007,32008],{"class":1213},"#     }\n",[1207,32010,32011],{"class":1209,"line":2009},[1207,32012,32013],{"class":1213},"# }\n",[1207,32015,32016],{"class":1209,"line":2015},[1207,32017,1527],{"emptyLinePlaceholder":1526},[1207,32019,32020],{"class":1209,"line":2020},[1207,32021,32022],{"class":1213},"# Disable migrations for faster tests\n",[1207,32024,32025,32027,32030],{"class":1209,"line":2037},[1207,32026,1736],{"class":1735},[1207,32028,32029],{"class":1739}," DisableMigrations",[1207,32031,1743],{"class":1632},[1207,32033,32034],{"class":1209,"line":2060},[1207,32035,1750],{"class":1749},[1207,32037,32038],{"class":1209,"line":2065},[1207,32039,32040],{"class":1756},"    Disable Django migrations during testing\n",[1207,32042,32043],{"class":1209,"line":2071},[1207,32044,1763],{"class":1756},[1207,32046,32047],{"class":1209,"line":2076},[1207,32048,32049],{"class":1756},"    This speeds up tests by not running migrations.\n",[1207,32051,32052],{"class":1209,"line":2082},[1207,32053,32054],{"class":1756},"    Instead, Django creates tables directly from models.\n",[1207,32056,32057],{"class":1209,"line":2088},[1207,32058,1750],{"class":1749},[1207,32060,32061,32063,32066,32068,32070,32072,32075],{"class":1209,"line":2094},[1207,32062,1806],{"class":1735},[1207,32064,32065],{"class":5160}," __contains__",[1207,32067,1811],{"class":1632},[1207,32069,1815],{"class":1814},[1207,32071,1644],{"class":1632},[1207,32073,32074],{"class":2051}," item",[1207,32076,1818],{"class":1632},[1207,32078,32079,32081],{"class":1209,"line":2100},[1207,32080,1859],{"class":1616},[1207,32082,2911],{"class":2813},[1207,32084,32085],{"class":1209,"line":2105},[1207,32086,1763],{"class":1620},[1207,32088,32089,32091,32094,32096,32098,32100,32102],{"class":1209,"line":2111},[1207,32090,1806],{"class":1735},[1207,32092,32093],{"class":5160}," __getitem__",[1207,32095,1811],{"class":1632},[1207,32097,1815],{"class":1814},[1207,32099,1644],{"class":1632},[1207,32101,32074],{"class":2051},[1207,32103,1818],{"class":1632},[1207,32105,32106,32108],{"class":1209,"line":2139},[1207,32107,1859],{"class":1616},[1207,32109,3856],{"class":2813},[1207,32111,32112],{"class":1209,"line":2144},[1207,32113,1527],{"emptyLinePlaceholder":1526},[1207,32115,32116,32119,32121,32123],{"class":1209,"line":2150},[1207,32117,32118],{"class":13428},"MIGRATION_MODULES",[1207,32120,2775],{"class":1632},[1207,32122,32029],{"class":1862},[1207,32124,1866],{"class":1632},[1207,32126,32127],{"class":1209,"line":2174},[1207,32128,1527],{"emptyLinePlaceholder":1526},[1207,32130,32131],{"class":1209,"line":2195},[1207,32132,32133],{"class":1213},"# Use faster password hashers for tests\n",[1207,32135,32136,32139,32141],{"class":1209,"line":2215},[1207,32137,32138],{"class":13428},"PASSWORD_HASHERS",[1207,32140,2775],{"class":1632},[1207,32142,5664],{"class":1632},[1207,32144,32145,32147,32150,32152,32154],{"class":1209,"line":2220},[1207,32146,31852],{"class":1964},[1207,32148,32149],{"class":1224},"django.contrib.auth.hashers.MD5PasswordHasher",[1207,32151,1965],{"class":1964},[1207,32153,1644],{"class":1632},[1207,32155,32156],{"class":1213},"  # Fast but insecure (OK for tests)\n",[1207,32158,32159],{"class":1209,"line":2235},[1207,32160,13328],{"class":1632},[1207,32162,32163],{"class":1209,"line":2253},[1207,32164,1527],{"emptyLinePlaceholder":1526},[1207,32166,32167],{"class":1209,"line":2258},[1207,32168,32169],{"class":1213},"# Disable caching during tests\n",[1207,32171,32172,32175,32177],{"class":1209,"line":2264},[1207,32173,32174],{"class":13428},"CACHES",[1207,32176,2775],{"class":1632},[1207,32178,2445],{"class":1632},[1207,32180,32181,32183,32185,32187,32189],{"class":1209,"line":2269},[1207,32182,31852],{"class":1964},[1207,32184,17374],{"class":1224},[1207,32186,1965],{"class":1964},[1207,32188,2458],{"class":1632},[1207,32190,2445],{"class":1632},[1207,32192,32193,32195,32197,32199,32201,32203,32206,32208],{"class":1209,"line":2275},[1207,32194,9762],{"class":1964},[1207,32196,17734],{"class":1224},[1207,32198,1965],{"class":1964},[1207,32200,2458],{"class":1632},[1207,32202,2188],{"class":1964},[1207,32204,32205],{"class":1224},"django.core.cache.backends.dummy.DummyCache",[1207,32207,1965],{"class":1964},[1207,32209,1973],{"class":1632},[1207,32211,32212],{"class":1209,"line":2281},[1207,32213,10004],{"class":1632},[1207,32215,32216],{"class":1209,"line":2286},[1207,32217,2817],{"class":1632},[1207,32219,32220],{"class":1209,"line":2292},[1207,32221,1527],{"emptyLinePlaceholder":1526},[1207,32223,32224],{"class":1209,"line":2313},[1207,32225,32226],{"class":1213},"# Test Celery settings - run tasks synchronously\n",[1207,32228,32229,32232,32234,32236],{"class":1209,"line":2334},[1207,32230,32231],{"class":13428},"CELERY_TASK_ALWAYS_EAGER",[1207,32233,2775],{"class":1632},[1207,32235,2814],{"class":2813},[1207,32237,32238],{"class":1213},"           # Execute tasks immediately\n",[1207,32240,32241,32244,32246,32248],{"class":1209,"line":2339},[1207,32242,32243],{"class":13428},"CELERY_TASK_EAGER_PROPAGATES",[1207,32245,2775],{"class":1632},[1207,32247,2814],{"class":2813},[1207,32249,32250],{"class":1213},"       # Propagate exceptions\n",[1207,32252,32253,32256,32258,32260,32263,32265],{"class":1209,"line":2358},[1207,32254,32255],{"class":13428},"CELERY_BROKER_URL",[1207,32257,2775],{"class":1632},[1207,32259,2188],{"class":1964},[1207,32261,32262],{"class":1224},"memory://",[1207,32264,1965],{"class":1964},[1207,32266,32267],{"class":1213},"            # Use in-memory broker\n",[1207,32269,32270],{"class":1209,"line":2381},[1207,32271,1527],{"emptyLinePlaceholder":1526},[1207,32273,32274],{"class":1209,"line":2386},[1207,32275,32276],{"class":1213},"# Disable logging during tests (unless debugging)\n",[1207,32278,32279,32282,32284],{"class":1209,"line":2392},[1207,32280,32281],{"class":13428},"LOGGING",[1207,32283,2775],{"class":1632},[1207,32285,2445],{"class":1632},[1207,32287,32288,32290,32292,32294,32296,32298],{"class":1209,"line":2397},[1207,32289,31852],{"class":1964},[1207,32291,20172],{"class":1224},[1207,32293,1965],{"class":1964},[1207,32295,2458],{"class":1632},[1207,32297,22275],{"class":1231},[1207,32299,1973],{"class":1632},[1207,32301,32302,32304,32307,32309,32311,32313],{"class":1209,"line":2403},[1207,32303,31852],{"class":1964},[1207,32305,32306],{"class":1224},"disable_existing_loggers",[1207,32308,1965],{"class":1964},[1207,32310,2458],{"class":1632},[1207,32312,11104],{"class":2813},[1207,32314,1973],{"class":1632},[1207,32316,32317,32319,32322,32324,32326],{"class":1209,"line":2409},[1207,32318,31852],{"class":1964},[1207,32320,32321],{"class":1224},"handlers",[1207,32323,1965],{"class":1964},[1207,32325,2458],{"class":1632},[1207,32327,2445],{"class":1632},[1207,32329,32330,32332,32335,32337,32339],{"class":1209,"line":2414},[1207,32331,9762],{"class":1964},[1207,32333,32334],{"class":1224},"null",[1207,32336,1965],{"class":1964},[1207,32338,2458],{"class":1632},[1207,32340,2445],{"class":1632},[1207,32342,32343,32345,32347,32349,32351,32353,32356,32358],{"class":1209,"line":2420},[1207,32344,2451],{"class":1964},[1207,32346,1736],{"class":1224},[1207,32348,1965],{"class":1964},[1207,32350,2458],{"class":1632},[1207,32352,2188],{"class":1964},[1207,32354,32355],{"class":1224},"logging.NullHandler",[1207,32357,1965],{"class":1964},[1207,32359,1973],{"class":1632},[1207,32361,32362],{"class":1209,"line":2426},[1207,32363,25990],{"class":1632},[1207,32365,32366],{"class":1209,"line":2431},[1207,32367,32368],{"class":1632},"    },\n",[1207,32370,32371,32373,32376,32378,32380],{"class":1209,"line":2437},[1207,32372,31852],{"class":1964},[1207,32374,32375],{"class":1224},"root",[1207,32377,1965],{"class":1964},[1207,32379,2458],{"class":1632},[1207,32381,2445],{"class":1632},[1207,32383,32384,32386,32388,32390,32392,32394,32396,32398,32400],{"class":1209,"line":2448},[1207,32385,9762],{"class":1964},[1207,32387,32321],{"class":1224},[1207,32389,1965],{"class":1964},[1207,32391,2458],{"class":1632},[1207,32393,9226],{"class":1632},[1207,32395,1965],{"class":1964},[1207,32397,32334],{"class":1224},[1207,32399,1965],{"class":1964},[1207,32401,22182],{"class":1632},[1207,32403,32404],{"class":1209,"line":2470},[1207,32405,32368],{"class":1632},[1207,32407,32408,32410,32413,32415,32417],{"class":1209,"line":2490},[1207,32409,31852],{"class":1964},[1207,32411,32412],{"class":1224},"loggers",[1207,32414,1965],{"class":1964},[1207,32416,2458],{"class":1632},[1207,32418,2445],{"class":1632},[1207,32420,32421,32423,32425,32427,32429],{"class":1209,"line":2511},[1207,32422,9762],{"class":1964},[1207,32424,3182],{"class":1224},[1207,32426,1965],{"class":1964},[1207,32428,2458],{"class":1632},[1207,32430,2445],{"class":1632},[1207,32432,32433,32435,32437,32439,32441,32443,32445,32447,32449],{"class":1209,"line":2532},[1207,32434,2451],{"class":1964},[1207,32436,32321],{"class":1224},[1207,32438,1965],{"class":1964},[1207,32440,2458],{"class":1632},[1207,32442,9226],{"class":1632},[1207,32444,1965],{"class":1964},[1207,32446,32334],{"class":1224},[1207,32448,1965],{"class":1964},[1207,32450,22182],{"class":1632},[1207,32452,32453,32455,32458,32460,32462,32464],{"class":1209,"line":2551},[1207,32454,2451],{"class":1964},[1207,32456,32457],{"class":1224},"propagate",[1207,32459,1965],{"class":1964},[1207,32461,2458],{"class":1632},[1207,32463,11104],{"class":2813},[1207,32465,1973],{"class":1632},[1207,32467,32468],{"class":1209,"line":2557},[1207,32469,25990],{"class":1632},[1207,32471,32472,32474,32477,32479,32481],{"class":1209,"line":2562},[1207,32473,9762],{"class":1964},[1207,32475,32476],{"class":1224},"user_service",[1207,32478,1965],{"class":1964},[1207,32480,2458],{"class":1632},[1207,32482,2445],{"class":1632},[1207,32484,32485,32487,32489,32491,32493,32495,32497,32499,32501],{"class":1209,"line":2567},[1207,32486,2451],{"class":1964},[1207,32488,32321],{"class":1224},[1207,32490,1965],{"class":1964},[1207,32492,2458],{"class":1632},[1207,32494,9226],{"class":1632},[1207,32496,1965],{"class":1964},[1207,32498,32334],{"class":1224},[1207,32500,1965],{"class":1964},[1207,32502,22182],{"class":1632},[1207,32504,32505,32507,32509,32511,32513,32515],{"class":1209,"line":2588},[1207,32506,2451],{"class":1964},[1207,32508,32457],{"class":1224},[1207,32510,1965],{"class":1964},[1207,32512,2458],{"class":1632},[1207,32514,11104],{"class":2813},[1207,32516,1973],{"class":1632},[1207,32518,32519],{"class":1209,"line":2593},[1207,32520,2554],{"class":1632},[1207,32522,32523],{"class":1209,"line":2599},[1207,32524,10004],{"class":1632},[1207,32526,32527],{"class":1209,"line":2619},[1207,32528,2817],{"class":1632},[1207,32530,32531],{"class":1209,"line":2624},[1207,32532,1527],{"emptyLinePlaceholder":1526},[1207,32534,32535],{"class":1209,"line":2630},[1207,32536,32537],{"class":1213},"# Test-specific settings\n",[1207,32539,32540,32543,32545,32547],{"class":1209,"line":2652},[1207,32541,32542],{"class":13428},"DEBUG",[1207,32544,2775],{"class":1632},[1207,32546,11104],{"class":2813},[1207,32548,32549],{"class":1213},"                              # Disable debug mode\n",[1207,32551,32552,32555,32557,32559],{"class":1209,"line":2657},[1207,32553,32554],{"class":13428},"TEMPLATE_DEBUG",[1207,32556,2775],{"class":1632},[1207,32558,11104],{"class":2813},[1207,32560,32561],{"class":1213},"                     # Disable template debug\n",[1207,32563,32564,32567,32569,32571,32574,32576],{"class":1209,"line":2675},[1207,32565,32566],{"class":13428},"EMAIL_BACKEND",[1207,32568,2775],{"class":1632},[1207,32570,2188],{"class":1964},[1207,32572,32573],{"class":1224},"django.core.mail.backends.locmem.EmailBackend",[1207,32575,1965],{"class":1964},[1207,32577,32578],{"class":1213},"  # In-memory email\n",[1207,32580,32581,32584,32586,32588,32591],{"class":1209,"line":2702},[1207,32582,32583],{"class":13428},"SECRET_KEY",[1207,32585,2775],{"class":1632},[1207,32587,2188],{"class":1964},[1207,32589,32590],{"class":1224},"test-secret-key-not-for-production",[1207,32592,2006],{"class":1964},[1207,32594,32595],{"class":1209,"line":2707},[1207,32596,1527],{"emptyLinePlaceholder":1526},[1207,32598,32599],{"class":1209,"line":2713},[1207,32600,32601],{"class":1213},"# Media files for tests\n",[1207,32603,32604,32607,32609,32611,32614],{"class":1209,"line":2718},[1207,32605,32606],{"class":13428},"MEDIA_ROOT",[1207,32608,2775],{"class":1632},[1207,32610,2188],{"class":1964},[1207,32612,32613],{"class":1224},"/tmp/test_media",[1207,32615,2006],{"class":1964},[1207,32617,32618],{"class":1209,"line":2724},[1207,32619,1527],{"emptyLinePlaceholder":1526},[1207,32621,32622],{"class":1209,"line":2730},[1207,32623,32624],{"class":1213},"# Static files\n",[1207,32626,32627,32630,32632,32634,32637],{"class":1209,"line":2736},[1207,32628,32629],{"class":13428},"STATIC_ROOT",[1207,32631,2775],{"class":1632},[1207,32633,2188],{"class":1964},[1207,32635,32636],{"class":1224},"/tmp/test_static",[1207,32638,2006],{"class":1964},[1207,32640,32641],{"class":1209,"line":2742},[1207,32642,1527],{"emptyLinePlaceholder":1526},[1207,32644,32645],{"class":1209,"line":2748},[1207,32646,32647],{"class":1213},"# Security settings (can be relaxed for tests)\n",[1207,32649,32650,32653,32655,32657,32659,32662,32664],{"class":1209,"line":2753},[1207,32651,32652],{"class":13428},"ALLOWED_HOSTS",[1207,32654,2775],{"class":1632},[1207,32656,9226],{"class":1632},[1207,32658,1965],{"class":1964},[1207,32660,32661],{"class":1224},"*",[1207,32663,1965],{"class":1964},[1207,32665,13328],{"class":1632},[1207,32667,32668,32671,32673],{"class":1209,"line":2759},[1207,32669,32670],{"class":13428},"CORS_ALLOW_ALL_ORIGINS",[1207,32672,2775],{"class":1632},[1207,32674,2911],{"class":2813},[1207,32676,32677],{"class":1209,"line":2781},[1207,32678,1527],{"emptyLinePlaceholder":1526},[1207,32680,32681],{"class":1209,"line":2820},[1207,32682,32683],{"class":1213},"# Test-specific middleware (remove unnecessary middleware)\n",[1207,32685,32686,32689,32691],{"class":1209,"line":2825},[1207,32687,32688],{"class":13428},"MIDDLEWARE",[1207,32690,2775],{"class":1632},[1207,32692,5664],{"class":1632},[1207,32694,32695,32697,32700,32702],{"class":1209,"line":2830},[1207,32696,31852],{"class":1964},[1207,32698,32699],{"class":1224},"django.middleware.security.SecurityMiddleware",[1207,32701,1965],{"class":1964},[1207,32703,1973],{"class":1632},[1207,32705,32706,32708,32711,32713],{"class":1209,"line":2846},[1207,32707,31852],{"class":1964},[1207,32709,32710],{"class":1224},"django.contrib.sessions.middleware.SessionMiddleware",[1207,32712,1965],{"class":1964},[1207,32714,1973],{"class":1632},[1207,32716,32717,32719,32722,32724],{"class":1209,"line":2861},[1207,32718,31852],{"class":1964},[1207,32720,32721],{"class":1224},"django.middleware.common.CommonMiddleware",[1207,32723,1965],{"class":1964},[1207,32725,1973],{"class":1632},[1207,32727,32728,32730,32733,32735],{"class":1209,"line":2884},[1207,32729,31852],{"class":1964},[1207,32731,32732],{"class":1224},"django.middleware.csrf.CsrfViewMiddleware",[1207,32734,1965],{"class":1964},[1207,32736,1973],{"class":1632},[1207,32738,32739,32741,32744,32746],{"class":1209,"line":2889},[1207,32740,31852],{"class":1964},[1207,32742,32743],{"class":1224},"django.contrib.auth.middleware.AuthenticationMiddleware",[1207,32745,1965],{"class":1964},[1207,32747,1973],{"class":1632},[1207,32749,32750,32752,32755,32757],{"class":1209,"line":2894},[1207,32751,31852],{"class":1964},[1207,32753,32754],{"class":1224},"django.contrib.messages.middleware.MessageMiddleware",[1207,32756,1965],{"class":1964},[1207,32758,1973],{"class":1632},[1207,32760,32761],{"class":1209,"line":2900},[1207,32762,13328],{"class":1632},[1207,32764,32765],{"class":1209,"line":2914},[1207,32766,1527],{"emptyLinePlaceholder":1526},[1207,32768,32769],{"class":1209,"line":2919},[1207,32770,32771],{"class":1213},"# Disable external service calls during tests\n",[1207,32773,32774,32777,32779],{"class":1209,"line":2925},[1207,32775,32776],{"class":13428},"EXTERNAL_SERVICES",[1207,32778,2775],{"class":1632},[1207,32780,2445],{"class":1632},[1207,32782,32783,32785,32788,32790,32792,32794,32797,32799],{"class":1209,"line":2945},[1207,32784,31852],{"class":1964},[1207,32786,32787],{"class":1224},"user_service_url",[1207,32789,1965],{"class":1964},[1207,32791,2458],{"class":1632},[1207,32793,2188],{"class":1964},[1207,32795,32796],{"class":1224},"http://mock-user-service",[1207,32798,1965],{"class":1964},[1207,32800,1973],{"class":1632},[1207,32802,32803,32805,32808,32810,32812,32814,32817,32819],{"class":1209,"line":2950},[1207,32804,31852],{"class":1964},[1207,32806,32807],{"class":1224},"order_service_url",[1207,32809,1965],{"class":1964},[1207,32811,2458],{"class":1632},[1207,32813,2188],{"class":1964},[1207,32815,32816],{"class":1224},"http://mock-order-service",[1207,32818,1965],{"class":1964},[1207,32820,1973],{"class":1632},[1207,32822,32823,32825,32828,32830,32832,32834,32837,32839],{"class":1209,"line":2956},[1207,32824,31852],{"class":1964},[1207,32826,32827],{"class":1224},"payment_service_url",[1207,32829,1965],{"class":1964},[1207,32831,2458],{"class":1632},[1207,32833,2188],{"class":1964},[1207,32835,32836],{"class":1224},"http://mock-payment-service",[1207,32838,1965],{"class":1964},[1207,32840,1973],{"class":1632},[1207,32842,32843],{"class":1209,"line":2971},[1207,32844,2817],{"class":1632},[1038,32846,32848],{"id":32847},"github-actions-cicd-pipeline","GitHub Actions CI/CD Pipeline",[1026,32850,32851],{},"Here's a comprehensive CI/CD pipeline that runs all types of tests:",[1197,32853,32855],{"className":20157,"code":32854,"language":20159,"meta":1202,"style":1202},"# .github/workflows/test.yml\nname: Test Microservices\n\non:\n  push:\n    branches: [ main, develop ]\n  pull_request:\n    branches: [ main ]\n\nenv:\n  PYTHON_VERSION: '3.11'\n\njobs:\n  # Lint and code quality checks\n  lint:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n    \n    - name: Set up Python\n      uses: actions/setup-python@v4\n      with:\n        python-version: ${{ env.PYTHON_VERSION }}\n    \n    - name: Install dependencies\n      run: |\n        python -m pip install --upgrade pip\n        pip install flake8 black isort mypy\n        pip install -r requirements.txt\n    \n    - name: Lint with flake8\n      run: |\n        # Stop the build if there are Python syntax errors or undefined names\n        flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics\n        # Exit-zero treats all errors as warnings\n        flake8 . --count --exit-zero --max-complexity=10 --max-line-length=88 --statistics\n    \n    - name: Check code formatting with black\n      run: black --check .\n    \n    - name: Check import sorting with isort\n      run: isort --check-only .\n    \n    - name: Type checking with mypy\n      run: mypy user_service --ignore-missing-imports\n\n  # Unit tests for each service\n  unit-tests:\n    runs-on: ubuntu-latest\n    strategy:\n      matrix:\n        service: [user-service, order-service, payment-service]\n    \n    steps:\n    - uses: actions/checkout@v4\n    \n    - name: Set up Python\n      uses: actions/setup-python@v4\n      with:\n        python-version: ${{ env.PYTHON_VERSION }}\n    \n    - name: Cache pip dependencies\n      uses: actions/cache@v3\n      with:\n        path: ~/.cache/pip\n        key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}\n        restore-keys: |\n          ${{ runner.os }}-pip-\n    \n    - name: Install dependencies\n      run: |\n        cd ${{ matrix.service }}\n        pip install -r requirements.txt\n        pip install -r requirements-test.txt\n    \n    - name: Run unit tests\n      run: |\n        cd ${{ matrix.service }}\n        pytest tests/unit/ -m \"unit and not slow\" \\\n               --cov --cov-report=xml \\\n               --junitxml=test-results.xml\n    \n    - name: Upload coverage to Codecov\n      uses: codecov/codecov-action@v3\n      with:\n        file: ${{ matrix.service }}/coverage.xml\n        flags: ${{ matrix.service }}-unit\n        name: ${{ matrix.service }}-unit-coverage\n    \n    - name: Upload test results\n      uses: actions/upload-artifact@v3\n      if: always()\n      with:\n        name: test-results-${{ matrix.service }}\n        path: ${{ matrix.service }}/test-results.xml\n\n  # Integration tests with real databases\n  integration-tests:\n    runs-on: ubuntu-latest\n    needs: unit-tests\n    \n    services:\n      postgres:\n        image: postgres:13\n        env:\n          POSTGRES_PASSWORD: postgres\n          POSTGRES_DB: test_db\n        options: >-\n          --health-cmd pg_isready\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          - 5432:5432\n      \n      redis:\n        image: redis:6\n        options: >-\n          --health-cmd \"redis-cli ping\"\n          --health-interval 10s\n          --health-timeout 5s\n          --health-retries 5\n        ports:\n          - 6379:6379\n      \n      rabbitmq:\n        image: rabbitmq:3.11\n        env:\n          RABBITMQ_DEFAULT_USER: test\n          RABBITMQ_DEFAULT_PASS: test\n        options: >-\n          --health-cmd \"rabbitmq-diagnostics -q ping\"\n          --health-interval 30s\n          --health-timeout 30s\n          --health-retries 3\n        ports:\n          - 5672:5672\n    \n    steps:\n    - uses: actions/checkout@v4\n    \n    - name: Set up Python\n      uses: actions/setup-python@v4\n      with:\n        python-version: ${{ env.PYTHON_VERSION }}\n    \n    - name: Install dependencies\n      run: |\n        pip install -r requirements.txt\n        pip install -r requirements-test.txt\n    \n    - name: Run integration tests\n      env:\n        DATABASE_URL: postgres://postgres:postgres@localhost:5432/test_db\n        REDIS_URL: redis://localhost:6379/0\n        RABBITMQ_URL: amqp://test:test@localhost:5672//\n      run: |\n        pytest tests/integration/ -m \"integration\" \\\n               --cov --cov-report=xml \\\n               --maxfail=3\n    \n    - name: Upload integration coverage\n      uses: codecov/codecov-action@v3\n      with:\n        file: coverage.xml\n        flags: integration\n        name: integration-coverage\n\n  # Contract tests\n  contract-tests:\n    runs-on: ubuntu-latest\n    needs: integration-tests\n    \n    steps:\n    - uses: actions/checkout@v4\n    \n    - name: Set up Python\n      uses: actions/setup-python@v4\n      with:\n        python-version: ${{ env.PYTHON_VERSION }}\n    \n    - name: Install Pact\n      run: |\n        pip install pact-python\n        pip install -r requirements.txt\n    \n    - name: Run consumer contract tests\n      run: |\n        pytest tests/contract/ -m \"contract\"\n    \n    - name: Publish Pacts\n      if: github.ref == 'refs/heads/main'\n      run: |\n        pact-broker publish pacts/ \\\n          --broker-base-url ${{ secrets.PACT_BROKER_URL }} \\\n          --broker-username ${{ secrets.PACT_BROKER_USERNAME }} \\\n          --broker-password ${{ secrets.PACT_BROKER_PASSWORD }}\n\n  # End-to-end tests\n  e2e-tests:\n    runs-on: ubuntu-latest\n    needs: contract-tests\n    if: github.ref == 'refs/heads/main' || github.event_name == 'pull_request'\n    \n    steps:\n    - uses: actions/checkout@v4\n    \n    - name: Set up Docker Buildx\n      uses: docker/setup-buildx-action@v2\n    \n    - name: Start services with Docker Compose\n      run: |\n        docker-compose -f docker-compose.test.yml up -d\n        sleep 60  # Wait for services to be ready\n    \n    - name: Check service health\n      run: |\n        curl -f http://localhost:8000/health/ || exit 1\n        curl -f http://localhost:8001/health/ || exit 1\n        curl -f http://localhost:8002/health/ || exit 1\n    \n    - name: Set up Python for E2E tests\n      uses: actions/setup-python@v4\n      with:\n        python-version: ${{ env.PYTHON_VERSION }}\n    \n    - name: Install E2E test dependencies\n      run: |\n        pip install pytest requests\n    \n    - name: Run E2E tests\n      run: |\n        pytest tests/e2e/ -m \"e2e\" \\\n               --maxfail=1 \\\n               -v\n    \n    - name: Collect service logs\n      if: failure()\n      run: |\n        docker-compose -f docker-compose.test.yml logs > service-logs.txt\n    \n    - name: Upload service logs\n      if: failure()\n      uses: actions/upload-artifact@v3\n      with:\n        name: service-logs\n        path: service-logs.txt\n    \n    - name: Cleanup\n      if: always()\n      run: |\n        docker-compose -f docker-compose.test.yml down -v\n\n  # Security tests\n  security-tests:\n    runs-on: ubuntu-latest\n    needs: unit-tests\n    \n    steps:\n    - uses: actions/checkout@v4\n    \n    - name: Set up Python\n      uses: actions/setup-python@v4\n      with:\n        python-version: ${{ env.PYTHON_VERSION }}\n    \n    - name: Install security tools\n      run: |\n        pip install bandit safety\n        pip install -r requirements.txt\n    \n    - name: Run Bandit security linter\n      run: |\n        bandit -r . -f json -o bandit-report.json || true\n    \n    - name: Check for known security vulnerabilities\n      run: |\n        safety check --json --output safety-report.json || true\n    \n    - name: Upload security reports\n      uses: actions/upload-artifact@v3\n      with:\n        name: security-reports\n        path: |\n          bandit-report.json\n          safety-report.json\n\n  # Performance tests (optional, run on schedule)\n  performance-tests:\n    runs-on: ubuntu-latest\n    if: github.event_name == 'schedule' || contains(github.event.head_commit.message, '[perf]')\n    \n    steps:\n    - uses: actions/checkout@v4\n    \n    - name: Set up services\n      run: |\n        docker-compose -f docker-compose.test.yml up -d\n        sleep 60\n    \n    - name: Set up Python\n      uses: actions/setup-python@v4\n      with:\n        python-version: ${{ env.PYTHON_VERSION }}\n    \n    - name: Install Locust\n      run: pip install locust\n    \n    - name: Run performance tests\n      run: |\n        locust -f tests/load/locustfile.py \\\n               --host=http://localhost:8000 \\\n               --users 50 \\\n               --spawn-rate 5 \\\n               --run-time 2m \\\n               --headless \\\n               --html=performance-report.html\n    \n    - name: Upload performance report\n      uses: actions/upload-artifact@v3\n      with:\n        name: performance-report\n        path: performance-report.html\n    \n    - name: Cleanup\n      if: always()\n      run: |\n        docker-compose -f docker-compose.test.yml down -v\n\n# Scheduled performance tests (weekly)\n# on:\n#   schedule:\n#     - cron: '0 2 * * 1'  # Every Monday at 2 AM\n",[1204,32856,32857,32862,32871,32875,32883,32890,32910,32917,32929,32933,32940,32954,32958,32965,32970,32977,32987,32994,33007,33011,33022,33032,33039,33049,33053,33064,33074,33079,33084,33089,33093,33104,33112,33117,33122,33127,33132,33136,33147,33156,33160,33171,33180,33184,33195,33204,33208,33213,33220,33228,33235,33242,33265,33269,33275,33285,33289,33299,33307,33313,33321,33325,33336,33345,33351,33361,33371,33380,33385,33389,33399,33407,33412,33416,33421,33425,33436,33444,33448,33453,33458,33463,33467,33478,33487,33493,33503,33513,33523,33527,33538,33547,33557,33563,33572,33581,33585,33590,33597,33605,33615,33619,33626,33633,33642,33649,33658,33667,33679,33684,33689,33694,33699,33706,33714,33719,33726,33734,33744,33749,33753,33757,33761,33767,33774,33778,33785,33794,33800,33810,33819,33829,33834,33839,33844,33849,33855,33862,33866,33872,33882,33886,33896,33904,33910,33918,33922,33932,33940,33944,33948,33952,33963,33970,33980,33990,34000,34008,34013,34017,34022,34026,34037,34045,34051,34060,34068,34077,34081,34086,34093,34101,34110,34114,34120,34130,34134,34144,34152,34158,34166,34170,34181,34189,34194,34198,34202,34213,34221,34226,34230,34241,34250,34258,34263,34268,34273,34278,34282,34287,34294,34302,34311,34320,34324,34330,34340,34344,34355,34364,34368,34379,34387,34392,34397,34401,34412,34420,34425,34430,34435,34439,34450,34458,34464,34472,34476,34487,34495,34500,34504,34515,34523,34528,34533,34538,34542,34553,34562,34570,34575,34579,34590,34598,34606,34612,34621,34630,34634,34645,34653,34661,34666,34670,34675,34682,34690,34698,34702,34708,34718,34722,34732,34740,34746,34754,34758,34769,34777,34782,34786,34790,34801,34809,34814,34818,34829,34837,34842,34846,34857,34865,34871,34880,34888,34893,34898,34902,34907,34914,34922,34931,34935,34941,34951,34955,34966,34974,34978,34983,34987,34997,35005,35011,35019,35023,35034,35043,35047,35058,35066,35071,35076,35081,35086,35091,35096,35101,35105,35116,35124,35130,35139,35148,35152,35162,35170,35178,35182,35186,35191,35196,35201],{"__ignoreMap":1202},[1207,32858,32859],{"class":1209,"line":1210},[1207,32860,32861],{"class":1213},"# .github/workflows/test.yml\n",[1207,32863,32864,32866,32868],{"class":1209,"line":1217},[1207,32865,25920],{"class":20171},[1207,32867,2458],{"class":1632},[1207,32869,32870],{"class":1224}," Test Microservices\n",[1207,32872,32873],{"class":1209,"line":1238},[1207,32874,1527],{"emptyLinePlaceholder":1526},[1207,32876,32877,32881],{"class":1209,"line":1254},[1207,32878,32880],{"class":32879},"sq3J1","on",[1207,32882,1743],{"class":1632},[1207,32884,32885,32888],{"class":1209,"line":1270},[1207,32886,32887],{"class":20171},"  push",[1207,32889,1743],{"class":1632},[1207,32891,32892,32895,32897,32899,32902,32904,32907],{"class":1209,"line":1535},[1207,32893,32894],{"class":20171},"    branches",[1207,32896,2458],{"class":1632},[1207,32898,9226],{"class":1632},[1207,32900,32901],{"class":1224}," main",[1207,32903,1644],{"class":1632},[1207,32905,32906],{"class":1224}," develop",[1207,32908,32909],{"class":1632}," ]\n",[1207,32911,32912,32915],{"class":1209,"line":1710},[1207,32913,32914],{"class":20171},"  pull_request",[1207,32916,1743],{"class":1632},[1207,32918,32919,32921,32923,32925,32927],{"class":1209,"line":1727},[1207,32920,32894],{"class":20171},[1207,32922,2458],{"class":1632},[1207,32924,9226],{"class":1632},[1207,32926,32901],{"class":1224},[1207,32928,32909],{"class":1632},[1207,32930,32931],{"class":1209,"line":1732},[1207,32932,1527],{"emptyLinePlaceholder":1526},[1207,32934,32935,32938],{"class":1209,"line":1746},[1207,32936,32937],{"class":20171},"env",[1207,32939,1743],{"class":1632},[1207,32941,32942,32945,32947,32949,32952],{"class":1209,"line":1753},[1207,32943,32944],{"class":20171},"  PYTHON_VERSION",[1207,32946,2458],{"class":1632},[1207,32948,2188],{"class":1964},[1207,32950,32951],{"class":1224},"3.11",[1207,32953,2006],{"class":1964},[1207,32955,32956],{"class":1209,"line":1760},[1207,32957,1527],{"emptyLinePlaceholder":1526},[1207,32959,32960,32963],{"class":1209,"line":1766},[1207,32961,32962],{"class":20171},"jobs",[1207,32964,1743],{"class":1632},[1207,32966,32967],{"class":1209,"line":1772},[1207,32968,32969],{"class":1213},"  # Lint and code quality checks\n",[1207,32971,32972,32975],{"class":1209,"line":1778},[1207,32973,32974],{"class":20171},"  lint",[1207,32976,1743],{"class":1632},[1207,32978,32979,32982,32984],{"class":1209,"line":1783},[1207,32980,32981],{"class":20171},"    runs-on",[1207,32983,2458],{"class":1632},[1207,32985,32986],{"class":1224}," ubuntu-latest\n",[1207,32988,32989,32992],{"class":1209,"line":1788},[1207,32990,32991],{"class":20171},"    steps",[1207,32993,1743],{"class":1632},[1207,32995,32996,32999,33002,33004],{"class":1209,"line":1803},[1207,32997,32998],{"class":1632},"    -",[1207,33000,33001],{"class":20171}," uses",[1207,33003,2458],{"class":1632},[1207,33005,33006],{"class":1224}," actions/checkout@v4\n",[1207,33008,33009],{"class":1209,"line":1821},[1207,33010,1763],{"class":1620},[1207,33012,33013,33015,33017,33019],{"class":1209,"line":1827},[1207,33014,32998],{"class":1632},[1207,33016,13312],{"class":20171},[1207,33018,2458],{"class":1632},[1207,33020,33021],{"class":1224}," Set up Python\n",[1207,33023,33024,33027,33029],{"class":1209,"line":1833},[1207,33025,33026],{"class":20171},"      uses",[1207,33028,2458],{"class":1632},[1207,33030,33031],{"class":1224}," actions/setup-python@v4\n",[1207,33033,33034,33037],{"class":1209,"line":1839},[1207,33035,33036],{"class":20171},"      with",[1207,33038,1743],{"class":1632},[1207,33040,33041,33044,33046],{"class":1209,"line":1845},[1207,33042,33043],{"class":20171},"        python-version",[1207,33045,2458],{"class":1632},[1207,33047,33048],{"class":1224}," ${{ env.PYTHON_VERSION }}\n",[1207,33050,33051],{"class":1209,"line":1851},[1207,33052,1763],{"class":1620},[1207,33054,33055,33057,33059,33061],{"class":1209,"line":1856},[1207,33056,32998],{"class":1632},[1207,33058,13312],{"class":20171},[1207,33060,2458],{"class":1632},[1207,33062,33063],{"class":1224}," Install dependencies\n",[1207,33065,33066,33069,33071],{"class":1209,"line":1869},[1207,33067,33068],{"class":20171},"      run",[1207,33070,2458],{"class":1632},[1207,33072,33073],{"class":1616}," |\n",[1207,33075,33076],{"class":1209,"line":1874},[1207,33077,33078],{"class":1224},"        python -m pip install --upgrade pip\n",[1207,33080,33081],{"class":1209,"line":1885},[1207,33082,33083],{"class":1224},"        pip install flake8 black isort mypy\n",[1207,33085,33086],{"class":1209,"line":1899},[1207,33087,33088],{"class":1224},"        pip install -r requirements.txt\n",[1207,33090,33091],{"class":1209,"line":1904},[1207,33092,1763],{"class":1224},[1207,33094,33095,33097,33099,33101],{"class":1209,"line":1910},[1207,33096,32998],{"class":1632},[1207,33098,13312],{"class":20171},[1207,33100,2458],{"class":1632},[1207,33102,33103],{"class":1224}," Lint with flake8\n",[1207,33105,33106,33108,33110],{"class":1209,"line":1915},[1207,33107,33068],{"class":20171},[1207,33109,2458],{"class":1632},[1207,33111,33073],{"class":1616},[1207,33113,33114],{"class":1209,"line":1921},[1207,33115,33116],{"class":1224},"        # Stop the build if there are Python syntax errors or undefined names\n",[1207,33118,33119],{"class":1209,"line":1927},[1207,33120,33121],{"class":1224},"        flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics\n",[1207,33123,33124],{"class":1209,"line":1932},[1207,33125,33126],{"class":1224},"        # Exit-zero treats all errors as warnings\n",[1207,33128,33129],{"class":1209,"line":1954},[1207,33130,33131],{"class":1224},"        flake8 . --count --exit-zero --max-complexity=10 --max-line-length=88 --statistics\n",[1207,33133,33134],{"class":1209,"line":1976},[1207,33135,1763],{"class":1224},[1207,33137,33138,33140,33142,33144],{"class":1209,"line":1993},[1207,33139,32998],{"class":1632},[1207,33141,13312],{"class":20171},[1207,33143,2458],{"class":1632},[1207,33145,33146],{"class":1224}," Check code formatting with black\n",[1207,33148,33149,33151,33153],{"class":1209,"line":2009},[1207,33150,33068],{"class":20171},[1207,33152,2458],{"class":1632},[1207,33154,33155],{"class":1224}," black --check .\n",[1207,33157,33158],{"class":1209,"line":2015},[1207,33159,1763],{"class":1620},[1207,33161,33162,33164,33166,33168],{"class":1209,"line":2020},[1207,33163,32998],{"class":1632},[1207,33165,13312],{"class":20171},[1207,33167,2458],{"class":1632},[1207,33169,33170],{"class":1224}," Check import sorting with isort\n",[1207,33172,33173,33175,33177],{"class":1209,"line":2037},[1207,33174,33068],{"class":20171},[1207,33176,2458],{"class":1632},[1207,33178,33179],{"class":1224}," isort --check-only .\n",[1207,33181,33182],{"class":1209,"line":2060},[1207,33183,1763],{"class":1620},[1207,33185,33186,33188,33190,33192],{"class":1209,"line":2065},[1207,33187,32998],{"class":1632},[1207,33189,13312],{"class":20171},[1207,33191,2458],{"class":1632},[1207,33193,33194],{"class":1224}," Type checking with mypy\n",[1207,33196,33197,33199,33201],{"class":1209,"line":2071},[1207,33198,33068],{"class":20171},[1207,33200,2458],{"class":1632},[1207,33202,33203],{"class":1224}," mypy user_service --ignore-missing-imports\n",[1207,33205,33206],{"class":1209,"line":2076},[1207,33207,1527],{"emptyLinePlaceholder":1526},[1207,33209,33210],{"class":1209,"line":2082},[1207,33211,33212],{"class":1213},"  # Unit tests for each service\n",[1207,33214,33215,33218],{"class":1209,"line":2088},[1207,33216,33217],{"class":20171},"  unit-tests",[1207,33219,1743],{"class":1632},[1207,33221,33222,33224,33226],{"class":1209,"line":2094},[1207,33223,32981],{"class":20171},[1207,33225,2458],{"class":1632},[1207,33227,32986],{"class":1224},[1207,33229,33230,33233],{"class":1209,"line":2100},[1207,33231,33232],{"class":20171},"    strategy",[1207,33234,1743],{"class":1632},[1207,33236,33237,33240],{"class":1209,"line":2105},[1207,33238,33239],{"class":20171},"      matrix",[1207,33241,1743],{"class":1632},[1207,33243,33244,33246,33248,33250,33253,33255,33258,33260,33263],{"class":1209,"line":2111},[1207,33245,18202],{"class":20171},[1207,33247,2458],{"class":1632},[1207,33249,9226],{"class":1632},[1207,33251,33252],{"class":1224},"user-service",[1207,33254,1644],{"class":1632},[1207,33256,33257],{"class":1224}," order-service",[1207,33259,1644],{"class":1632},[1207,33261,33262],{"class":1224}," payment-service",[1207,33264,13328],{"class":1632},[1207,33266,33267],{"class":1209,"line":2139},[1207,33268,1763],{"class":1620},[1207,33270,33271,33273],{"class":1209,"line":2144},[1207,33272,32991],{"class":20171},[1207,33274,1743],{"class":1632},[1207,33276,33277,33279,33281,33283],{"class":1209,"line":2150},[1207,33278,32998],{"class":1632},[1207,33280,33001],{"class":20171},[1207,33282,2458],{"class":1632},[1207,33284,33006],{"class":1224},[1207,33286,33287],{"class":1209,"line":2174},[1207,33288,1763],{"class":1620},[1207,33290,33291,33293,33295,33297],{"class":1209,"line":2195},[1207,33292,32998],{"class":1632},[1207,33294,13312],{"class":20171},[1207,33296,2458],{"class":1632},[1207,33298,33021],{"class":1224},[1207,33300,33301,33303,33305],{"class":1209,"line":2215},[1207,33302,33026],{"class":20171},[1207,33304,2458],{"class":1632},[1207,33306,33031],{"class":1224},[1207,33308,33309,33311],{"class":1209,"line":2220},[1207,33310,33036],{"class":20171},[1207,33312,1743],{"class":1632},[1207,33314,33315,33317,33319],{"class":1209,"line":2235},[1207,33316,33043],{"class":20171},[1207,33318,2458],{"class":1632},[1207,33320,33048],{"class":1224},[1207,33322,33323],{"class":1209,"line":2253},[1207,33324,1763],{"class":1620},[1207,33326,33327,33329,33331,33333],{"class":1209,"line":2258},[1207,33328,32998],{"class":1632},[1207,33330,13312],{"class":20171},[1207,33332,2458],{"class":1632},[1207,33334,33335],{"class":1224}," Cache pip dependencies\n",[1207,33337,33338,33340,33342],{"class":1209,"line":2264},[1207,33339,33026],{"class":20171},[1207,33341,2458],{"class":1632},[1207,33343,33344],{"class":1224}," actions/cache@v3\n",[1207,33346,33347,33349],{"class":1209,"line":2269},[1207,33348,33036],{"class":20171},[1207,33350,1743],{"class":1632},[1207,33352,33353,33356,33358],{"class":1209,"line":2275},[1207,33354,33355],{"class":20171},"        path",[1207,33357,2458],{"class":1632},[1207,33359,33360],{"class":1224}," ~/.cache/pip\n",[1207,33362,33363,33366,33368],{"class":1209,"line":2281},[1207,33364,33365],{"class":20171},"        key",[1207,33367,2458],{"class":1632},[1207,33369,33370],{"class":1224}," ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}\n",[1207,33372,33373,33376,33378],{"class":1209,"line":2286},[1207,33374,33375],{"class":20171},"        restore-keys",[1207,33377,2458],{"class":1632},[1207,33379,33073],{"class":1616},[1207,33381,33382],{"class":1209,"line":2292},[1207,33383,33384],{"class":1224},"          ${{ runner.os }}-pip-\n",[1207,33386,33387],{"class":1209,"line":2313},[1207,33388,1763],{"class":1224},[1207,33390,33391,33393,33395,33397],{"class":1209,"line":2334},[1207,33392,32998],{"class":1632},[1207,33394,13312],{"class":20171},[1207,33396,2458],{"class":1632},[1207,33398,33063],{"class":1224},[1207,33400,33401,33403,33405],{"class":1209,"line":2339},[1207,33402,33068],{"class":20171},[1207,33404,2458],{"class":1632},[1207,33406,33073],{"class":1616},[1207,33408,33409],{"class":1209,"line":2358},[1207,33410,33411],{"class":1224},"        cd ${{ matrix.service }}\n",[1207,33413,33414],{"class":1209,"line":2381},[1207,33415,33088],{"class":1224},[1207,33417,33418],{"class":1209,"line":2386},[1207,33419,33420],{"class":1224},"        pip install -r requirements-test.txt\n",[1207,33422,33423],{"class":1209,"line":2392},[1207,33424,1763],{"class":1224},[1207,33426,33427,33429,33431,33433],{"class":1209,"line":2397},[1207,33428,32998],{"class":1632},[1207,33430,13312],{"class":20171},[1207,33432,2458],{"class":1632},[1207,33434,33435],{"class":1224}," Run unit tests\n",[1207,33437,33438,33440,33442],{"class":1209,"line":2403},[1207,33439,33068],{"class":20171},[1207,33441,2458],{"class":1632},[1207,33443,33073],{"class":1616},[1207,33445,33446],{"class":1209,"line":2409},[1207,33447,33411],{"class":1224},[1207,33449,33450],{"class":1209,"line":2414},[1207,33451,33452],{"class":1224},"        pytest tests/unit/ -m \"unit and not slow\" \\\n",[1207,33454,33455],{"class":1209,"line":2420},[1207,33456,33457],{"class":1224},"               --cov --cov-report=xml \\\n",[1207,33459,33460],{"class":1209,"line":2426},[1207,33461,33462],{"class":1224},"               --junitxml=test-results.xml\n",[1207,33464,33465],{"class":1209,"line":2431},[1207,33466,1763],{"class":1224},[1207,33468,33469,33471,33473,33475],{"class":1209,"line":2437},[1207,33470,32998],{"class":1632},[1207,33472,13312],{"class":20171},[1207,33474,2458],{"class":1632},[1207,33476,33477],{"class":1224}," Upload coverage to Codecov\n",[1207,33479,33480,33482,33484],{"class":1209,"line":2448},[1207,33481,33026],{"class":20171},[1207,33483,2458],{"class":1632},[1207,33485,33486],{"class":1224}," codecov/codecov-action@v3\n",[1207,33488,33489,33491],{"class":1209,"line":2470},[1207,33490,33036],{"class":20171},[1207,33492,1743],{"class":1632},[1207,33494,33495,33498,33500],{"class":1209,"line":2490},[1207,33496,33497],{"class":20171},"        file",[1207,33499,2458],{"class":1632},[1207,33501,33502],{"class":1224}," ${{ matrix.service }}/coverage.xml\n",[1207,33504,33505,33508,33510],{"class":1209,"line":2511},[1207,33506,33507],{"class":20171},"        flags",[1207,33509,2458],{"class":1632},[1207,33511,33512],{"class":1224}," ${{ matrix.service }}-unit\n",[1207,33514,33515,33518,33520],{"class":1209,"line":2532},[1207,33516,33517],{"class":20171},"        name",[1207,33519,2458],{"class":1632},[1207,33521,33522],{"class":1224}," ${{ matrix.service }}-unit-coverage\n",[1207,33524,33525],{"class":1209,"line":2551},[1207,33526,1763],{"class":1620},[1207,33528,33529,33531,33533,33535],{"class":1209,"line":2557},[1207,33530,32998],{"class":1632},[1207,33532,13312],{"class":20171},[1207,33534,2458],{"class":1632},[1207,33536,33537],{"class":1224}," Upload test results\n",[1207,33539,33540,33542,33544],{"class":1209,"line":2562},[1207,33541,33026],{"class":20171},[1207,33543,2458],{"class":1632},[1207,33545,33546],{"class":1224}," actions/upload-artifact@v3\n",[1207,33548,33549,33552,33554],{"class":1209,"line":2567},[1207,33550,33551],{"class":20171},"      if",[1207,33553,2458],{"class":1632},[1207,33555,33556],{"class":1224}," always()\n",[1207,33558,33559,33561],{"class":1209,"line":2588},[1207,33560,33036],{"class":20171},[1207,33562,1743],{"class":1632},[1207,33564,33565,33567,33569],{"class":1209,"line":2593},[1207,33566,33517],{"class":20171},[1207,33568,2458],{"class":1632},[1207,33570,33571],{"class":1224}," test-results-${{ matrix.service }}\n",[1207,33573,33574,33576,33578],{"class":1209,"line":2599},[1207,33575,33355],{"class":20171},[1207,33577,2458],{"class":1632},[1207,33579,33580],{"class":1224}," ${{ matrix.service }}/test-results.xml\n",[1207,33582,33583],{"class":1209,"line":2619},[1207,33584,1527],{"emptyLinePlaceholder":1526},[1207,33586,33587],{"class":1209,"line":2624},[1207,33588,33589],{"class":1213},"  # Integration tests with real databases\n",[1207,33591,33592,33595],{"class":1209,"line":2630},[1207,33593,33594],{"class":20171},"  integration-tests",[1207,33596,1743],{"class":1632},[1207,33598,33599,33601,33603],{"class":1209,"line":2652},[1207,33600,32981],{"class":20171},[1207,33602,2458],{"class":1632},[1207,33604,32986],{"class":1224},[1207,33606,33607,33610,33612],{"class":1209,"line":2657},[1207,33608,33609],{"class":20171},"    needs",[1207,33611,2458],{"class":1632},[1207,33613,33614],{"class":1224}," unit-tests\n",[1207,33616,33617],{"class":1209,"line":2675},[1207,33618,1763],{"class":1620},[1207,33620,33621,33624],{"class":1209,"line":2702},[1207,33622,33623],{"class":20171},"    services",[1207,33625,1743],{"class":1632},[1207,33627,33628,33631],{"class":1209,"line":2707},[1207,33629,33630],{"class":20171},"      postgres",[1207,33632,1743],{"class":1632},[1207,33634,33635,33638,33640],{"class":1209,"line":2713},[1207,33636,33637],{"class":20171},"        image",[1207,33639,2458],{"class":1632},[1207,33641,20205],{"class":1224},[1207,33643,33644,33647],{"class":1209,"line":2718},[1207,33645,33646],{"class":20171},"        env",[1207,33648,1743],{"class":1632},[1207,33650,33651,33654,33656],{"class":1209,"line":2724},[1207,33652,33653],{"class":20171},"          POSTGRES_PASSWORD",[1207,33655,2458],{"class":1632},[1207,33657,17140],{"class":1224},[1207,33659,33660,33663,33665],{"class":1209,"line":2730},[1207,33661,33662],{"class":20171},"          POSTGRES_DB",[1207,33664,2458],{"class":1632},[1207,33666,20222],{"class":1224},[1207,33668,33669,33672,33674,33676],{"class":1209,"line":2736},[1207,33670,33671],{"class":20171},"        options",[1207,33673,2458],{"class":1632},[1207,33675,22047],{"class":1616},[1207,33677,33678],{"class":1735},"-\n",[1207,33680,33681],{"class":1209,"line":2742},[1207,33682,33683],{"class":1224},"          --health-cmd pg_isready\n",[1207,33685,33686],{"class":1209,"line":2748},[1207,33687,33688],{"class":1224},"          --health-interval 10s\n",[1207,33690,33691],{"class":1209,"line":2753},[1207,33692,33693],{"class":1224},"          --health-timeout 5s\n",[1207,33695,33696],{"class":1209,"line":2759},[1207,33697,33698],{"class":1224},"          --health-retries 5\n",[1207,33700,33701,33704],{"class":1209,"line":2781},[1207,33702,33703],{"class":20171},"        ports",[1207,33705,1743],{"class":1632},[1207,33707,33708,33711],{"class":1209,"line":2820},[1207,33709,33710],{"class":1632},"          -",[1207,33712,33713],{"class":1224}," 5432:5432\n",[1207,33715,33716],{"class":1209,"line":2825},[1207,33717,33718],{"class":1620},"      \n",[1207,33720,33721,33724],{"class":1209,"line":2830},[1207,33722,33723],{"class":20171},"      redis",[1207,33725,1743],{"class":1632},[1207,33727,33728,33730,33732],{"class":1209,"line":2846},[1207,33729,33637],{"class":20171},[1207,33731,2458],{"class":1632},[1207,33733,20281],{"class":1224},[1207,33735,33736,33738,33740,33742],{"class":1209,"line":2861},[1207,33737,33671],{"class":20171},[1207,33739,2458],{"class":1632},[1207,33741,22047],{"class":1616},[1207,33743,33678],{"class":1735},[1207,33745,33746],{"class":1209,"line":2884},[1207,33747,33748],{"class":1224},"          --health-cmd \"redis-cli ping\"\n",[1207,33750,33751],{"class":1209,"line":2889},[1207,33752,33688],{"class":1224},[1207,33754,33755],{"class":1209,"line":2894},[1207,33756,33693],{"class":1224},[1207,33758,33759],{"class":1209,"line":2900},[1207,33760,33698],{"class":1224},[1207,33762,33763,33765],{"class":1209,"line":2914},[1207,33764,33703],{"class":20171},[1207,33766,1743],{"class":1632},[1207,33768,33769,33771],{"class":1209,"line":2919},[1207,33770,33710],{"class":1632},[1207,33772,33773],{"class":1224}," 6379:6379\n",[1207,33775,33776],{"class":1209,"line":2925},[1207,33777,33718],{"class":1620},[1207,33779,33780,33783],{"class":1209,"line":2945},[1207,33781,33782],{"class":20171},"      rabbitmq",[1207,33784,1743],{"class":1632},[1207,33786,33787,33789,33791],{"class":1209,"line":2950},[1207,33788,33637],{"class":20171},[1207,33790,2458],{"class":1632},[1207,33792,33793],{"class":1224}," rabbitmq:3.11\n",[1207,33795,33796,33798],{"class":1209,"line":2956},[1207,33797,33646],{"class":20171},[1207,33799,1743],{"class":1632},[1207,33801,33802,33805,33807],{"class":1209,"line":2971},[1207,33803,33804],{"class":20171},"          RABBITMQ_DEFAULT_USER",[1207,33806,2458],{"class":1632},[1207,33808,33809],{"class":1224}," test\n",[1207,33811,33812,33815,33817],{"class":1209,"line":3016},[1207,33813,33814],{"class":20171},"          RABBITMQ_DEFAULT_PASS",[1207,33816,2458],{"class":1632},[1207,33818,33809],{"class":1224},[1207,33820,33821,33823,33825,33827],{"class":1209,"line":5981},[1207,33822,33671],{"class":20171},[1207,33824,2458],{"class":1632},[1207,33826,22047],{"class":1616},[1207,33828,33678],{"class":1735},[1207,33830,33831],{"class":1209,"line":5987},[1207,33832,33833],{"class":1224},"          --health-cmd \"rabbitmq-diagnostics -q ping\"\n",[1207,33835,33836],{"class":1209,"line":5992},[1207,33837,33838],{"class":1224},"          --health-interval 30s\n",[1207,33840,33841],{"class":1209,"line":6003},[1207,33842,33843],{"class":1224},"          --health-timeout 30s\n",[1207,33845,33846],{"class":1209,"line":6008},[1207,33847,33848],{"class":1224},"          --health-retries 3\n",[1207,33850,33851,33853],{"class":1209,"line":6014},[1207,33852,33703],{"class":20171},[1207,33854,1743],{"class":1632},[1207,33856,33857,33859],{"class":1209,"line":6030},[1207,33858,33710],{"class":1632},[1207,33860,33861],{"class":1224}," 5672:5672\n",[1207,33863,33864],{"class":1209,"line":6050},[1207,33865,1763],{"class":1620},[1207,33867,33868,33870],{"class":1209,"line":6070},[1207,33869,32991],{"class":20171},[1207,33871,1743],{"class":1632},[1207,33873,33874,33876,33878,33880],{"class":1209,"line":6089},[1207,33875,32998],{"class":1632},[1207,33877,33001],{"class":20171},[1207,33879,2458],{"class":1632},[1207,33881,33006],{"class":1224},[1207,33883,33884],{"class":1209,"line":6102},[1207,33885,1763],{"class":1620},[1207,33887,33888,33890,33892,33894],{"class":1209,"line":6122},[1207,33889,32998],{"class":1632},[1207,33891,13312],{"class":20171},[1207,33893,2458],{"class":1632},[1207,33895,33021],{"class":1224},[1207,33897,33898,33900,33902],{"class":1209,"line":6140},[1207,33899,33026],{"class":20171},[1207,33901,2458],{"class":1632},[1207,33903,33031],{"class":1224},[1207,33905,33906,33908],{"class":1209,"line":6145},[1207,33907,33036],{"class":20171},[1207,33909,1743],{"class":1632},[1207,33911,33912,33914,33916],{"class":1209,"line":6151},[1207,33913,33043],{"class":20171},[1207,33915,2458],{"class":1632},[1207,33917,33048],{"class":1224},[1207,33919,33920],{"class":1209,"line":6156},[1207,33921,1763],{"class":1620},[1207,33923,33924,33926,33928,33930],{"class":1209,"line":6162},[1207,33925,32998],{"class":1632},[1207,33927,13312],{"class":20171},[1207,33929,2458],{"class":1632},[1207,33931,33063],{"class":1224},[1207,33933,33934,33936,33938],{"class":1209,"line":6189},[1207,33935,33068],{"class":20171},[1207,33937,2458],{"class":1632},[1207,33939,33073],{"class":1616},[1207,33941,33942],{"class":1209,"line":6208},[1207,33943,33088],{"class":1224},[1207,33945,33946],{"class":1209,"line":6228},[1207,33947,33420],{"class":1224},[1207,33949,33950],{"class":1209,"line":6241},[1207,33951,1763],{"class":1224},[1207,33953,33954,33956,33958,33960],{"class":1209,"line":6261},[1207,33955,32998],{"class":1632},[1207,33957,13312],{"class":20171},[1207,33959,2458],{"class":1632},[1207,33961,33962],{"class":1224}," Run integration tests\n",[1207,33964,33965,33968],{"class":1209,"line":6279},[1207,33966,33967],{"class":20171},"      env",[1207,33969,1743],{"class":1632},[1207,33971,33972,33975,33977],{"class":1209,"line":6284},[1207,33973,33974],{"class":20171},"        DATABASE_URL",[1207,33976,2458],{"class":1632},[1207,33978,33979],{"class":1224}," postgres://postgres:postgres@localhost:5432/test_db\n",[1207,33981,33982,33985,33987],{"class":1209,"line":6289},[1207,33983,33984],{"class":20171},"        REDIS_URL",[1207,33986,2458],{"class":1632},[1207,33988,33989],{"class":1224}," redis://localhost:6379/0\n",[1207,33991,33992,33995,33997],{"class":1209,"line":6294},[1207,33993,33994],{"class":20171},"        RABBITMQ_URL",[1207,33996,2458],{"class":1632},[1207,33998,33999],{"class":1224}," amqp://test:test@localhost:5672//\n",[1207,34001,34002,34004,34006],{"class":1209,"line":6300},[1207,34003,33068],{"class":20171},[1207,34005,2458],{"class":1632},[1207,34007,33073],{"class":1616},[1207,34009,34010],{"class":1209,"line":6320},[1207,34011,34012],{"class":1224},"        pytest tests/integration/ -m \"integration\" \\\n",[1207,34014,34015],{"class":1209,"line":6339},[1207,34016,33457],{"class":1224},[1207,34018,34019],{"class":1209,"line":6344},[1207,34020,34021],{"class":1224},"               --maxfail=3\n",[1207,34023,34024],{"class":1209,"line":6350},[1207,34025,1763],{"class":1224},[1207,34027,34028,34030,34032,34034],{"class":1209,"line":6366},[1207,34029,32998],{"class":1632},[1207,34031,13312],{"class":20171},[1207,34033,2458],{"class":1632},[1207,34035,34036],{"class":1224}," Upload integration coverage\n",[1207,34038,34039,34041,34043],{"class":1209,"line":6389},[1207,34040,33026],{"class":20171},[1207,34042,2458],{"class":1632},[1207,34044,33486],{"class":1224},[1207,34046,34047,34049],{"class":1209,"line":6412},[1207,34048,33036],{"class":20171},[1207,34050,1743],{"class":1632},[1207,34052,34053,34055,34057],{"class":1209,"line":6417},[1207,34054,33497],{"class":20171},[1207,34056,2458],{"class":1632},[1207,34058,34059],{"class":1224}," coverage.xml\n",[1207,34061,34062,34064,34066],{"class":1209,"line":6423},[1207,34063,33507],{"class":20171},[1207,34065,2458],{"class":1632},[1207,34067,20413],{"class":1224},[1207,34069,34070,34072,34074],{"class":1209,"line":6468},[1207,34071,33517],{"class":20171},[1207,34073,2458],{"class":1632},[1207,34075,34076],{"class":1224}," integration-coverage\n",[1207,34078,34079],{"class":1209,"line":6487},[1207,34080,1527],{"emptyLinePlaceholder":1526},[1207,34082,34083],{"class":1209,"line":8226},[1207,34084,34085],{"class":1213},"  # Contract tests\n",[1207,34087,34088,34091],{"class":1209,"line":8239},[1207,34089,34090],{"class":20171},"  contract-tests",[1207,34092,1743],{"class":1632},[1207,34094,34095,34097,34099],{"class":1209,"line":8244},[1207,34096,32981],{"class":20171},[1207,34098,2458],{"class":1632},[1207,34100,32986],{"class":1224},[1207,34102,34103,34105,34107],{"class":1209,"line":8249},[1207,34104,33609],{"class":20171},[1207,34106,2458],{"class":1632},[1207,34108,34109],{"class":1224}," integration-tests\n",[1207,34111,34112],{"class":1209,"line":8255},[1207,34113,1763],{"class":1620},[1207,34115,34116,34118],{"class":1209,"line":8274},[1207,34117,32991],{"class":20171},[1207,34119,1743],{"class":1632},[1207,34121,34122,34124,34126,34128],{"class":1209,"line":8279},[1207,34123,32998],{"class":1632},[1207,34125,33001],{"class":20171},[1207,34127,2458],{"class":1632},[1207,34129,33006],{"class":1224},[1207,34131,34132],{"class":1209,"line":8294},[1207,34133,1763],{"class":1620},[1207,34135,34136,34138,34140,34142],{"class":1209,"line":8319},[1207,34137,32998],{"class":1632},[1207,34139,13312],{"class":20171},[1207,34141,2458],{"class":1632},[1207,34143,33021],{"class":1224},[1207,34145,34146,34148,34150],{"class":1209,"line":8344},[1207,34147,33026],{"class":20171},[1207,34149,2458],{"class":1632},[1207,34151,33031],{"class":1224},[1207,34153,34154,34156],{"class":1209,"line":8349},[1207,34155,33036],{"class":20171},[1207,34157,1743],{"class":1632},[1207,34159,34160,34162,34164],{"class":1209,"line":8355},[1207,34161,33043],{"class":20171},[1207,34163,2458],{"class":1632},[1207,34165,33048],{"class":1224},[1207,34167,34168],{"class":1209,"line":8367},[1207,34169,1763],{"class":1620},[1207,34171,34172,34174,34176,34178],{"class":1209,"line":8386},[1207,34173,32998],{"class":1632},[1207,34175,13312],{"class":20171},[1207,34177,2458],{"class":1632},[1207,34179,34180],{"class":1224}," Install Pact\n",[1207,34182,34183,34185,34187],{"class":1209,"line":8405},[1207,34184,33068],{"class":20171},[1207,34186,2458],{"class":1632},[1207,34188,33073],{"class":1616},[1207,34190,34191],{"class":1209,"line":8410},[1207,34192,34193],{"class":1224},"        pip install pact-python\n",[1207,34195,34196],{"class":1209,"line":8428},[1207,34197,33088],{"class":1224},[1207,34199,34200],{"class":1209,"line":8433},[1207,34201,1763],{"class":1224},[1207,34203,34204,34206,34208,34210],{"class":1209,"line":8439},[1207,34205,32998],{"class":1632},[1207,34207,13312],{"class":20171},[1207,34209,2458],{"class":1632},[1207,34211,34212],{"class":1224}," Run consumer contract tests\n",[1207,34214,34215,34217,34219],{"class":1209,"line":8444},[1207,34216,33068],{"class":20171},[1207,34218,2458],{"class":1632},[1207,34220,33073],{"class":1616},[1207,34222,34223],{"class":1209,"line":8450},[1207,34224,34225],{"class":1224},"        pytest tests/contract/ -m \"contract\"\n",[1207,34227,34228],{"class":1209,"line":8455},[1207,34229,1763],{"class":1224},[1207,34231,34232,34234,34236,34238],{"class":1209,"line":8461},[1207,34233,32998],{"class":1632},[1207,34235,13312],{"class":20171},[1207,34237,2458],{"class":1632},[1207,34239,34240],{"class":1224}," Publish Pacts\n",[1207,34242,34243,34245,34247],{"class":1209,"line":8472},[1207,34244,33551],{"class":20171},[1207,34246,2458],{"class":1632},[1207,34248,34249],{"class":1224}," github.ref == 'refs/heads/main'\n",[1207,34251,34252,34254,34256],{"class":1209,"line":8477},[1207,34253,33068],{"class":20171},[1207,34255,2458],{"class":1632},[1207,34257,33073],{"class":1616},[1207,34259,34260],{"class":1209,"line":8483},[1207,34261,34262],{"class":1224},"        pact-broker publish pacts/ \\\n",[1207,34264,34265],{"class":1209,"line":8498},[1207,34266,34267],{"class":1224},"          --broker-base-url ${{ secrets.PACT_BROKER_URL }} \\\n",[1207,34269,34270],{"class":1209,"line":8534},[1207,34271,34272],{"class":1224},"          --broker-username ${{ secrets.PACT_BROKER_USERNAME }} \\\n",[1207,34274,34275],{"class":1209,"line":8539},[1207,34276,34277],{"class":1224},"          --broker-password ${{ secrets.PACT_BROKER_PASSWORD }}\n",[1207,34279,34280],{"class":1209,"line":8544},[1207,34281,1527],{"emptyLinePlaceholder":1526},[1207,34283,34284],{"class":1209,"line":8550},[1207,34285,34286],{"class":1213},"  # End-to-end tests\n",[1207,34288,34289,34292],{"class":1209,"line":8570},[1207,34290,34291],{"class":20171},"  e2e-tests",[1207,34293,1743],{"class":1632},[1207,34295,34296,34298,34300],{"class":1209,"line":8575},[1207,34297,32981],{"class":20171},[1207,34299,2458],{"class":1632},[1207,34301,32986],{"class":1224},[1207,34303,34304,34306,34308],{"class":1209,"line":8593},[1207,34305,33609],{"class":20171},[1207,34307,2458],{"class":1632},[1207,34309,34310],{"class":1224}," contract-tests\n",[1207,34312,34313,34315,34317],{"class":1209,"line":8598},[1207,34314,26285],{"class":20171},[1207,34316,2458],{"class":1632},[1207,34318,34319],{"class":1224}," github.ref == 'refs/heads/main' || github.event_name == 'pull_request'\n",[1207,34321,34322],{"class":1209,"line":8604},[1207,34323,1763],{"class":1620},[1207,34325,34326,34328],{"class":1209,"line":8609},[1207,34327,32991],{"class":20171},[1207,34329,1743],{"class":1632},[1207,34331,34332,34334,34336,34338],{"class":1209,"line":8615},[1207,34333,32998],{"class":1632},[1207,34335,33001],{"class":20171},[1207,34337,2458],{"class":1632},[1207,34339,33006],{"class":1224},[1207,34341,34342],{"class":1209,"line":8620},[1207,34343,1763],{"class":1620},[1207,34345,34346,34348,34350,34352],{"class":1209,"line":8626},[1207,34347,32998],{"class":1632},[1207,34349,13312],{"class":20171},[1207,34351,2458],{"class":1632},[1207,34353,34354],{"class":1224}," Set up Docker Buildx\n",[1207,34356,34357,34359,34361],{"class":1209,"line":8645},[1207,34358,33026],{"class":20171},[1207,34360,2458],{"class":1632},[1207,34362,34363],{"class":1224}," docker/setup-buildx-action@v2\n",[1207,34365,34366],{"class":1209,"line":8650},[1207,34367,1763],{"class":1620},[1207,34369,34370,34372,34374,34376],{"class":1209,"line":8656},[1207,34371,32998],{"class":1632},[1207,34373,13312],{"class":20171},[1207,34375,2458],{"class":1632},[1207,34377,34378],{"class":1224}," Start services with Docker Compose\n",[1207,34380,34381,34383,34385],{"class":1209,"line":8683},[1207,34382,33068],{"class":20171},[1207,34384,2458],{"class":1632},[1207,34386,33073],{"class":1616},[1207,34388,34389],{"class":1209,"line":8688},[1207,34390,34391],{"class":1224},"        docker-compose -f docker-compose.test.yml up -d\n",[1207,34393,34394],{"class":1209,"line":8694},[1207,34395,34396],{"class":1224},"        sleep 60  # Wait for services to be ready\n",[1207,34398,34399],{"class":1209,"line":8713},[1207,34400,1763],{"class":1224},[1207,34402,34403,34405,34407,34409],{"class":1209,"line":8718},[1207,34404,32998],{"class":1632},[1207,34406,13312],{"class":20171},[1207,34408,2458],{"class":1632},[1207,34410,34411],{"class":1224}," Check service health\n",[1207,34413,34414,34416,34418],{"class":1209,"line":8733},[1207,34415,33068],{"class":20171},[1207,34417,2458],{"class":1632},[1207,34419,33073],{"class":1616},[1207,34421,34422],{"class":1209,"line":8749},[1207,34423,34424],{"class":1224},"        curl -f http://localhost:8000/health/ || exit 1\n",[1207,34426,34427],{"class":1209,"line":8764},[1207,34428,34429],{"class":1224},"        curl -f http://localhost:8001/health/ || exit 1\n",[1207,34431,34432],{"class":1209,"line":8780},[1207,34433,34434],{"class":1224},"        curl -f http://localhost:8002/health/ || exit 1\n",[1207,34436,34437],{"class":1209,"line":8796},[1207,34438,1763],{"class":1224},[1207,34440,34441,34443,34445,34447],{"class":1209,"line":8801},[1207,34442,32998],{"class":1632},[1207,34444,13312],{"class":20171},[1207,34446,2458],{"class":1632},[1207,34448,34449],{"class":1224}," Set up Python for E2E tests\n",[1207,34451,34452,34454,34456],{"class":1209,"line":8826},[1207,34453,33026],{"class":20171},[1207,34455,2458],{"class":1632},[1207,34457,33031],{"class":1224},[1207,34459,34460,34462],{"class":1209,"line":8856},[1207,34461,33036],{"class":20171},[1207,34463,1743],{"class":1632},[1207,34465,34466,34468,34470],{"class":1209,"line":8883},[1207,34467,33043],{"class":20171},[1207,34469,2458],{"class":1632},[1207,34471,33048],{"class":1224},[1207,34473,34474],{"class":1209,"line":8907},[1207,34475,1763],{"class":1620},[1207,34477,34478,34480,34482,34484],{"class":1209,"line":8912},[1207,34479,32998],{"class":1632},[1207,34481,13312],{"class":20171},[1207,34483,2458],{"class":1632},[1207,34485,34486],{"class":1224}," Install E2E test dependencies\n",[1207,34488,34489,34491,34493],{"class":1209,"line":8930},[1207,34490,33068],{"class":20171},[1207,34492,2458],{"class":1632},[1207,34494,33073],{"class":1616},[1207,34496,34497],{"class":1209,"line":8935},[1207,34498,34499],{"class":1224},"        pip install pytest requests\n",[1207,34501,34502],{"class":1209,"line":8941},[1207,34503,1763],{"class":1224},[1207,34505,34506,34508,34510,34512],{"class":1209,"line":8946},[1207,34507,32998],{"class":1632},[1207,34509,13312],{"class":20171},[1207,34511,2458],{"class":1632},[1207,34513,34514],{"class":1224}," Run E2E tests\n",[1207,34516,34517,34519,34521],{"class":1209,"line":8952},[1207,34518,33068],{"class":20171},[1207,34520,2458],{"class":1632},[1207,34522,33073],{"class":1616},[1207,34524,34525],{"class":1209,"line":8957},[1207,34526,34527],{"class":1224},"        pytest tests/e2e/ -m \"e2e\" \\\n",[1207,34529,34530],{"class":1209,"line":8963},[1207,34531,34532],{"class":1224},"               --maxfail=1 \\\n",[1207,34534,34535],{"class":1209,"line":8997},[1207,34536,34537],{"class":1224},"               -v\n",[1207,34539,34540],{"class":1209,"line":9030},[1207,34541,1763],{"class":1224},[1207,34543,34544,34546,34548,34550],{"class":1209,"line":9063},[1207,34545,32998],{"class":1632},[1207,34547,13312],{"class":20171},[1207,34549,2458],{"class":1632},[1207,34551,34552],{"class":1224}," Collect service logs\n",[1207,34554,34555,34557,34559],{"class":1209,"line":9068},[1207,34556,33551],{"class":20171},[1207,34558,2458],{"class":1632},[1207,34560,34561],{"class":1224}," failure()\n",[1207,34563,34564,34566,34568],{"class":1209,"line":9074},[1207,34565,33068],{"class":20171},[1207,34567,2458],{"class":1632},[1207,34569,33073],{"class":1616},[1207,34571,34572],{"class":1209,"line":9089},[1207,34573,34574],{"class":1224},"        docker-compose -f docker-compose.test.yml logs > service-logs.txt\n",[1207,34576,34577],{"class":1209,"line":9104},[1207,34578,1763],{"class":1224},[1207,34580,34581,34583,34585,34587],{"class":1209,"line":9130},[1207,34582,32998],{"class":1632},[1207,34584,13312],{"class":20171},[1207,34586,2458],{"class":1632},[1207,34588,34589],{"class":1224}," Upload service logs\n",[1207,34591,34592,34594,34596],{"class":1209,"line":9135},[1207,34593,33551],{"class":20171},[1207,34595,2458],{"class":1632},[1207,34597,34561],{"class":1224},[1207,34599,34600,34602,34604],{"class":1209,"line":9140},[1207,34601,33026],{"class":20171},[1207,34603,2458],{"class":1632},[1207,34605,33546],{"class":1224},[1207,34607,34608,34610],{"class":1209,"line":9146},[1207,34609,33036],{"class":20171},[1207,34611,1743],{"class":1632},[1207,34613,34614,34616,34618],{"class":1209,"line":9165},[1207,34615,33517],{"class":20171},[1207,34617,2458],{"class":1632},[1207,34619,34620],{"class":1224}," service-logs\n",[1207,34622,34623,34625,34627],{"class":1209,"line":9170},[1207,34624,33355],{"class":20171},[1207,34626,2458],{"class":1632},[1207,34628,34629],{"class":1224}," service-logs.txt\n",[1207,34631,34632],{"class":1209,"line":9185},[1207,34633,1763],{"class":1620},[1207,34635,34636,34638,34640,34642],{"class":1209,"line":9213},[1207,34637,32998],{"class":1632},[1207,34639,13312],{"class":20171},[1207,34641,2458],{"class":1632},[1207,34643,34644],{"class":1224}," Cleanup\n",[1207,34646,34647,34649,34651],{"class":1209,"line":9218},[1207,34648,33551],{"class":20171},[1207,34650,2458],{"class":1632},[1207,34652,33556],{"class":1224},[1207,34654,34655,34657,34659],{"class":1209,"line":9261},[1207,34656,33068],{"class":20171},[1207,34658,2458],{"class":1632},[1207,34660,33073],{"class":1616},[1207,34662,34663],{"class":1209,"line":9277},[1207,34664,34665],{"class":1224},"        docker-compose -f docker-compose.test.yml down -v\n",[1207,34667,34668],{"class":1209,"line":9292},[1207,34669,1527],{"emptyLinePlaceholder":1526},[1207,34671,34672],{"class":1209,"line":16152},[1207,34673,34674],{"class":1213},"  # Security tests\n",[1207,34676,34677,34680],{"class":1209,"line":16171},[1207,34678,34679],{"class":20171},"  security-tests",[1207,34681,1743],{"class":1632},[1207,34683,34684,34686,34688],{"class":1209,"line":16186},[1207,34685,32981],{"class":20171},[1207,34687,2458],{"class":1632},[1207,34689,32986],{"class":1224},[1207,34691,34692,34694,34696],{"class":1209,"line":16217},[1207,34693,33609],{"class":20171},[1207,34695,2458],{"class":1632},[1207,34697,33614],{"class":1224},[1207,34699,34700],{"class":1209,"line":16222},[1207,34701,1763],{"class":1620},[1207,34703,34704,34706],{"class":1209,"line":16228},[1207,34705,32991],{"class":20171},[1207,34707,1743],{"class":1632},[1207,34709,34710,34712,34714,34716],{"class":1209,"line":16237},[1207,34711,32998],{"class":1632},[1207,34713,33001],{"class":20171},[1207,34715,2458],{"class":1632},[1207,34717,33006],{"class":1224},[1207,34719,34720],{"class":1209,"line":16256},[1207,34721,1763],{"class":1620},[1207,34723,34724,34726,34728,34730],{"class":1209,"line":16274},[1207,34725,32998],{"class":1632},[1207,34727,13312],{"class":20171},[1207,34729,2458],{"class":1632},[1207,34731,33021],{"class":1224},[1207,34733,34734,34736,34738],{"class":1209,"line":16279},[1207,34735,33026],{"class":20171},[1207,34737,2458],{"class":1632},[1207,34739,33031],{"class":1224},[1207,34741,34742,34744],{"class":1209,"line":16284},[1207,34743,33036],{"class":20171},[1207,34745,1743],{"class":1632},[1207,34747,34748,34750,34752],{"class":1209,"line":16299},[1207,34749,33043],{"class":20171},[1207,34751,2458],{"class":1632},[1207,34753,33048],{"class":1224},[1207,34755,34756],{"class":1209,"line":16314},[1207,34757,1763],{"class":1620},[1207,34759,34760,34762,34764,34766],{"class":1209,"line":16325},[1207,34761,32998],{"class":1632},[1207,34763,13312],{"class":20171},[1207,34765,2458],{"class":1632},[1207,34767,34768],{"class":1224}," Install security tools\n",[1207,34770,34771,34773,34775],{"class":1209,"line":16338},[1207,34772,33068],{"class":20171},[1207,34774,2458],{"class":1632},[1207,34776,33073],{"class":1616},[1207,34778,34779],{"class":1209,"line":16343},[1207,34780,34781],{"class":1224},"        pip install bandit safety\n",[1207,34783,34784],{"class":1209,"line":16348},[1207,34785,33088],{"class":1224},[1207,34787,34788],{"class":1209,"line":16367},[1207,34789,1763],{"class":1224},[1207,34791,34792,34794,34796,34798],{"class":1209,"line":16372},[1207,34793,32998],{"class":1632},[1207,34795,13312],{"class":20171},[1207,34797,2458],{"class":1632},[1207,34799,34800],{"class":1224}," Run Bandit security linter\n",[1207,34802,34803,34805,34807],{"class":1209,"line":16401},[1207,34804,33068],{"class":20171},[1207,34806,2458],{"class":1632},[1207,34808,33073],{"class":1616},[1207,34810,34811],{"class":1209,"line":16407},[1207,34812,34813],{"class":1224},"        bandit -r . -f json -o bandit-report.json || true\n",[1207,34815,34816],{"class":1209,"line":16466},[1207,34817,1763],{"class":1224},[1207,34819,34820,34822,34824,34826],{"class":1209,"line":16528},[1207,34821,32998],{"class":1632},[1207,34823,13312],{"class":20171},[1207,34825,2458],{"class":1632},[1207,34827,34828],{"class":1224}," Check for known security vulnerabilities\n",[1207,34830,34831,34833,34835],{"class":1209,"line":16590},[1207,34832,33068],{"class":20171},[1207,34834,2458],{"class":1632},[1207,34836,33073],{"class":1616},[1207,34838,34839],{"class":1209,"line":16638},[1207,34840,34841],{"class":1224},"        safety check --json --output safety-report.json || true\n",[1207,34843,34844],{"class":1209,"line":16644},[1207,34845,1763],{"class":1224},[1207,34847,34848,34850,34852,34854],{"class":1209,"line":16672},[1207,34849,32998],{"class":1632},[1207,34851,13312],{"class":20171},[1207,34853,2458],{"class":1632},[1207,34855,34856],{"class":1224}," Upload security reports\n",[1207,34858,34859,34861,34863],{"class":1209,"line":16677},[1207,34860,33026],{"class":20171},[1207,34862,2458],{"class":1632},[1207,34864,33546],{"class":1224},[1207,34866,34867,34869],{"class":1209,"line":16683},[1207,34868,33036],{"class":20171},[1207,34870,1743],{"class":1632},[1207,34872,34873,34875,34877],{"class":1209,"line":16688},[1207,34874,33517],{"class":20171},[1207,34876,2458],{"class":1632},[1207,34878,34879],{"class":1224}," security-reports\n",[1207,34881,34882,34884,34886],{"class":1209,"line":16694},[1207,34883,33355],{"class":20171},[1207,34885,2458],{"class":1632},[1207,34887,33073],{"class":1616},[1207,34889,34890],{"class":1209,"line":16700},[1207,34891,34892],{"class":1224},"          bandit-report.json\n",[1207,34894,34895],{"class":1209,"line":16705},[1207,34896,34897],{"class":1224},"          safety-report.json\n",[1207,34899,34900],{"class":1209,"line":16711},[1207,34901,1527],{"emptyLinePlaceholder":1526},[1207,34903,34904],{"class":1209,"line":16726},[1207,34905,34906],{"class":1213},"  # Performance tests (optional, run on schedule)\n",[1207,34908,34909,34912],{"class":1209,"line":16741},[1207,34910,34911],{"class":20171},"  performance-tests",[1207,34913,1743],{"class":1632},[1207,34915,34916,34918,34920],{"class":1209,"line":16752},[1207,34917,32981],{"class":20171},[1207,34919,2458],{"class":1632},[1207,34921,32986],{"class":1224},[1207,34923,34924,34926,34928],{"class":1209,"line":16765},[1207,34925,26285],{"class":20171},[1207,34927,2458],{"class":1632},[1207,34929,34930],{"class":1224}," github.event_name == 'schedule' || contains(github.event.head_commit.message, '[perf]')\n",[1207,34932,34933],{"class":1209,"line":16770},[1207,34934,1763],{"class":1620},[1207,34936,34937,34939],{"class":1209,"line":16775},[1207,34938,32991],{"class":20171},[1207,34940,1743],{"class":1632},[1207,34942,34943,34945,34947,34949],{"class":1209,"line":16781},[1207,34944,32998],{"class":1632},[1207,34946,33001],{"class":20171},[1207,34948,2458],{"class":1632},[1207,34950,33006],{"class":1224},[1207,34952,34953],{"class":1209,"line":16800},[1207,34954,1763],{"class":1620},[1207,34956,34957,34959,34961,34963],{"class":1209,"line":16815},[1207,34958,32998],{"class":1632},[1207,34960,13312],{"class":20171},[1207,34962,2458],{"class":1632},[1207,34964,34965],{"class":1224}," Set up services\n",[1207,34967,34968,34970,34972],{"class":1209,"line":19912},[1207,34969,33068],{"class":20171},[1207,34971,2458],{"class":1632},[1207,34973,33073],{"class":1616},[1207,34975,34976],{"class":1209,"line":19950},[1207,34977,34391],{"class":1224},[1207,34979,34980],{"class":1209,"line":19967},[1207,34981,34982],{"class":1224},"        sleep 60\n",[1207,34984,34985],{"class":1209,"line":19972},[1207,34986,1763],{"class":1224},[1207,34988,34989,34991,34993,34995],{"class":1209,"line":19978},[1207,34990,32998],{"class":1632},[1207,34992,13312],{"class":20171},[1207,34994,2458],{"class":1632},[1207,34996,33021],{"class":1224},[1207,34998,34999,35001,35003],{"class":1209,"line":19993},[1207,35000,33026],{"class":20171},[1207,35002,2458],{"class":1632},[1207,35004,33031],{"class":1224},[1207,35006,35007,35009],{"class":1209,"line":20006},[1207,35008,33036],{"class":20171},[1207,35010,1743],{"class":1632},[1207,35012,35013,35015,35017],{"class":1209,"line":20011},[1207,35014,33043],{"class":20171},[1207,35016,2458],{"class":1632},[1207,35018,33048],{"class":1224},[1207,35020,35021],{"class":1209,"line":20017},[1207,35022,1763],{"class":1620},[1207,35024,35025,35027,35029,35031],{"class":1209,"line":20030},[1207,35026,32998],{"class":1632},[1207,35028,13312],{"class":20171},[1207,35030,2458],{"class":1632},[1207,35032,35033],{"class":1224}," Install Locust\n",[1207,35035,35036,35038,35040],{"class":1209,"line":20042},[1207,35037,33068],{"class":20171},[1207,35039,2458],{"class":1632},[1207,35041,35042],{"class":1224}," pip install locust\n",[1207,35044,35045],{"class":1209,"line":20047},[1207,35046,1763],{"class":1620},[1207,35048,35049,35051,35053,35055],{"class":1209,"line":20053},[1207,35050,32998],{"class":1632},[1207,35052,13312],{"class":20171},[1207,35054,2458],{"class":1632},[1207,35056,35057],{"class":1224}," Run performance tests\n",[1207,35059,35060,35062,35064],{"class":1209,"line":20071},[1207,35061,33068],{"class":20171},[1207,35063,2458],{"class":1632},[1207,35065,33073],{"class":1616},[1207,35067,35068],{"class":1209,"line":20089},[1207,35069,35070],{"class":1224},"        locust -f tests/load/locustfile.py \\\n",[1207,35072,35073],{"class":1209,"line":20094},[1207,35074,35075],{"class":1224},"               --host=http://localhost:8000 \\\n",[1207,35077,35078],{"class":1209,"line":20100},[1207,35079,35080],{"class":1224},"               --users 50 \\\n",[1207,35082,35083],{"class":1209,"line":20126},[1207,35084,35085],{"class":1224},"               --spawn-rate 5 \\\n",[1207,35087,35088],{"class":1209,"line":24574},[1207,35089,35090],{"class":1224},"               --run-time 2m \\\n",[1207,35092,35093],{"class":1209,"line":24593},[1207,35094,35095],{"class":1224},"               --headless \\\n",[1207,35097,35098],{"class":1209,"line":24612},[1207,35099,35100],{"class":1224},"               --html=performance-report.html\n",[1207,35102,35103],{"class":1209,"line":24631},[1207,35104,1763],{"class":1224},[1207,35106,35107,35109,35111,35113],{"class":1209,"line":24648},[1207,35108,32998],{"class":1632},[1207,35110,13312],{"class":20171},[1207,35112,2458],{"class":1632},[1207,35114,35115],{"class":1224}," Upload performance report\n",[1207,35117,35118,35120,35122],{"class":1209,"line":24654},[1207,35119,33026],{"class":20171},[1207,35121,2458],{"class":1632},[1207,35123,33546],{"class":1224},[1207,35125,35126,35128],{"class":1209,"line":24659},[1207,35127,33036],{"class":20171},[1207,35129,1743],{"class":1632},[1207,35131,35132,35134,35136],{"class":1209,"line":24664},[1207,35133,33517],{"class":20171},[1207,35135,2458],{"class":1632},[1207,35137,35138],{"class":1224}," performance-report\n",[1207,35140,35141,35143,35145],{"class":1209,"line":24680},[1207,35142,33355],{"class":20171},[1207,35144,2458],{"class":1632},[1207,35146,35147],{"class":1224}," performance-report.html\n",[1207,35149,35150],{"class":1209,"line":24691},[1207,35151,1763],{"class":1620},[1207,35153,35154,35156,35158,35160],{"class":1209,"line":24702},[1207,35155,32998],{"class":1632},[1207,35157,13312],{"class":20171},[1207,35159,2458],{"class":1632},[1207,35161,34644],{"class":1224},[1207,35163,35164,35166,35168],{"class":1209,"line":24714},[1207,35165,33551],{"class":20171},[1207,35167,2458],{"class":1632},[1207,35169,33556],{"class":1224},[1207,35171,35172,35174,35176],{"class":1209,"line":24723},[1207,35173,33068],{"class":20171},[1207,35175,2458],{"class":1632},[1207,35177,33073],{"class":1616},[1207,35179,35180],{"class":1209,"line":24728},[1207,35181,34665],{"class":1224},[1207,35183,35184],{"class":1209,"line":24733},[1207,35185,1527],{"emptyLinePlaceholder":1526},[1207,35187,35188],{"class":1209,"line":24750},[1207,35189,35190],{"class":1213},"# Scheduled performance tests (weekly)\n",[1207,35192,35193],{"class":1209,"line":24796},[1207,35194,35195],{"class":1213},"# on:\n",[1207,35197,35198],{"class":1209,"line":24801},[1207,35199,35200],{"class":1213},"#   schedule:\n",[1207,35202,35203],{"class":1209,"line":24817},[1207,35204,35205],{"class":1213},"#     - cron: '0 2 * * 1'  # Every Monday at 2 AM\n",[1038,35207,35209],{"id":35208},"local-development-testing","Local Development Testing",[1026,35211,35212],{},"Create scripts to make testing easier for developers:",[1197,35214,35216],{"className":1199,"code":35215,"language":1201,"meta":1202,"style":1202},"#!/bin/bash\n# scripts/test.sh - Comprehensive test runner\n\nset -e  # Exit on any error\n\necho \"🧪 Running comprehensive test suite...\"\n\n# Colors for output\nRED='\\033[0;31m'\nGREEN='\\033[0;32m'\nYELLOW='\\033[1;33m'\nNC='\\033[0m' # No Color\n\n# Function to print colored output\nprint_status() {\n    echo -e \"${GREEN}✓${NC} $1\"\n}\n\nprint_warning() {\n    echo -e \"${YELLOW}⚠${NC} $1\"\n}\n\nprint_error() {\n    echo -e \"${RED}✗${NC} $1\"\n}\n\n# Check if virtual environment is activated\nif [[ \"$VIRTUAL_ENV\" == \"\" ]]; then\n    print_warning \"Virtual environment not detected. Activating...\"\n    source venv/bin/activate\nfi\n\n# Install dependencies\nprint_status \"Installing dependencies...\"\npip install -r requirements.txt\npip install -r requirements-test.txt\n\n# Code quality checks\nprint_status \"Running code quality checks...\"\necho \"  - Checking code formatting...\"\nblack --check . || (print_error \"Code formatting issues found. Run 'black .' to fix.\" && exit 1)\n\necho \"  - Checking import sorting...\"\nisort --check-only . || (print_error \"Import sorting issues found. Run 'isort .' to fix.\" && exit 1)\n\necho \"  - Running linter...\"\nflake8 . || (print_error \"Linting issues found.\" && exit 1)\n\necho \"  - Type checking...\"\nmypy user_service --ignore-missing-imports || print_warning \"Type checking issues found.\"\n\n# Unit tests\nprint_status \"Running unit tests...\"\npytest tests/unit/ -m \"unit and not slow\" --cov --cov-report=term-missing\n\n# Integration tests (if services are available)\nif curl -s http://localhost:5432 > /dev/null 2>&1; then\n    print_status \"Running integration tests...\"\n    pytest tests/integration/ -m \"integration\"\nelse\n    print_warning \"Database not available. Skipping integration tests.\"\nfi\n\n# Contract tests\nprint_status \"Running contract tests...\"\npytest tests/contract/ -m \"contract\" || print_warning \"Contract tests failed or skipped.\"\n\n# Security checks\nprint_status \"Running security checks...\"\nbandit -r . -ll || print_warning \"Security issues found.\"\nsafety check || print_warning \"Vulnerable dependencies found.\"\n\nprint_status \"All tests completed successfully! 🎉\"\n",[1204,35217,35218,35223,35228,35232,35242,35246,35258,35262,35267,35282,35296,35310,35327,35331,35336,35345,35376,35380,35384,35393,35420,35424,35428,35437,35464,35468,35472,35477,35502,35514,35522,35527,35531,35536,35547,35559,35570,35574,35579,35590,35601,35636,35640,35651,35682,35686,35697,35725,35729,35740,35762,35766,35771,35782,35804,35808,35813,35839,35851,35868,35873,35884,35888,35892,35897,35908,35935,35939,35944,35955,35978,35997,36001],{"__ignoreMap":1202},[1207,35219,35220],{"class":1209,"line":1210},[1207,35221,35222],{"class":1213},"#!/bin/bash\n",[1207,35224,35225],{"class":1209,"line":1217},[1207,35226,35227],{"class":1213},"# scripts/test.sh - Comprehensive test runner\n",[1207,35229,35230],{"class":1209,"line":1238},[1207,35231,1527],{"emptyLinePlaceholder":1526},[1207,35233,35234,35236,35239],{"class":1209,"line":1254},[1207,35235,18496],{"class":5160},[1207,35237,35238],{"class":13424}," -e",[1207,35240,35241],{"class":1213},"  # Exit on any error\n",[1207,35243,35244],{"class":1209,"line":1270},[1207,35245,1527],{"emptyLinePlaceholder":1526},[1207,35247,35248,35251,35253,35256],{"class":1209,"line":1535},[1207,35249,35250],{"class":5160},"echo",[1207,35252,11109],{"class":1964},[1207,35254,35255],{"class":1224},"🧪 Running comprehensive test suite...",[1207,35257,11115],{"class":1964},[1207,35259,35260],{"class":1209,"line":1710},[1207,35261,1527],{"emptyLinePlaceholder":1526},[1207,35263,35264],{"class":1209,"line":1727},[1207,35265,35266],{"class":1213},"# Colors for output\n",[1207,35268,35269,35273,35275,35277,35280],{"class":1209,"line":1732},[1207,35270,35272],{"class":35271},"sSC40","RED",[1207,35274,1961],{"class":1632},[1207,35276,1965],{"class":1964},[1207,35278,35279],{"class":1224},"\\033[0;31m",[1207,35281,2006],{"class":1964},[1207,35283,35284,35287,35289,35291,35294],{"class":1209,"line":1746},[1207,35285,35286],{"class":35271},"GREEN",[1207,35288,1961],{"class":1632},[1207,35290,1965],{"class":1964},[1207,35292,35293],{"class":1224},"\\033[0;32m",[1207,35295,2006],{"class":1964},[1207,35297,35298,35301,35303,35305,35308],{"class":1209,"line":1753},[1207,35299,35300],{"class":35271},"YELLOW",[1207,35302,1961],{"class":1632},[1207,35304,1965],{"class":1964},[1207,35306,35307],{"class":1224},"\\033[1;33m",[1207,35309,2006],{"class":1964},[1207,35311,35312,35315,35317,35319,35322,35324],{"class":1209,"line":1760},[1207,35313,35314],{"class":35271},"NC",[1207,35316,1961],{"class":1632},[1207,35318,1965],{"class":1964},[1207,35320,35321],{"class":1224},"\\033[0m",[1207,35323,1965],{"class":1964},[1207,35325,35326],{"class":1213}," # No Color\n",[1207,35328,35329],{"class":1209,"line":1766},[1207,35330,1527],{"emptyLinePlaceholder":1526},[1207,35332,35333],{"class":1209,"line":1772},[1207,35334,35335],{"class":1213},"# Function to print colored output\n",[1207,35337,35338,35341,35343],{"class":1209,"line":1778},[1207,35339,35340],{"class":1794},"print_status",[1207,35342,4156],{"class":1632},[1207,35344,2445],{"class":1632},[1207,35346,35347,35350,35352,35354,35357,35360,35362,35365,35367,35369,35371,35374],{"class":1209,"line":1783},[1207,35348,35349],{"class":5160},"    echo",[1207,35351,35238],{"class":13424},[1207,35353,11109],{"class":1964},[1207,35355,35356],{"class":1632},"${",[1207,35358,35286],{"class":35359},"su_V2",[1207,35361,3294],{"class":1632},[1207,35363,35364],{"class":1224},"✓",[1207,35366,35356],{"class":1632},[1207,35368,35314],{"class":35359},[1207,35370,3294],{"class":1632},[1207,35372,35373],{"class":1756}," $1",[1207,35375,11115],{"class":1964},[1207,35377,35378],{"class":1209,"line":1788},[1207,35379,2817],{"class":1632},[1207,35381,35382],{"class":1209,"line":1803},[1207,35383,1527],{"emptyLinePlaceholder":1526},[1207,35385,35386,35389,35391],{"class":1209,"line":1821},[1207,35387,35388],{"class":1794},"print_warning",[1207,35390,4156],{"class":1632},[1207,35392,2445],{"class":1632},[1207,35394,35395,35397,35399,35401,35403,35405,35407,35410,35412,35414,35416,35418],{"class":1209,"line":1827},[1207,35396,35349],{"class":5160},[1207,35398,35238],{"class":13424},[1207,35400,11109],{"class":1964},[1207,35402,35356],{"class":1632},[1207,35404,35300],{"class":35359},[1207,35406,3294],{"class":1632},[1207,35408,35409],{"class":1224},"⚠",[1207,35411,35356],{"class":1632},[1207,35413,35314],{"class":35359},[1207,35415,3294],{"class":1632},[1207,35417,35373],{"class":1756},[1207,35419,11115],{"class":1964},[1207,35421,35422],{"class":1209,"line":1833},[1207,35423,2817],{"class":1632},[1207,35425,35426],{"class":1209,"line":1839},[1207,35427,1527],{"emptyLinePlaceholder":1526},[1207,35429,35430,35433,35435],{"class":1209,"line":1845},[1207,35431,35432],{"class":1794},"print_error",[1207,35434,4156],{"class":1632},[1207,35436,2445],{"class":1632},[1207,35438,35439,35441,35443,35445,35447,35449,35451,35454,35456,35458,35460,35462],{"class":1209,"line":1851},[1207,35440,35349],{"class":5160},[1207,35442,35238],{"class":13424},[1207,35444,11109],{"class":1964},[1207,35446,35356],{"class":1632},[1207,35448,35272],{"class":35359},[1207,35450,3294],{"class":1632},[1207,35452,35453],{"class":1224},"✗",[1207,35455,35356],{"class":1632},[1207,35457,35314],{"class":35359},[1207,35459,3294],{"class":1632},[1207,35461,35373],{"class":1756},[1207,35463,11115],{"class":1964},[1207,35465,35466],{"class":1209,"line":1856},[1207,35467,2817],{"class":1632},[1207,35469,35470],{"class":1209,"line":1869},[1207,35471,1527],{"emptyLinePlaceholder":1526},[1207,35473,35474],{"class":1209,"line":1874},[1207,35475,35476],{"class":1213},"# Check if virtual environment is activated\n",[1207,35478,35479,35481,35484,35486,35489,35491,35493,35496,35499],{"class":1209,"line":1885},[1207,35480,25156],{"class":1616},[1207,35482,35483],{"class":1632}," [[",[1207,35485,11109],{"class":1964},[1207,35487,35488],{"class":35359},"$VIRTUAL_ENV",[1207,35490,3297],{"class":1964},[1207,35492,2164],{"class":2163},[1207,35494,35495],{"class":1964}," \"\"",[1207,35497,35498],{"class":1632}," ]];",[1207,35500,35501],{"class":1616}," then\n",[1207,35503,35504,35507,35509,35512],{"class":1209,"line":1899},[1207,35505,35506],{"class":1220},"    print_warning",[1207,35508,11109],{"class":1964},[1207,35510,35511],{"class":1224},"Virtual environment not detected. Activating...",[1207,35513,11115],{"class":1964},[1207,35515,35516,35519],{"class":1209,"line":1904},[1207,35517,35518],{"class":5160},"    source",[1207,35520,35521],{"class":1224}," venv/bin/activate\n",[1207,35523,35524],{"class":1209,"line":1910},[1207,35525,35526],{"class":1616},"fi\n",[1207,35528,35529],{"class":1209,"line":1915},[1207,35530,1527],{"emptyLinePlaceholder":1526},[1207,35532,35533],{"class":1209,"line":1921},[1207,35534,35535],{"class":1213},"# Install dependencies\n",[1207,35537,35538,35540,35542,35545],{"class":1209,"line":1927},[1207,35539,35340],{"class":1220},[1207,35541,11109],{"class":1964},[1207,35543,35544],{"class":1224},"Installing dependencies...",[1207,35546,11115],{"class":1964},[1207,35548,35549,35551,35553,35556],{"class":1209,"line":1932},[1207,35550,1221],{"class":1220},[1207,35552,1225],{"class":1224},[1207,35554,35555],{"class":13424}," -r",[1207,35557,35558],{"class":1224}," requirements.txt\n",[1207,35560,35561,35563,35565,35567],{"class":1209,"line":1954},[1207,35562,1221],{"class":1220},[1207,35564,1225],{"class":1224},[1207,35566,35555],{"class":13424},[1207,35568,35569],{"class":1224}," requirements-test.txt\n",[1207,35571,35572],{"class":1209,"line":1976},[1207,35573,1527],{"emptyLinePlaceholder":1526},[1207,35575,35576],{"class":1209,"line":1993},[1207,35577,35578],{"class":1213},"# Code quality checks\n",[1207,35580,35581,35583,35585,35588],{"class":1209,"line":2009},[1207,35582,35340],{"class":1220},[1207,35584,11109],{"class":1964},[1207,35586,35587],{"class":1224},"Running code quality checks...",[1207,35589,11115],{"class":1964},[1207,35591,35592,35594,35596,35599],{"class":1209,"line":2015},[1207,35593,35250],{"class":5160},[1207,35595,11109],{"class":1964},[1207,35597,35598],{"class":1224},"  - Checking code formatting...",[1207,35600,11115],{"class":1964},[1207,35602,35603,35606,35609,35611,35614,35617,35619,35621,35624,35626,35629,35632,35634],{"class":1209,"line":2020},[1207,35604,35605],{"class":1220},"black",[1207,35607,35608],{"class":13424}," --check",[1207,35610,13259],{"class":1224},[1207,35612,35613],{"class":2163}," ||",[1207,35615,35616],{"class":1632}," (",[1207,35618,35432],{"class":1220},[1207,35620,11109],{"class":1964},[1207,35622,35623],{"class":1224},"Code formatting issues found. Run 'black .' to fix.",[1207,35625,3297],{"class":1964},[1207,35627,35628],{"class":1632}," &&",[1207,35630,35631],{"class":5160}," exit",[1207,35633,22275],{"class":1231},[1207,35635,2136],{"class":1632},[1207,35637,35638],{"class":1209,"line":2037},[1207,35639,1527],{"emptyLinePlaceholder":1526},[1207,35641,35642,35644,35646,35649],{"class":1209,"line":2060},[1207,35643,35250],{"class":5160},[1207,35645,11109],{"class":1964},[1207,35647,35648],{"class":1224},"  - Checking import sorting...",[1207,35650,11115],{"class":1964},[1207,35652,35653,35656,35659,35661,35663,35665,35667,35669,35672,35674,35676,35678,35680],{"class":1209,"line":2065},[1207,35654,35655],{"class":1220},"isort",[1207,35657,35658],{"class":13424}," --check-only",[1207,35660,13259],{"class":1224},[1207,35662,35613],{"class":2163},[1207,35664,35616],{"class":1632},[1207,35666,35432],{"class":1220},[1207,35668,11109],{"class":1964},[1207,35670,35671],{"class":1224},"Import sorting issues found. Run 'isort .' to fix.",[1207,35673,3297],{"class":1964},[1207,35675,35628],{"class":1632},[1207,35677,35631],{"class":5160},[1207,35679,22275],{"class":1231},[1207,35681,2136],{"class":1632},[1207,35683,35684],{"class":1209,"line":2071},[1207,35685,1527],{"emptyLinePlaceholder":1526},[1207,35687,35688,35690,35692,35695],{"class":1209,"line":2076},[1207,35689,35250],{"class":5160},[1207,35691,11109],{"class":1964},[1207,35693,35694],{"class":1224},"  - Running linter...",[1207,35696,11115],{"class":1964},[1207,35698,35699,35702,35704,35706,35708,35710,35712,35715,35717,35719,35721,35723],{"class":1209,"line":2082},[1207,35700,35701],{"class":1220},"flake8",[1207,35703,13259],{"class":1224},[1207,35705,35613],{"class":2163},[1207,35707,35616],{"class":1632},[1207,35709,35432],{"class":1220},[1207,35711,11109],{"class":1964},[1207,35713,35714],{"class":1224},"Linting issues found.",[1207,35716,3297],{"class":1964},[1207,35718,35628],{"class":1632},[1207,35720,35631],{"class":5160},[1207,35722,22275],{"class":1231},[1207,35724,2136],{"class":1632},[1207,35726,35727],{"class":1209,"line":2088},[1207,35728,1527],{"emptyLinePlaceholder":1526},[1207,35730,35731,35733,35735,35738],{"class":1209,"line":2094},[1207,35732,35250],{"class":5160},[1207,35734,11109],{"class":1964},[1207,35736,35737],{"class":1224},"  - Type checking...",[1207,35739,11115],{"class":1964},[1207,35741,35742,35745,35747,35750,35752,35755,35757,35760],{"class":1209,"line":2100},[1207,35743,35744],{"class":1220},"mypy",[1207,35746,1697],{"class":1224},[1207,35748,35749],{"class":13424}," --ignore-missing-imports",[1207,35751,35613],{"class":2163},[1207,35753,35754],{"class":1220}," print_warning",[1207,35756,11109],{"class":1964},[1207,35758,35759],{"class":1224},"Type checking issues found.",[1207,35761,11115],{"class":1964},[1207,35763,35764],{"class":1209,"line":2105},[1207,35765,1527],{"emptyLinePlaceholder":1526},[1207,35767,35768],{"class":1209,"line":2111},[1207,35769,35770],{"class":1213},"# Unit tests\n",[1207,35772,35773,35775,35777,35780],{"class":1209,"line":2139},[1207,35774,35340],{"class":1220},[1207,35776,11109],{"class":1964},[1207,35778,35779],{"class":1224},"Running unit tests...",[1207,35781,11115],{"class":1964},[1207,35783,35784,35786,35789,35791,35793,35796,35798,35801],{"class":1209,"line":2144},[1207,35785,1795],{"class":1220},[1207,35787,35788],{"class":1224}," tests/unit/",[1207,35790,20410],{"class":13424},[1207,35792,11109],{"class":1964},[1207,35794,35795],{"class":1224},"unit and not slow",[1207,35797,3297],{"class":1964},[1207,35799,35800],{"class":13424}," --cov",[1207,35802,35803],{"class":13424}," --cov-report=term-missing\n",[1207,35805,35806],{"class":1209,"line":2150},[1207,35807,1527],{"emptyLinePlaceholder":1526},[1207,35809,35810],{"class":1209,"line":2174},[1207,35811,35812],{"class":1213},"# Integration tests (if services are available)\n",[1207,35814,35815,35817,35820,35823,35826,35828,35831,35834,35837],{"class":1209,"line":2195},[1207,35816,25156],{"class":1616},[1207,35818,35819],{"class":1220}," curl",[1207,35821,35822],{"class":13424}," -s",[1207,35824,35825],{"class":1224}," http://localhost:5432",[1207,35827,22047],{"class":2163},[1207,35829,35830],{"class":1224}," /dev/null",[1207,35832,35833],{"class":2163}," 2>&1",[1207,35835,35836],{"class":1632},";",[1207,35838,35501],{"class":1616},[1207,35840,35841,35844,35846,35849],{"class":1209,"line":2215},[1207,35842,35843],{"class":1220},"    print_status",[1207,35845,11109],{"class":1964},[1207,35847,35848],{"class":1224},"Running integration tests...",[1207,35850,11115],{"class":1964},[1207,35852,35853,35856,35859,35861,35863,35866],{"class":1209,"line":2220},[1207,35854,35855],{"class":1220},"    pytest",[1207,35857,35858],{"class":1224}," tests/integration/",[1207,35860,20410],{"class":13424},[1207,35862,11109],{"class":1964},[1207,35864,35865],{"class":1224},"integration",[1207,35867,11115],{"class":1964},[1207,35869,35870],{"class":1209,"line":2235},[1207,35871,35872],{"class":1616},"else\n",[1207,35874,35875,35877,35879,35882],{"class":1209,"line":2253},[1207,35876,35506],{"class":1220},[1207,35878,11109],{"class":1964},[1207,35880,35881],{"class":1224},"Database not available. Skipping integration tests.",[1207,35883,11115],{"class":1964},[1207,35885,35886],{"class":1209,"line":2258},[1207,35887,35526],{"class":1616},[1207,35889,35890],{"class":1209,"line":2264},[1207,35891,1527],{"emptyLinePlaceholder":1526},[1207,35893,35894],{"class":1209,"line":2269},[1207,35895,35896],{"class":1213},"# Contract tests\n",[1207,35898,35899,35901,35903,35906],{"class":1209,"line":2275},[1207,35900,35340],{"class":1220},[1207,35902,11109],{"class":1964},[1207,35904,35905],{"class":1224},"Running contract tests...",[1207,35907,11115],{"class":1964},[1207,35909,35910,35912,35915,35917,35919,35922,35924,35926,35928,35930,35933],{"class":1209,"line":2281},[1207,35911,1795],{"class":1220},[1207,35913,35914],{"class":1224}," tests/contract/",[1207,35916,20410],{"class":13424},[1207,35918,11109],{"class":1964},[1207,35920,35921],{"class":1224},"contract",[1207,35923,3297],{"class":1964},[1207,35925,35613],{"class":2163},[1207,35927,35754],{"class":1220},[1207,35929,11109],{"class":1964},[1207,35931,35932],{"class":1224},"Contract tests failed or skipped.",[1207,35934,11115],{"class":1964},[1207,35936,35937],{"class":1209,"line":2286},[1207,35938,1527],{"emptyLinePlaceholder":1526},[1207,35940,35941],{"class":1209,"line":2292},[1207,35942,35943],{"class":1213},"# Security checks\n",[1207,35945,35946,35948,35950,35953],{"class":1209,"line":2313},[1207,35947,35340],{"class":1220},[1207,35949,11109],{"class":1964},[1207,35951,35952],{"class":1224},"Running security checks...",[1207,35954,11115],{"class":1964},[1207,35956,35957,35960,35962,35964,35967,35969,35971,35973,35976],{"class":1209,"line":2334},[1207,35958,35959],{"class":1220},"bandit",[1207,35961,35555],{"class":13424},[1207,35963,13259],{"class":1224},[1207,35965,35966],{"class":13424}," -ll",[1207,35968,35613],{"class":2163},[1207,35970,35754],{"class":1220},[1207,35972,11109],{"class":1964},[1207,35974,35975],{"class":1224},"Security issues found.",[1207,35977,11115],{"class":1964},[1207,35979,35980,35983,35986,35988,35990,35992,35995],{"class":1209,"line":2339},[1207,35981,35982],{"class":1220},"safety",[1207,35984,35985],{"class":1224}," check",[1207,35987,35613],{"class":2163},[1207,35989,35754],{"class":1220},[1207,35991,11109],{"class":1964},[1207,35993,35994],{"class":1224},"Vulnerable dependencies found.",[1207,35996,11115],{"class":1964},[1207,35998,35999],{"class":1209,"line":2358},[1207,36000,1527],{"emptyLinePlaceholder":1526},[1207,36002,36003,36005,36007,36010],{"class":1209,"line":2381},[1207,36004,35340],{"class":1220},[1207,36006,11109],{"class":1964},[1207,36008,36009],{"class":1224},"All tests completed successfully! 🎉",[1207,36011,11115],{"class":1964},[1197,36013,36015],{"className":1199,"code":36014,"language":1201,"meta":1202,"style":1202},"#!/bin/bash\n# scripts/test-quick.sh - Quick test runner for development\n\necho \"🚀 Running quick tests...\"\n\n# Run only fast unit tests\npytest tests/unit/ -m \"unit and not slow\" -x --tb=short\n\necho \"✅ Quick tests completed!\"\n",[1204,36016,36017,36021,36026,36030,36041,36045,36050,36070,36074],{"__ignoreMap":1202},[1207,36018,36019],{"class":1209,"line":1210},[1207,36020,35222],{"class":1213},[1207,36022,36023],{"class":1209,"line":1217},[1207,36024,36025],{"class":1213},"# scripts/test-quick.sh - Quick test runner for development\n",[1207,36027,36028],{"class":1209,"line":1238},[1207,36029,1527],{"emptyLinePlaceholder":1526},[1207,36031,36032,36034,36036,36039],{"class":1209,"line":1254},[1207,36033,35250],{"class":5160},[1207,36035,11109],{"class":1964},[1207,36037,36038],{"class":1224},"🚀 Running quick tests...",[1207,36040,11115],{"class":1964},[1207,36042,36043],{"class":1209,"line":1270},[1207,36044,1527],{"emptyLinePlaceholder":1526},[1207,36046,36047],{"class":1209,"line":1535},[1207,36048,36049],{"class":1213},"# Run only fast unit tests\n",[1207,36051,36052,36054,36056,36058,36060,36062,36064,36067],{"class":1209,"line":1710},[1207,36053,1795],{"class":1220},[1207,36055,35788],{"class":1224},[1207,36057,20410],{"class":13424},[1207,36059,11109],{"class":1964},[1207,36061,35795],{"class":1224},[1207,36063,3297],{"class":1964},[1207,36065,36066],{"class":13424}," -x",[1207,36068,36069],{"class":13424}," --tb=short\n",[1207,36071,36072],{"class":1209,"line":1727},[1207,36073,1527],{"emptyLinePlaceholder":1526},[1207,36075,36076,36078,36080,36083],{"class":1209,"line":1732},[1207,36077,35250],{"class":5160},[1207,36079,11109],{"class":1964},[1207,36081,36082],{"class":1224},"✅ Quick tests completed!",[1207,36084,11115],{"class":1964},[1197,36086,36088],{"className":1199,"code":36087,"language":1201,"meta":1202,"style":1202},"#!/bin/bash\n# scripts/test-watch.sh - Watch mode for continuous testing\n\necho \"👀 Starting test watch mode...\"\n\n# Install pytest-watch if not available\npip install pytest-watch\n\n# Watch for changes and run tests\nptw tests/unit/ -- -m \"unit and not slow\" --tb=short\n",[1204,36089,36090,36094,36099,36103,36114,36118,36123,36132,36136,36141],{"__ignoreMap":1202},[1207,36091,36092],{"class":1209,"line":1210},[1207,36093,35222],{"class":1213},[1207,36095,36096],{"class":1209,"line":1217},[1207,36097,36098],{"class":1213},"# scripts/test-watch.sh - Watch mode for continuous testing\n",[1207,36100,36101],{"class":1209,"line":1238},[1207,36102,1527],{"emptyLinePlaceholder":1526},[1207,36104,36105,36107,36109,36112],{"class":1209,"line":1254},[1207,36106,35250],{"class":5160},[1207,36108,11109],{"class":1964},[1207,36110,36111],{"class":1224},"👀 Starting test watch mode...",[1207,36113,11115],{"class":1964},[1207,36115,36116],{"class":1209,"line":1270},[1207,36117,1527],{"emptyLinePlaceholder":1526},[1207,36119,36120],{"class":1209,"line":1535},[1207,36121,36122],{"class":1213},"# Install pytest-watch if not available\n",[1207,36124,36125,36127,36129],{"class":1209,"line":1710},[1207,36126,1221],{"class":1220},[1207,36128,1225],{"class":1224},[1207,36130,36131],{"class":1224}," pytest-watch\n",[1207,36133,36134],{"class":1209,"line":1727},[1207,36135,1527],{"emptyLinePlaceholder":1526},[1207,36137,36138],{"class":1209,"line":1732},[1207,36139,36140],{"class":1213},"# Watch for changes and run tests\n",[1207,36142,36143,36146,36148,36151,36153,36155,36157,36159],{"class":1209,"line":1746},[1207,36144,36145],{"class":1220},"ptw",[1207,36147,35788],{"class":1224},[1207,36149,36150],{"class":13424}," --",[1207,36152,20410],{"class":13424},[1207,36154,11109],{"class":1964},[1207,36156,35795],{"class":1224},[1207,36158,3297],{"class":1964},[1207,36160,36069],{"class":13424},[1026,36162,36163],{},"This completes the comprehensive testing chapter for Django microservices! The chapter now covers all aspects of testing from unit tests to load testing, with detailed explanations suitable for beginners.",[36165,36166,36167],"style",{},"html pre.shiki code .s9Tkl, html code.shiki .s9Tkl{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#A0ADA0;--shiki-default-font-style:inherit;--shiki-dark:#758575DD;--shiki-dark-font-style:inherit}html pre.shiki code .sYn-s, html code.shiki .sYn-s{--shiki-light:#E2931D;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sTbE_, html code.shiki .sTbE_{--shiki-light:#91B859;--shiki-default:#B56959;--shiki-dark:#C98A7D}html pre.shiki code .s7CZa, html code.shiki .s7CZa{--shiki-light:#F76D47;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .siDh9, html code.shiki .siDh9{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#1E754F;--shiki-default-font-style:inherit;--shiki-dark:#4D9375;--shiki-dark-font-style:inherit}html pre.shiki code .sftqT, html code.shiki .sftqT{--shiki-light:#90A4AE;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .soVBu, html code.shiki .soVBu{--shiki-light:#39ADB5;--shiki-default:#999999;--shiki-dark:#666666}html pre.shiki code .s5Kfy, html code.shiki .s5Kfy{--shiki-light:#9C3EDA;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .sD-vU, html code.shiki .sD-vU{--shiki-light:#E2931D;--shiki-default:#2E8F82;--shiki-dark:#5DA994}html pre.shiki code .sm7ve, html code.shiki .sm7ve{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#B5695977;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D77;--shiki-dark-font-style:inherit}html pre.shiki code .sVyVU, html code.shiki .sVyVU{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B56959;--shiki-default-font-style:inherit;--shiki-dark:#C98A7D;--shiki-dark-font-style:inherit}html pre.shiki code .sljsM, html code.shiki .sljsM{--shiki-light:#6182B8;--shiki-default:#59873A;--shiki-dark:#80A665}html pre.shiki code .sRjD_, html code.shiki .sRjD_{--shiki-light:#E53935;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .siWMO, html code.shiki .siWMO{--shiki-light:#6182B8;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sBPpx, html code.shiki .sBPpx{--shiki-light:#E53935;--shiki-default:#393A34;--shiki-dark:#DBD7CAEE}html pre.shiki code .sqOPj, html code.shiki .sqOPj{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#B07D48;--shiki-default-font-style:inherit;--shiki-dark:#BD976A;--shiki-dark-font-style:inherit}html pre.shiki code .sbYkP, html code.shiki .sbYkP{--shiki-light:#39ADB5;--shiki-default:#B5695977;--shiki-dark:#C98A7D77}html pre.shiki code .sCyAa, html code.shiki .sCyAa{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#393A34;--shiki-default-font-style:inherit;--shiki-dark:#DBD7CAEE;--shiki-dark-font-style:inherit}html pre.shiki code .sVsLi, html code.shiki .sVsLi{--shiki-light:#39ADB5;--shiki-default:#AB5959;--shiki-dark:#CB7676}html pre.shiki code .s8XtY, html code.shiki .s8XtY{--shiki-light:#39ADB5;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .s3h35, html code.shiki .s3h35{--shiki-light:#F76D47;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sa2tF, html code.shiki .sa2tF{--shiki-light:#E2931D;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sJdAF, html code.shiki .sJdAF{--shiki-light:#6182B8;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sFGJz, html code.shiki .sFGJz{--shiki-light:#E53935;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .sRJPX, html code.shiki .sRJPX{--shiki-light:#91B859;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sGuSu, html code.shiki .sGuSu{--shiki-light:#39ADB5;--shiki-default:#2F798A;--shiki-dark:#4C9A91}html pre.shiki code .s27EL, html code.shiki .s27EL{--shiki-light:#91B859;--shiki-default:#AB5E3F;--shiki-dark:#C4704F}html pre.shiki code .sz9Cv, html code.shiki .sz9Cv{--shiki-light:#91B859;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .se3Ec, html code.shiki .se3Ec{--shiki-light:#90A4AE;--shiki-default:#A65E2B;--shiki-dark:#C99076}html pre.shiki code .suXOh, html code.shiki .suXOh{--shiki-light:#E53935;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .s131V, html code.shiki .s131V{--shiki-light:#90A4AE;--shiki-default:#998418;--shiki-dark:#B8A965}html pre.shiki code .sq3J1, html code.shiki .sq3J1{--shiki-light:#FF5370;--shiki-default:#1E754F;--shiki-dark:#4D9375}html pre.shiki code .sSC40, html code.shiki .sSC40{--shiki-light:#90A4AE;--shiki-default:#B07D48;--shiki-dark:#BD976A}html pre.shiki code .su_V2, html code.shiki .su_V2{--shiki-light:#90A4AE;--shiki-default:#B56959;--shiki-dark:#C98A7D}",{"title":1202,"searchDepth":1210,"depth":1217,"links":36169},[36170,36174,36178,36185,36190,36195,36201,36206,36210,36215],{"id":1032,"depth":1217,"text":1033,"children":36171},[36172,36173],{"id":1040,"depth":1238,"text":1041},{"id":1075,"depth":1238,"text":1076},{"id":1113,"depth":1217,"text":1114,"children":36175},[36176,36177],{"id":1120,"depth":1238,"text":1121},{"id":1157,"depth":1238,"text":1158},{"id":1187,"depth":1217,"text":1188,"children":36179},[36180,36181,36182,36183,36184],{"id":1194,"depth":1238,"text":1195},{"id":1306,"depth":1238,"text":1307},{"id":1395,"depth":1238,"text":1396},{"id":1430,"depth":1238,"text":1431},{"id":1480,"depth":1238,"text":1481},{"id":1557,"depth":1217,"text":1558,"children":36186},[36187,36188,36189],{"id":1564,"depth":1238,"text":1565},{"id":1595,"depth":1238,"text":1596},{"id":3103,"depth":1238,"text":3104},{"id":4629,"depth":1217,"text":4630,"children":36191},[36192,36193,36194],{"id":4636,"depth":1238,"text":4637},{"id":4653,"depth":1238,"text":4654},{"id":6547,"depth":1238,"text":6548},{"id":9363,"depth":1217,"text":1396,"children":36196},[36197,36198,36199,36200],{"id":9369,"depth":1238,"text":9370},{"id":9398,"depth":1238,"text":9399},{"id":9428,"depth":1238,"text":9429},{"id":11740,"depth":1238,"text":11741},{"id":13518,"depth":1217,"text":13519,"children":36202},[36203,36204,36205],{"id":13525,"depth":1238,"text":13526},{"id":13554,"depth":1238,"text":13555},{"id":16864,"depth":1238,"text":16865},{"id":20496,"depth":1217,"text":20497,"children":36207},[36208,36209],{"id":20503,"depth":1238,"text":20504},{"id":20575,"depth":1238,"text":20576},{"id":26826,"depth":1217,"text":26827,"children":36211},[36212,36213,36214],{"id":26833,"depth":1238,"text":26834},{"id":26866,"depth":1238,"text":26867},{"id":26907,"depth":1238,"text":26908},{"id":31470,"depth":1217,"text":31471,"children":36216},[36217,36218,36219,36220],{"id":31477,"depth":1238,"text":31478},{"id":31750,"depth":1238,"text":31751},{"id":32847,"depth":1238,"text":32848},{"id":35208,"depth":1238,"text":35209},"md",null,{},{"title":905,"description":1028},"Erx0wPGuwMpQfww9v98VHADOH_1Tw8D5NAXhKl-z-uY",[36227,36229],{"title":901,"path":902,"stem":903,"description":36228,"children":-1},"Microservices architecture often requires asynchronous task processing and inter-service communication. Celery, combined with RabbitMQ as a message broker, provides a robust solution for orchestrating tasks across your Django microservices ecosystem.",{"title":909,"path":910,"stem":911,"description":36230,"children":-1},"Deploying microservices requires careful orchestration of multiple services, their dependencies, and infrastructure components. This chapter covers deployment strategies, containerization, orchestration platforms, and best practices for production-ready Django microservices.",1772474963913]