@mytechtoday/augment-extensions 0.7.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +265 -232
- package/README.md +956 -771
- package/augment-extensions/coding-standards/bash/README.md +196 -196
- package/augment-extensions/coding-standards/bash/module.json +163 -163
- package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -336
- package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -289
- package/augment-extensions/coding-standards/css/README.md +40 -40
- package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -550
- package/augment-extensions/coding-standards/css/module.json +44 -44
- package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -448
- package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -492
- package/augment-extensions/coding-standards/html/README.md +40 -40
- package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -267
- package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -505
- package/augment-extensions/coding-standards/html/module.json +44 -44
- package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -349
- package/augment-extensions/coding-standards/html-css-js/README.md +194 -194
- package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -487
- package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -550
- package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -667
- package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -267
- package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -612
- package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -505
- package/augment-extensions/coding-standards/html-css-js/module.json +48 -48
- package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -515
- package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -448
- package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -492
- package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -439
- package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -349
- package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -486
- package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -463
- package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -543
- package/augment-extensions/coding-standards/js/README.md +46 -46
- package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -487
- package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -667
- package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -612
- package/augment-extensions/coding-standards/js/module.json +49 -49
- package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -515
- package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -439
- package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -486
- package/augment-extensions/coding-standards/js/rules/performance.md +463 -463
- package/augment-extensions/coding-standards/js/rules/tooling.md +543 -543
- package/augment-extensions/coding-standards/php/README.md +248 -248
- package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -204
- package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -206
- package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -234
- package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -211
- package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -215
- package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -189
- package/augment-extensions/coding-standards/php/module.json +166 -166
- package/augment-extensions/coding-standards/php/rules/api-development.md +480 -480
- package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -332
- package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -472
- package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -561
- package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -402
- package/augment-extensions/coding-standards/php/rules/documentation.md +425 -425
- package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -627
- package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -336
- package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -677
- package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -279
- package/augment-extensions/coding-standards/php/rules/performance.md +392 -392
- package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -186
- package/augment-extensions/coding-standards/php/rules/security.md +358 -358
- package/augment-extensions/coding-standards/php/rules/testing.md +403 -403
- package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -331
- package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -426
- package/augment-extensions/coding-standards/powershell/README.md +154 -154
- package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -272
- package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -173
- package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -243
- package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -297
- package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -224
- package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -340
- package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -255
- package/augment-extensions/coding-standards/powershell/module.json +165 -165
- package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -439
- package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -240
- package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -384
- package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -383
- package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -482
- package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -296
- package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -314
- package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -466
- package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -244
- package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -266
- package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -209
- package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -314
- package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -268
- package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -197
- package/augment-extensions/coding-standards/python/README.md +48 -48
- package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -373
- package/augment-extensions/coding-standards/python/module.json +30 -30
- package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -884
- package/augment-extensions/coding-standards/python/rules/best-practices.md +232 -232
- package/augment-extensions/coding-standards/python/rules/code-organization.md +220 -220
- package/augment-extensions/coding-standards/python/rules/documentation.md +831 -831
- package/augment-extensions/coding-standards/python/rules/error-handling.md +1008 -1008
- package/augment-extensions/coding-standards/python/rules/naming-conventions.md +172 -172
- package/augment-extensions/coding-standards/python/rules/testing.md +409 -409
- package/augment-extensions/coding-standards/python/rules/tooling.md +446 -446
- package/augment-extensions/coding-standards/python/rules/type-hints.md +253 -253
- package/augment-extensions/coding-standards/react/README.md +45 -45
- package/augment-extensions/coding-standards/react/module.json +27 -27
- package/augment-extensions/coding-standards/react/rules/component-patterns.md +214 -214
- package/augment-extensions/coding-standards/react/rules/hooks-best-practices.md +235 -235
- package/augment-extensions/coding-standards/react/rules/performance.md +300 -300
- package/augment-extensions/coding-standards/react/rules/state-management.md +265 -265
- package/augment-extensions/coding-standards/react/rules/typescript-react.md +271 -271
- package/augment-extensions/coding-standards/typescript/README.md +45 -45
- package/augment-extensions/coding-standards/typescript/module.json +27 -27
- package/augment-extensions/coding-standards/typescript/rules/naming-conventions.md +225 -225
- package/augment-extensions/collections/html-css-js/README.md +82 -82
- package/augment-extensions/collections/html-css-js/collection.json +41 -41
- package/augment-extensions/domain-rules/api-design/README.md +41 -41
- package/augment-extensions/domain-rules/api-design/module.json +27 -27
- package/augment-extensions/domain-rules/api-design/rules/authentication.md +263 -263
- package/augment-extensions/domain-rules/api-design/rules/documentation.md +395 -395
- package/augment-extensions/domain-rules/api-design/rules/error-handling.md +290 -290
- package/augment-extensions/domain-rules/api-design/rules/graphql-api.md +313 -313
- package/augment-extensions/domain-rules/api-design/rules/rest-api.md +214 -214
- package/augment-extensions/domain-rules/api-design/rules/versioning.md +268 -268
- package/augment-extensions/domain-rules/database/README.md +161 -161
- package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -793
- package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -1132
- package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -868
- package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -805
- package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -621
- package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -965
- package/augment-extensions/domain-rules/database/module.json +28 -28
- package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -624
- package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -588
- package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -856
- package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -778
- package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -963
- package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -1076
- package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -697
- package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -671
- package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -607
- package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -907
- package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -783
- package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -980
- package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -485
- package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -521
- package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -858
- package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -934
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/dracula/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/dracula/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/high-contrast/README.md +27 -27
- package/augment-extensions/domain-rules/design/color/themes/high-contrast/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/monokai/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/monokai/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/nord/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/nord/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/one-dark/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/one-dark/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/one-light/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/one-light/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/solarized-dark/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/solarized-dark/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/solarized-light/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/solarized-light/module.json +26 -26
- package/augment-extensions/domain-rules/design/color/themes/tokyo-night/README.md +23 -23
- package/augment-extensions/domain-rules/design/color/themes/tokyo-night/module.json +26 -26
- package/augment-extensions/domain-rules/mcp/README.md +150 -150
- package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -522
- package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -520
- package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -570
- package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -427
- package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -435
- package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -502
- package/augment-extensions/domain-rules/mcp/module.json +49 -49
- package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -595
- package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -345
- package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -687
- package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -636
- package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -484
- package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -360
- package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -393
- package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -194
- package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -625
- package/augment-extensions/domain-rules/security/README.md +41 -41
- package/augment-extensions/domain-rules/security/module.json +28 -28
- package/augment-extensions/domain-rules/security/rules/authentication-security.md +361 -361
- package/augment-extensions/domain-rules/security/rules/encryption.md +208 -208
- package/augment-extensions/domain-rules/security/rules/input-validation.md +294 -294
- package/augment-extensions/domain-rules/security/rules/owasp-top-10.md +339 -339
- package/augment-extensions/domain-rules/security/rules/secure-coding.md +293 -293
- package/augment-extensions/domain-rules/security/rules/web-security.md +268 -268
- package/augment-extensions/domain-rules/seo-sales-marketing/ANNOUNCEMENT.md +143 -0
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/README.md +140 -136
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/SCHEMA-VALIDATION-REPORT.md +216 -216
- package/augment-extensions/domain-rules/seo-sales-marketing/TEST-VALIDATION.md +129 -0
- package/augment-extensions/domain-rules/seo-sales-marketing/USAGE-GUIDES.md +254 -0
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/brand-kit-example.yaml +292 -292
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/campaign-brief-example.yaml +389 -389
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/content-calendar-example.yaml +643 -643
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/email-newsletter-example.md +376 -376
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/landing-page-example.md +934 -934
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/ppc-ad-copy-example.md +301 -301
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/seo-blog-post-example.md +347 -347
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/social-media-campaign-example.md +606 -606
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/module.json +50 -50
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/affiliate-influencer-marketing.md +593 -593
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/asset-management.md +418 -418
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/brand-consistency.md +210 -210
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/content-marketing.md +337 -337
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/conversion-optimization.md +455 -455
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/direct-sales.md +499 -499
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/email-marketing.md +439 -439
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/legal-compliance.md +227 -227
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/ppc-advertising.md +569 -569
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/seo-optimization.md +470 -470
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/social-media-marketing.md +414 -414
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/universal-marketing.md +177 -177
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/asset-inventory.schema.json +247 -247
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/brand-kit.schema.json +326 -326
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/campaign-brief.schema.json +342 -342
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/color-palette.schema.json +223 -223
- package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/content-template.schema.json +383 -383
- package/augment-extensions/domain-rules/wordpress/README.md +163 -163
- package/augment-extensions/domain-rules/wordpress/module.json +32 -32
- package/augment-extensions/domain-rules/wordpress/rules/coding-standards.md +617 -617
- package/augment-extensions/domain-rules/wordpress/rules/directory-structure.md +270 -270
- package/augment-extensions/domain-rules/wordpress/rules/file-patterns.md +423 -423
- package/augment-extensions/domain-rules/wordpress/rules/gutenberg-blocks.md +493 -493
- package/augment-extensions/domain-rules/wordpress/rules/performance.md +568 -568
- package/augment-extensions/domain-rules/wordpress/rules/plugin-development.md +510 -510
- package/augment-extensions/domain-rules/wordpress/rules/project-detection.md +251 -251
- package/augment-extensions/domain-rules/wordpress/rules/rest-api.md +501 -501
- package/augment-extensions/domain-rules/wordpress/rules/security.md +564 -564
- package/augment-extensions/domain-rules/wordpress/rules/theme-development.md +388 -388
- package/augment-extensions/domain-rules/wordpress/rules/woocommerce.md +441 -441
- package/augment-extensions/domain-rules/wordpress-plugin/README.md +139 -139
- package/augment-extensions/domain-rules/wordpress-plugin/examples/ajax-plugin.md +1599 -1599
- package/augment-extensions/domain-rules/wordpress-plugin/examples/custom-post-type-plugin.md +1727 -1727
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block-plugin.md +428 -428
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block.md +422 -422
- package/augment-extensions/domain-rules/wordpress-plugin/examples/mvc-plugin.md +1623 -1623
- package/augment-extensions/domain-rules/wordpress-plugin/examples/object-oriented-plugin.md +1343 -1343
- package/augment-extensions/domain-rules/wordpress-plugin/examples/rest-endpoint.md +734 -734
- package/augment-extensions/domain-rules/wordpress-plugin/examples/settings-page-plugin.md +1350 -1350
- package/augment-extensions/domain-rules/wordpress-plugin/examples/simple-procedural-plugin.md +503 -503
- package/augment-extensions/domain-rules/wordpress-plugin/examples/singleton-plugin.md +971 -971
- package/augment-extensions/domain-rules/wordpress-plugin/module.json +53 -53
- package/augment-extensions/domain-rules/wordpress-plugin/rules/activation-hooks.md +770 -770
- package/augment-extensions/domain-rules/wordpress-plugin/rules/admin-interface.md +874 -874
- package/augment-extensions/domain-rules/wordpress-plugin/rules/ajax-handlers.md +629 -629
- package/augment-extensions/domain-rules/wordpress-plugin/rules/asset-management.md +559 -559
- package/augment-extensions/domain-rules/wordpress-plugin/rules/context-providers.md +709 -709
- package/augment-extensions/domain-rules/wordpress-plugin/rules/cron-jobs.md +736 -736
- package/augment-extensions/domain-rules/wordpress-plugin/rules/database-management.md +1057 -1057
- package/augment-extensions/domain-rules/wordpress-plugin/rules/documentation-standards.md +463 -463
- package/augment-extensions/domain-rules/wordpress-plugin/rules/frontend-functionality.md +478 -478
- package/augment-extensions/domain-rules/wordpress-plugin/rules/gutenberg-blocks.md +818 -818
- package/augment-extensions/domain-rules/wordpress-plugin/rules/internationalization.md +416 -416
- package/augment-extensions/domain-rules/wordpress-plugin/rules/migration.md +667 -667
- package/augment-extensions/domain-rules/wordpress-plugin/rules/performance-optimization.md +878 -878
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-architecture.md +693 -693
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-structure.md +352 -352
- package/augment-extensions/domain-rules/wordpress-plugin/rules/rest-api.md +818 -818
- package/augment-extensions/domain-rules/wordpress-plugin/rules/scaffolding-workflow.md +624 -624
- package/augment-extensions/domain-rules/wordpress-plugin/rules/security-best-practices.md +866 -866
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing-patterns.md +1165 -1165
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing.md +414 -414
- package/augment-extensions/domain-rules/wordpress-plugin/rules/vscode-integration.md +751 -751
- package/augment-extensions/domain-rules/wordpress-plugin/rules/woocommerce-integration.md +949 -949
- package/augment-extensions/domain-rules/wordpress-plugin/rules/wordpress-org-submission.md +458 -458
- package/augment-extensions/examples/design-patterns/README.md +37 -37
- package/augment-extensions/examples/design-patterns/examples/behavioral-patterns.md +370 -370
- package/augment-extensions/examples/design-patterns/examples/creational-patterns.md +250 -250
- package/augment-extensions/examples/design-patterns/examples/structural-patterns.md +264 -264
- package/augment-extensions/examples/design-patterns/module.json +27 -27
- package/augment-extensions/examples/gutenberg-block-plugin/README.md +101 -101
- package/augment-extensions/examples/gutenberg-block-plugin/examples/testimonial-block.md +428 -428
- package/augment-extensions/examples/gutenberg-block-plugin/module.json +40 -40
- package/augment-extensions/examples/rest-api-plugin/README.md +98 -98
- package/augment-extensions/examples/rest-api-plugin/examples/task-manager-api.md +1299 -1299
- package/augment-extensions/examples/rest-api-plugin/module.json +40 -40
- package/augment-extensions/examples/woocommerce-extension/README.md +98 -98
- package/augment-extensions/examples/woocommerce-extension/examples/product-customizer.md +763 -763
- package/augment-extensions/examples/woocommerce-extension/module.json +40 -40
- package/augment-extensions/workflows/beads/README.md +135 -135
- package/augment-extensions/workflows/beads/examples/complete-workflow-example.md +278 -278
- package/augment-extensions/workflows/beads/module.json +55 -55
- package/augment-extensions/workflows/beads/rules/best-practices.md +398 -398
- package/augment-extensions/workflows/beads/rules/file-format.md +327 -327
- package/augment-extensions/workflows/beads/rules/manual-setup.md +315 -315
- package/augment-extensions/workflows/beads/rules/workflow.md +326 -326
- package/augment-extensions/workflows/beads-integration/IMPLEMENTATION-STATUS.md +145 -145
- package/augment-extensions/workflows/beads-integration/README.md +143 -143
- package/augment-extensions/workflows/beads-integration/config/defaults.json +32 -32
- package/augment-extensions/workflows/beads-integration/config/schema.json +140 -140
- package/augment-extensions/workflows/beads-integration/examples/basic-task-generation.md +293 -293
- package/augment-extensions/workflows/beads-integration/module.json +75 -75
- package/augment-extensions/workflows/beads-integration/rules/core-rules.md +219 -219
- package/augment-extensions/workflows/beads-integration/rules/effectiveness-standards.md +256 -256
- package/augment-extensions/workflows/beads-integration/rules/task-generation.md +607 -607
- package/augment-extensions/workflows/database/README.md +195 -195
- package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -295
- package/augment-extensions/workflows/database/examples/migration-example.md +498 -498
- package/augment-extensions/workflows/database/examples/optimization-example.md +496 -496
- package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -444
- package/augment-extensions/workflows/database/module.json +42 -42
- package/augment-extensions/workflows/database/rules/data-migration.md +249 -249
- package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -339
- package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -352
- package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -435
- package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -535
- package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -305
- package/augment-extensions/workflows/database/rules/workflow.md +458 -458
- package/augment-extensions/workflows/wordpress-plugin/README.md +232 -232
- package/augment-extensions/workflows/wordpress-plugin/ai-prompts.md +839 -839
- package/augment-extensions/workflows/wordpress-plugin/bead-decomposition-patterns.md +854 -854
- package/augment-extensions/workflows/wordpress-plugin/examples/complete-plugin-example.md +540 -540
- package/augment-extensions/workflows/wordpress-plugin/examples/custom-post-type-example.md +1083 -1083
- package/augment-extensions/workflows/wordpress-plugin/examples/feature-addition-workflow.md +669 -669
- package/augment-extensions/workflows/wordpress-plugin/examples/plugin-creation-workflow.md +597 -597
- package/augment-extensions/workflows/wordpress-plugin/examples/secure-form-handler-example.md +925 -925
- package/augment-extensions/workflows/wordpress-plugin/examples/security-audit-workflow.md +752 -752
- package/augment-extensions/workflows/wordpress-plugin/examples/wordpress-org-submission-workflow.md +773 -773
- package/augment-extensions/workflows/wordpress-plugin/module.json +49 -49
- package/augment-extensions/workflows/wordpress-plugin/rules/best-practices.md +942 -942
- package/augment-extensions/workflows/wordpress-plugin/rules/development-workflow.md +702 -702
- package/augment-extensions/workflows/wordpress-plugin/rules/submission-workflow.md +728 -728
- package/augment-extensions/workflows/wordpress-plugin/rules/testing-workflow.md +775 -775
- package/augment-extensions/writing-standards/screenplay/README.md +339 -300
- package/augment-extensions/writing-standards/screenplay/_templates/README.md +121 -121
- package/augment-extensions/writing-standards/screenplay/_templates/genre-template.md +153 -153
- package/augment-extensions/writing-standards/screenplay/_templates/style-template.md +243 -243
- package/augment-extensions/writing-standards/screenplay/_templates/theme-template.md +213 -213
- package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -164
- package/augment-extensions/writing-standards/screenplay/examples/beat-sheet-example.yaml +95 -95
- package/augment-extensions/writing-standards/screenplay/examples/character-profile-example.yaml +116 -116
- package/augment-extensions/writing-standards/screenplay/examples/commercial-30sec.fountain +151 -151
- package/augment-extensions/writing-standards/screenplay/examples/independent-monologue.fountain +67 -67
- package/augment-extensions/writing-standards/screenplay/examples/news-segment.fountain +142 -142
- package/augment-extensions/writing-standards/screenplay/examples/plot-outline-example.yaml +184 -184
- package/augment-extensions/writing-standards/screenplay/examples/tv-episode-teaser.fountain +204 -204
- package/augment-extensions/writing-standards/screenplay/genres/README.md +181 -181
- package/augment-extensions/writing-standards/screenplay/genres/examples/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/genres/module.json +70 -70
- package/augment-extensions/writing-standards/screenplay/genres/rules/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/genres/rules/action.md +399 -399
- package/augment-extensions/writing-standards/screenplay/genres/rules/adventure.md +407 -407
- package/augment-extensions/writing-standards/screenplay/genres/rules/animation.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/biographical.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/comedy.md +401 -401
- package/augment-extensions/writing-standards/screenplay/genres/rules/documentary.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/drama.md +409 -409
- package/augment-extensions/writing-standards/screenplay/genres/rules/fantasy.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/historical.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/horror.md +268 -268
- package/augment-extensions/writing-standards/screenplay/genres/rules/musical.md +294 -294
- package/augment-extensions/writing-standards/screenplay/genres/rules/mystery.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/noir.md +294 -294
- package/augment-extensions/writing-standards/screenplay/genres/rules/romance.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/sci-fi.md +289 -289
- package/augment-extensions/writing-standards/screenplay/genres/rules/superhero.md +293 -293
- package/augment-extensions/writing-standards/screenplay/genres/rules/thriller.md +294 -294
- package/augment-extensions/writing-standards/screenplay/genres/rules/western.md +293 -293
- package/augment-extensions/writing-standards/screenplay/module.json +124 -124
- package/augment-extensions/writing-standards/screenplay/rules/aaa-hollywood-films.md +339 -339
- package/augment-extensions/writing-standards/screenplay/rules/ai-integration-testing.md +329 -329
- package/augment-extensions/writing-standards/screenplay/rules/character-development.md +169 -169
- package/augment-extensions/writing-standards/screenplay/rules/commercials.md +437 -437
- package/augment-extensions/writing-standards/screenplay/rules/dialogue-writing.md +263 -263
- package/augment-extensions/writing-standards/screenplay/rules/diversity-inclusion.md +261 -261
- package/augment-extensions/writing-standards/screenplay/rules/examples-guide.md +315 -315
- package/augment-extensions/writing-standards/screenplay/rules/file-organization.md +213 -0
- package/augment-extensions/writing-standards/screenplay/rules/formatting-validation.md +413 -413
- package/augment-extensions/writing-standards/screenplay/rules/fountain-format.md +372 -372
- package/augment-extensions/writing-standards/screenplay/rules/independent-films.md +374 -374
- package/augment-extensions/writing-standards/screenplay/rules/live-tv-productions.md +443 -443
- package/augment-extensions/writing-standards/screenplay/rules/narrative-structures.md +207 -207
- package/augment-extensions/writing-standards/screenplay/rules/news-broadcasts.md +444 -444
- package/augment-extensions/writing-standards/screenplay/rules/pacing-timing.md +331 -331
- package/augment-extensions/writing-standards/screenplay/rules/quality-review-checklist.md +334 -334
- package/augment-extensions/writing-standards/screenplay/rules/quick-reference.md +299 -299
- package/augment-extensions/writing-standards/screenplay/rules/screen-continuity.md +263 -263
- package/augment-extensions/writing-standards/screenplay/rules/streaming-content.md +412 -412
- package/augment-extensions/writing-standards/screenplay/rules/trope-management.md +370 -370
- package/augment-extensions/writing-standards/screenplay/rules/tv-series.md +374 -374
- package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -339
- package/augment-extensions/writing-standards/screenplay/rules/vscode-integration.md +277 -277
- package/augment-extensions/writing-standards/screenplay/rules/web-content.md +393 -393
- package/augment-extensions/writing-standards/screenplay/schemas/beat-sheet.json +332 -332
- package/augment-extensions/writing-standards/screenplay/schemas/character-profile.json +247 -247
- package/augment-extensions/writing-standards/screenplay/schemas/feature-selection.json +200 -200
- package/augment-extensions/writing-standards/screenplay/schemas/plot-outline.json +233 -233
- package/augment-extensions/writing-standards/screenplay/schemas/screenplay-config.json +245 -245
- package/augment-extensions/writing-standards/screenplay/schemas/trope-inventory.json +221 -221
- package/augment-extensions/writing-standards/screenplay/styles/README.md +159 -159
- package/augment-extensions/writing-standards/screenplay/styles/examples/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/styles/examples/style-applications.md +1449 -1449
- package/augment-extensions/writing-standards/screenplay/styles/module.json +64 -64
- package/augment-extensions/writing-standards/screenplay/styles/rules/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/styles/rules/dialogue-centric.md +520 -520
- package/augment-extensions/writing-standards/screenplay/styles/rules/ensemble.md +499 -499
- package/augment-extensions/writing-standards/screenplay/styles/rules/epic.md +497 -497
- package/augment-extensions/writing-standards/screenplay/styles/rules/experimental.md +492 -492
- package/augment-extensions/writing-standards/screenplay/styles/rules/flashback.md +509 -509
- package/augment-extensions/writing-standards/screenplay/styles/rules/linear.md +490 -490
- package/augment-extensions/writing-standards/screenplay/styles/rules/minimalist.md +499 -499
- package/augment-extensions/writing-standards/screenplay/styles/rules/non-linear.md +501 -501
- package/augment-extensions/writing-standards/screenplay/styles/rules/poetic.md +499 -499
- package/augment-extensions/writing-standards/screenplay/styles/rules/realistic.md +498 -498
- package/augment-extensions/writing-standards/screenplay/styles/rules/satirical.md +499 -499
- package/augment-extensions/writing-standards/screenplay/styles/rules/surreal.md +508 -508
- package/augment-extensions/writing-standards/screenplay/styles/rules/voice-over.md +500 -500
- package/augment-extensions/writing-standards/screenplay/themes/README.md +158 -158
- package/augment-extensions/writing-standards/screenplay/themes/examples/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/themes/examples/common-mistakes-and-fixes.md +643 -643
- package/augment-extensions/writing-standards/screenplay/themes/examples/complete-scene-example.md +311 -311
- package/augment-extensions/writing-standards/screenplay/themes/examples/individual-theme-examples.md +562 -562
- package/augment-extensions/writing-standards/screenplay/themes/examples/multi-theme-weaving.md +538 -538
- package/augment-extensions/writing-standards/screenplay/themes/examples/theme-application-guide.md +432 -432
- package/augment-extensions/writing-standards/screenplay/themes/examples/theme-integration-across-acts.md +637 -637
- package/augment-extensions/writing-standards/screenplay/themes/module.json +66 -66
- package/augment-extensions/writing-standards/screenplay/themes/rules/.gitkeep +2 -2
- package/augment-extensions/writing-standards/screenplay/themes/rules/ambition.md +458 -458
- package/augment-extensions/writing-standards/screenplay/themes/rules/betrayal.md +490 -490
- package/augment-extensions/writing-standards/screenplay/themes/rules/environment.md +458 -458
- package/augment-extensions/writing-standards/screenplay/themes/rules/fate.md +459 -459
- package/augment-extensions/writing-standards/screenplay/themes/rules/friendship.md +491 -491
- package/augment-extensions/writing-standards/screenplay/themes/rules/growth.md +491 -491
- package/augment-extensions/writing-standards/screenplay/themes/rules/identity.md +490 -490
- package/augment-extensions/writing-standards/screenplay/themes/rules/isolation.md +464 -464
- package/augment-extensions/writing-standards/screenplay/themes/rules/justice.md +461 -461
- package/augment-extensions/writing-standards/screenplay/themes/rules/love.md +489 -489
- package/augment-extensions/writing-standards/screenplay/themes/rules/power.md +494 -494
- package/augment-extensions/writing-standards/screenplay/themes/rules/redemption.md +483 -483
- package/augment-extensions/writing-standards/screenplay/themes/rules/revenge.md +489 -489
- package/augment-extensions/writing-standards/screenplay/themes/rules/survival.md +496 -496
- package/augment-extensions/writing-standards/screenplay/themes/rules/technology.md +463 -463
- package/augment-extensions/writing-standards/screenplay/utils/__tests__/file-organization.test.ts +169 -0
- package/augment-extensions/writing-standards/screenplay/utils/file-organization.ts +165 -0
- package/cli/MODULES.md +302 -302
- package/cli/dist/cli.js +109 -22
- package/cli/dist/cli.js.map +1 -1
- package/cli/dist/commands/gui.d.ts.map +1 -1
- package/cli/dist/commands/gui.js +54 -6
- package/cli/dist/commands/gui.js.map +1 -1
- package/cli/dist/commands/init.d.ts.map +1 -1
- package/cli/dist/commands/init.js +76 -23
- package/cli/dist/commands/init.js.map +1 -1
- package/cli/dist/commands/self-remove.d.ts.map +1 -1
- package/cli/dist/commands/self-remove.js +48 -74
- package/cli/dist/commands/self-remove.js.map +1 -1
- package/cli/dist/commands/show.d.ts +11 -0
- package/cli/dist/commands/show.d.ts.map +1 -1
- package/cli/dist/commands/show.js +120 -0
- package/cli/dist/commands/show.js.map +1 -1
- package/cli/dist/commands/showCompleted.d.ts +21 -0
- package/cli/dist/commands/showCompleted.d.ts.map +1 -0
- package/cli/dist/commands/showCompleted.js +225 -0
- package/cli/dist/commands/showCompleted.js.map +1 -0
- package/cli/dist/commands/skill.js +88 -88
- package/cli/dist/commands/update.d.ts +2 -0
- package/cli/dist/commands/update.d.ts.map +1 -1
- package/cli/dist/commands/update.js +67 -1
- package/cli/dist/commands/update.js.map +1 -1
- package/cli/dist/utils/beadsCompletedChecker.d.ts +72 -0
- package/cli/dist/utils/beadsCompletedChecker.d.ts.map +1 -0
- package/cli/dist/utils/beadsCompletedChecker.js +198 -0
- package/cli/dist/utils/beadsCompletedChecker.js.map +1 -0
- package/cli/dist/utils/catalog-sync.js +13 -13
- package/cli/dist/utils/extractCommandHelp.d.ts +51 -0
- package/cli/dist/utils/extractCommandHelp.d.ts.map +1 -0
- package/cli/dist/utils/extractCommandHelp.js +250 -0
- package/cli/dist/utils/extractCommandHelp.js.map +1 -0
- package/cli/dist/utils/install-rules.js +55 -55
- package/cli/dist/utils/mcp-integration.js +44 -44
- package/cli/dist/utils/rule-install-hooks.js +8 -8
- package/modules.md +667 -630
- package/package.json +85 -85
|
@@ -1,403 +1,403 @@
|
|
|
1
|
-
# Testing Standards
|
|
2
|
-
|
|
3
|
-
## Overview
|
|
4
|
-
|
|
5
|
-
Comprehensive testing is essential for maintaining code quality and preventing regressions. This document defines standards for unit testing, integration testing, and test organization using PHPUnit.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
## Unit Testing
|
|
10
|
-
|
|
11
|
-
### PHPUnit Setup
|
|
12
|
-
|
|
13
|
-
**Rules:**
|
|
14
|
-
- Use PHPUnit for all PHP testing
|
|
15
|
-
- Organize tests to mirror source code structure
|
|
16
|
-
- Aim for at least 80% code coverage
|
|
17
|
-
|
|
18
|
-
**Directory Structure:**
|
|
19
|
-
```
|
|
20
|
-
project/
|
|
21
|
-
├── src/
|
|
22
|
-
│ └── Services/
|
|
23
|
-
│ └── UserService.php
|
|
24
|
-
└── tests/
|
|
25
|
-
└── Unit/
|
|
26
|
-
└── Services/
|
|
27
|
-
└── UserServiceTest.php
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
### Test Class Structure
|
|
31
|
-
|
|
32
|
-
**Rules:**
|
|
33
|
-
- Test classes MUST extend `PHPUnit\Framework\TestCase`
|
|
34
|
-
- Test class names MUST end with `Test`
|
|
35
|
-
- Test method names MUST start with `test` or use `@test` annotation
|
|
36
|
-
- Use descriptive test method names
|
|
37
|
-
|
|
38
|
-
**Examples:**
|
|
39
|
-
```php
|
|
40
|
-
// ✅ Good
|
|
41
|
-
use PHPUnit\Framework\TestCase;
|
|
42
|
-
|
|
43
|
-
class UserServiceTest extends TestCase
|
|
44
|
-
{
|
|
45
|
-
public function testCreateUserWithValidData(): void
|
|
46
|
-
{
|
|
47
|
-
// Test implementation
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
public function testCreateUserThrowsExceptionForInvalidEmail(): void
|
|
51
|
-
{
|
|
52
|
-
// Test implementation
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/** @test */
|
|
56
|
-
public function it_updates_user_successfully(): void
|
|
57
|
-
{
|
|
58
|
-
// Test implementation
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
// ❌ Bad
|
|
63
|
-
class UserService extends TestCase // Missing 'Test' suffix
|
|
64
|
-
{
|
|
65
|
-
public function create_user(): void // Doesn't start with 'test'
|
|
66
|
-
{
|
|
67
|
-
// Test implementation
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
### AAA Pattern (Arrange-Act-Assert)
|
|
73
|
-
|
|
74
|
-
**Rules:**
|
|
75
|
-
- Structure tests using Arrange-Act-Assert pattern
|
|
76
|
-
- Keep tests focused on single behavior
|
|
77
|
-
- Use blank lines to separate AAA sections
|
|
78
|
-
|
|
79
|
-
**Examples:**
|
|
80
|
-
```php
|
|
81
|
-
// ✅ Good
|
|
82
|
-
public function testCalculateTotalPrice(): void
|
|
83
|
-
{
|
|
84
|
-
// Arrange
|
|
85
|
-
$items = [
|
|
86
|
-
['price' => 10.00, 'quantity' => 2],
|
|
87
|
-
['price' => 5.00, 'quantity' => 3],
|
|
88
|
-
];
|
|
89
|
-
$calculator = new PriceCalculator();
|
|
90
|
-
|
|
91
|
-
// Act
|
|
92
|
-
$total = $calculator->calculateTotal($items);
|
|
93
|
-
|
|
94
|
-
// Assert
|
|
95
|
-
$this->assertEquals(35.00, $total);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
// ❌ Bad - Mixed concerns
|
|
99
|
-
public function testMultipleThings(): void
|
|
100
|
-
{
|
|
101
|
-
$calc = new PriceCalculator();
|
|
102
|
-
$this->assertEquals(35.00, $calc->calculateTotal($items1));
|
|
103
|
-
$this->assertEquals(50.00, $calc->calculateTotal($items2));
|
|
104
|
-
$this->assertTrue($calc->isValid());
|
|
105
|
-
}
|
|
106
|
-
```
|
|
107
|
-
|
|
108
|
-
### Assertions
|
|
109
|
-
|
|
110
|
-
**Rules:**
|
|
111
|
-
- Use specific assertions over generic ones
|
|
112
|
-
- Include meaningful assertion messages
|
|
113
|
-
- Use type-specific assertions
|
|
114
|
-
|
|
115
|
-
**Common Assertions:**
|
|
116
|
-
```php
|
|
117
|
-
// ✅ Good - Specific assertions
|
|
118
|
-
$this->assertTrue($result);
|
|
119
|
-
$this->assertFalse($result);
|
|
120
|
-
$this->assertEquals($expected, $actual);
|
|
121
|
-
$this->assertSame($expected, $actual); // Strict comparison
|
|
122
|
-
$this->assertNull($value);
|
|
123
|
-
$this->assertNotNull($value);
|
|
124
|
-
$this->assertEmpty($array);
|
|
125
|
-
$this->assertCount(3, $array);
|
|
126
|
-
$this->assertInstanceOf(User::class, $user);
|
|
127
|
-
$this->assertStringContainsString('error', $message);
|
|
128
|
-
$this->assertArrayHasKey('email', $data);
|
|
129
|
-
|
|
130
|
-
// ✅ Good - With messages
|
|
131
|
-
$this->assertEquals(100, $total, 'Total price should be 100');
|
|
132
|
-
|
|
133
|
-
// ❌ Bad - Generic assertion
|
|
134
|
-
$this->assertTrue($user instanceof User); // Use assertInstanceOf instead
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
### Test Doubles (Mocks and Stubs)
|
|
138
|
-
|
|
139
|
-
**Rules:**
|
|
140
|
-
- Use mocks to verify behavior
|
|
141
|
-
- Use stubs to provide test data
|
|
142
|
-
- Mock external dependencies
|
|
143
|
-
- Don't mock the system under test
|
|
144
|
-
|
|
145
|
-
**Examples:**
|
|
146
|
-
```php
|
|
147
|
-
// ✅ Good - Mock external dependency
|
|
148
|
-
public function testSendEmailNotification(): void
|
|
149
|
-
{
|
|
150
|
-
// Arrange
|
|
151
|
-
$mailer = $this->createMock(MailerInterface::class);
|
|
152
|
-
$mailer->expects($this->once())
|
|
153
|
-
->method('send')
|
|
154
|
-
->with($this->equalTo('user@example.com'));
|
|
155
|
-
|
|
156
|
-
$notifier = new EmailNotifier($mailer);
|
|
157
|
-
|
|
158
|
-
// Act
|
|
159
|
-
$notifier->notify('user@example.com', 'Test message');
|
|
160
|
-
|
|
161
|
-
// Assert - Verification happens via expects()
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
// ✅ Good - Stub for test data
|
|
165
|
-
public function testProcessUserData(): void
|
|
166
|
-
{
|
|
167
|
-
// Arrange
|
|
168
|
-
$repository = $this->createStub(UserRepositoryInterface::class);
|
|
169
|
-
$repository->method('findById')
|
|
170
|
-
->willReturn(new User(1, 'John Doe'));
|
|
171
|
-
|
|
172
|
-
$service = new UserService($repository);
|
|
173
|
-
|
|
174
|
-
// Act
|
|
175
|
-
$result = $service->processUser(1);
|
|
176
|
-
|
|
177
|
-
// Assert
|
|
178
|
-
$this->assertEquals('John Doe', $result->name);
|
|
179
|
-
}
|
|
180
|
-
```
|
|
181
|
-
|
|
182
|
-
### Data Providers
|
|
183
|
-
|
|
184
|
-
**Rules:**
|
|
185
|
-
- Use data providers for testing multiple scenarios
|
|
186
|
-
- Keep data providers focused and readable
|
|
187
|
-
- Name data sets descriptively
|
|
188
|
-
|
|
189
|
-
**Examples:**
|
|
190
|
-
```php
|
|
191
|
-
// ✅ Good
|
|
192
|
-
/**
|
|
193
|
-
* @dataProvider emailValidationProvider
|
|
194
|
-
*/
|
|
195
|
-
public function testEmailValidation(string $email, bool $expected): void
|
|
196
|
-
{
|
|
197
|
-
$validator = new EmailValidator();
|
|
198
|
-
$result = $validator->isValid($email);
|
|
199
|
-
$this->assertEquals($expected, $result);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
public function emailValidationProvider(): array
|
|
203
|
-
{
|
|
204
|
-
return [
|
|
205
|
-
'valid email' => ['user@example.com', true],
|
|
206
|
-
'invalid - no @' => ['userexample.com', false],
|
|
207
|
-
'invalid - no domain' => ['user@', false],
|
|
208
|
-
'invalid - empty' => ['', false],
|
|
209
|
-
];
|
|
210
|
-
}
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
---
|
|
214
|
-
|
|
215
|
-
## Integration Testing
|
|
216
|
-
|
|
217
|
-
### Database Testing
|
|
218
|
-
|
|
219
|
-
**Rules:**
|
|
220
|
-
- Use transactions for test isolation
|
|
221
|
-
- Reset database state between tests
|
|
222
|
-
- Use test fixtures for consistent data
|
|
223
|
-
|
|
224
|
-
**Examples:**
|
|
225
|
-
```php
|
|
226
|
-
// ✅ Good - Transaction-based test
|
|
227
|
-
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
228
|
-
|
|
229
|
-
class UserRepositoryTest extends TestCase
|
|
230
|
-
{
|
|
231
|
-
use RefreshDatabase;
|
|
232
|
-
|
|
233
|
-
public function testFindUserById(): void
|
|
234
|
-
{
|
|
235
|
-
// Arrange
|
|
236
|
-
$user = User::factory()->create([
|
|
237
|
-
'email' => 'test@example.com'
|
|
238
|
-
]);
|
|
239
|
-
|
|
240
|
-
$repository = new UserRepository();
|
|
241
|
-
|
|
242
|
-
// Act
|
|
243
|
-
$found = $repository->findById($user->id);
|
|
244
|
-
|
|
245
|
-
// Assert
|
|
246
|
-
$this->assertNotNull($found);
|
|
247
|
-
$this->assertEquals('test@example.com', $found->email);
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
```
|
|
251
|
-
|
|
252
|
-
### API Testing
|
|
253
|
-
|
|
254
|
-
**Rules:**
|
|
255
|
-
- Test request/response contracts
|
|
256
|
-
- Verify HTTP status codes
|
|
257
|
-
- Validate response structure
|
|
258
|
-
- Test authentication and authorization
|
|
259
|
-
|
|
260
|
-
**Examples:**
|
|
261
|
-
```php
|
|
262
|
-
// ✅ Good - API endpoint test
|
|
263
|
-
public function testGetUserEndpoint(): void
|
|
264
|
-
{
|
|
265
|
-
// Arrange
|
|
266
|
-
$user = User::factory()->create();
|
|
267
|
-
|
|
268
|
-
// Act
|
|
269
|
-
$response = $this->getJson("/api/users/{$user->id}");
|
|
270
|
-
|
|
271
|
-
// Assert
|
|
272
|
-
$response->assertStatus(200)
|
|
273
|
-
->assertJson([
|
|
274
|
-
'id' => $user->id,
|
|
275
|
-
'email' => $user->email,
|
|
276
|
-
])
|
|
277
|
-
->assertJsonStructure([
|
|
278
|
-
'id',
|
|
279
|
-
'email',
|
|
280
|
-
'created_at',
|
|
281
|
-
'updated_at',
|
|
282
|
-
]);
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
public function testUnauthorizedAccess(): void
|
|
286
|
-
{
|
|
287
|
-
$response = $this->getJson('/api/admin/users');
|
|
288
|
-
$response->assertStatus(401);
|
|
289
|
-
}
|
|
290
|
-
```
|
|
291
|
-
|
|
292
|
-
---
|
|
293
|
-
|
|
294
|
-
## Test Organization
|
|
295
|
-
|
|
296
|
-
### Test Naming
|
|
297
|
-
|
|
298
|
-
**Rules:**
|
|
299
|
-
- Use descriptive test names that explain what is being tested
|
|
300
|
-
- Include the expected outcome in the name
|
|
301
|
-
- Use snake_case or camelCase consistently
|
|
302
|
-
|
|
303
|
-
**Examples:**
|
|
304
|
-
```php
|
|
305
|
-
// ✅ Good - Descriptive names
|
|
306
|
-
public function testCreateUserWithValidDataReturnsUser(): void
|
|
307
|
-
public function testCreateUserWithInvalidEmailThrowsException(): void
|
|
308
|
-
public function testDeleteUserRemovesFromDatabase(): void
|
|
309
|
-
|
|
310
|
-
// ❌ Bad - Vague names
|
|
311
|
-
public function testUser(): void
|
|
312
|
-
public function testCreate(): void
|
|
313
|
-
```
|
|
314
|
-
|
|
315
|
-
### Test Coverage
|
|
316
|
-
|
|
317
|
-
**Rules:**
|
|
318
|
-
- Aim for at least 80% code coverage
|
|
319
|
-
- Focus on critical business logic
|
|
320
|
-
- Don't chase 100% coverage at the expense of test quality
|
|
321
|
-
|
|
322
|
-
**Generate Coverage Report:**
|
|
323
|
-
```bash
|
|
324
|
-
# ✅ Good
|
|
325
|
-
./vendor/bin/phpunit --coverage-html coverage/
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
### Setup and Teardown
|
|
329
|
-
|
|
330
|
-
**Rules:**
|
|
331
|
-
- Use `setUp()` for common test initialization
|
|
332
|
-
- Use `tearDown()` for cleanup
|
|
333
|
-
- Keep setup minimal and focused
|
|
334
|
-
|
|
335
|
-
**Examples:**
|
|
336
|
-
```php
|
|
337
|
-
// ✅ Good
|
|
338
|
-
class UserServiceTest extends TestCase
|
|
339
|
-
{
|
|
340
|
-
private UserService $service;
|
|
341
|
-
private UserRepositoryInterface $repository;
|
|
342
|
-
|
|
343
|
-
protected function setUp(): void
|
|
344
|
-
{
|
|
345
|
-
parent::setUp();
|
|
346
|
-
|
|
347
|
-
$this->repository = $this->createMock(UserRepositoryInterface::class);
|
|
348
|
-
$this->service = new UserService($this->repository);
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
protected function tearDown(): void
|
|
352
|
-
{
|
|
353
|
-
parent::tearDown();
|
|
354
|
-
// Cleanup if needed
|
|
355
|
-
}
|
|
356
|
-
|
|
357
|
-
public function testSomething(): void
|
|
358
|
-
{
|
|
359
|
-
// Test uses $this->service
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
```
|
|
363
|
-
|
|
364
|
-
---
|
|
365
|
-
|
|
366
|
-
## Best Practices
|
|
367
|
-
|
|
368
|
-
### Test Independence
|
|
369
|
-
|
|
370
|
-
**Rules:**
|
|
371
|
-
- Tests MUST be independent of each other
|
|
372
|
-
- Tests MUST NOT rely on execution order
|
|
373
|
-
- Each test MUST set up its own state
|
|
374
|
-
|
|
375
|
-
### Fast Tests
|
|
376
|
-
|
|
377
|
-
**Rules:**
|
|
378
|
-
- Keep unit tests fast (< 100ms each)
|
|
379
|
-
- Mock external services
|
|
380
|
-
- Use in-memory databases for integration tests when possible
|
|
381
|
-
|
|
382
|
-
### Readable Tests
|
|
383
|
-
|
|
384
|
-
**Rules:**
|
|
385
|
-
- Tests should be easy to understand
|
|
386
|
-
- Use helper methods to reduce duplication
|
|
387
|
-
- Avoid complex logic in tests
|
|
388
|
-
|
|
389
|
-
**Examples:**
|
|
390
|
-
```php
|
|
391
|
-
// ✅ Good - Helper method
|
|
392
|
-
private function createTestUser(array $attributes = []): User
|
|
393
|
-
{
|
|
394
|
-
return User::factory()->create($attributes);
|
|
395
|
-
}
|
|
396
|
-
|
|
397
|
-
public function testUserCreation(): void
|
|
398
|
-
{
|
|
399
|
-
$user = $this->createTestUser(['email' => 'test@example.com']);
|
|
400
|
-
$this->assertEquals('test@example.com', $user->email);
|
|
401
|
-
}
|
|
402
|
-
```
|
|
403
|
-
|
|
1
|
+
# Testing Standards
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
Comprehensive testing is essential for maintaining code quality and preventing regressions. This document defines standards for unit testing, integration testing, and test organization using PHPUnit.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Unit Testing
|
|
10
|
+
|
|
11
|
+
### PHPUnit Setup
|
|
12
|
+
|
|
13
|
+
**Rules:**
|
|
14
|
+
- Use PHPUnit for all PHP testing
|
|
15
|
+
- Organize tests to mirror source code structure
|
|
16
|
+
- Aim for at least 80% code coverage
|
|
17
|
+
|
|
18
|
+
**Directory Structure:**
|
|
19
|
+
```
|
|
20
|
+
project/
|
|
21
|
+
├── src/
|
|
22
|
+
│ └── Services/
|
|
23
|
+
│ └── UserService.php
|
|
24
|
+
└── tests/
|
|
25
|
+
└── Unit/
|
|
26
|
+
└── Services/
|
|
27
|
+
└── UserServiceTest.php
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Test Class Structure
|
|
31
|
+
|
|
32
|
+
**Rules:**
|
|
33
|
+
- Test classes MUST extend `PHPUnit\Framework\TestCase`
|
|
34
|
+
- Test class names MUST end with `Test`
|
|
35
|
+
- Test method names MUST start with `test` or use `@test` annotation
|
|
36
|
+
- Use descriptive test method names
|
|
37
|
+
|
|
38
|
+
**Examples:**
|
|
39
|
+
```php
|
|
40
|
+
// ✅ Good
|
|
41
|
+
use PHPUnit\Framework\TestCase;
|
|
42
|
+
|
|
43
|
+
class UserServiceTest extends TestCase
|
|
44
|
+
{
|
|
45
|
+
public function testCreateUserWithValidData(): void
|
|
46
|
+
{
|
|
47
|
+
// Test implementation
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
public function testCreateUserThrowsExceptionForInvalidEmail(): void
|
|
51
|
+
{
|
|
52
|
+
// Test implementation
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** @test */
|
|
56
|
+
public function it_updates_user_successfully(): void
|
|
57
|
+
{
|
|
58
|
+
// Test implementation
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// ❌ Bad
|
|
63
|
+
class UserService extends TestCase // Missing 'Test' suffix
|
|
64
|
+
{
|
|
65
|
+
public function create_user(): void // Doesn't start with 'test'
|
|
66
|
+
{
|
|
67
|
+
// Test implementation
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### AAA Pattern (Arrange-Act-Assert)
|
|
73
|
+
|
|
74
|
+
**Rules:**
|
|
75
|
+
- Structure tests using Arrange-Act-Assert pattern
|
|
76
|
+
- Keep tests focused on single behavior
|
|
77
|
+
- Use blank lines to separate AAA sections
|
|
78
|
+
|
|
79
|
+
**Examples:**
|
|
80
|
+
```php
|
|
81
|
+
// ✅ Good
|
|
82
|
+
public function testCalculateTotalPrice(): void
|
|
83
|
+
{
|
|
84
|
+
// Arrange
|
|
85
|
+
$items = [
|
|
86
|
+
['price' => 10.00, 'quantity' => 2],
|
|
87
|
+
['price' => 5.00, 'quantity' => 3],
|
|
88
|
+
];
|
|
89
|
+
$calculator = new PriceCalculator();
|
|
90
|
+
|
|
91
|
+
// Act
|
|
92
|
+
$total = $calculator->calculateTotal($items);
|
|
93
|
+
|
|
94
|
+
// Assert
|
|
95
|
+
$this->assertEquals(35.00, $total);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// ❌ Bad - Mixed concerns
|
|
99
|
+
public function testMultipleThings(): void
|
|
100
|
+
{
|
|
101
|
+
$calc = new PriceCalculator();
|
|
102
|
+
$this->assertEquals(35.00, $calc->calculateTotal($items1));
|
|
103
|
+
$this->assertEquals(50.00, $calc->calculateTotal($items2));
|
|
104
|
+
$this->assertTrue($calc->isValid());
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
### Assertions
|
|
109
|
+
|
|
110
|
+
**Rules:**
|
|
111
|
+
- Use specific assertions over generic ones
|
|
112
|
+
- Include meaningful assertion messages
|
|
113
|
+
- Use type-specific assertions
|
|
114
|
+
|
|
115
|
+
**Common Assertions:**
|
|
116
|
+
```php
|
|
117
|
+
// ✅ Good - Specific assertions
|
|
118
|
+
$this->assertTrue($result);
|
|
119
|
+
$this->assertFalse($result);
|
|
120
|
+
$this->assertEquals($expected, $actual);
|
|
121
|
+
$this->assertSame($expected, $actual); // Strict comparison
|
|
122
|
+
$this->assertNull($value);
|
|
123
|
+
$this->assertNotNull($value);
|
|
124
|
+
$this->assertEmpty($array);
|
|
125
|
+
$this->assertCount(3, $array);
|
|
126
|
+
$this->assertInstanceOf(User::class, $user);
|
|
127
|
+
$this->assertStringContainsString('error', $message);
|
|
128
|
+
$this->assertArrayHasKey('email', $data);
|
|
129
|
+
|
|
130
|
+
// ✅ Good - With messages
|
|
131
|
+
$this->assertEquals(100, $total, 'Total price should be 100');
|
|
132
|
+
|
|
133
|
+
// ❌ Bad - Generic assertion
|
|
134
|
+
$this->assertTrue($user instanceof User); // Use assertInstanceOf instead
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
### Test Doubles (Mocks and Stubs)
|
|
138
|
+
|
|
139
|
+
**Rules:**
|
|
140
|
+
- Use mocks to verify behavior
|
|
141
|
+
- Use stubs to provide test data
|
|
142
|
+
- Mock external dependencies
|
|
143
|
+
- Don't mock the system under test
|
|
144
|
+
|
|
145
|
+
**Examples:**
|
|
146
|
+
```php
|
|
147
|
+
// ✅ Good - Mock external dependency
|
|
148
|
+
public function testSendEmailNotification(): void
|
|
149
|
+
{
|
|
150
|
+
// Arrange
|
|
151
|
+
$mailer = $this->createMock(MailerInterface::class);
|
|
152
|
+
$mailer->expects($this->once())
|
|
153
|
+
->method('send')
|
|
154
|
+
->with($this->equalTo('user@example.com'));
|
|
155
|
+
|
|
156
|
+
$notifier = new EmailNotifier($mailer);
|
|
157
|
+
|
|
158
|
+
// Act
|
|
159
|
+
$notifier->notify('user@example.com', 'Test message');
|
|
160
|
+
|
|
161
|
+
// Assert - Verification happens via expects()
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// ✅ Good - Stub for test data
|
|
165
|
+
public function testProcessUserData(): void
|
|
166
|
+
{
|
|
167
|
+
// Arrange
|
|
168
|
+
$repository = $this->createStub(UserRepositoryInterface::class);
|
|
169
|
+
$repository->method('findById')
|
|
170
|
+
->willReturn(new User(1, 'John Doe'));
|
|
171
|
+
|
|
172
|
+
$service = new UserService($repository);
|
|
173
|
+
|
|
174
|
+
// Act
|
|
175
|
+
$result = $service->processUser(1);
|
|
176
|
+
|
|
177
|
+
// Assert
|
|
178
|
+
$this->assertEquals('John Doe', $result->name);
|
|
179
|
+
}
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
### Data Providers
|
|
183
|
+
|
|
184
|
+
**Rules:**
|
|
185
|
+
- Use data providers for testing multiple scenarios
|
|
186
|
+
- Keep data providers focused and readable
|
|
187
|
+
- Name data sets descriptively
|
|
188
|
+
|
|
189
|
+
**Examples:**
|
|
190
|
+
```php
|
|
191
|
+
// ✅ Good
|
|
192
|
+
/**
|
|
193
|
+
* @dataProvider emailValidationProvider
|
|
194
|
+
*/
|
|
195
|
+
public function testEmailValidation(string $email, bool $expected): void
|
|
196
|
+
{
|
|
197
|
+
$validator = new EmailValidator();
|
|
198
|
+
$result = $validator->isValid($email);
|
|
199
|
+
$this->assertEquals($expected, $result);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
public function emailValidationProvider(): array
|
|
203
|
+
{
|
|
204
|
+
return [
|
|
205
|
+
'valid email' => ['user@example.com', true],
|
|
206
|
+
'invalid - no @' => ['userexample.com', false],
|
|
207
|
+
'invalid - no domain' => ['user@', false],
|
|
208
|
+
'invalid - empty' => ['', false],
|
|
209
|
+
];
|
|
210
|
+
}
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## Integration Testing
|
|
216
|
+
|
|
217
|
+
### Database Testing
|
|
218
|
+
|
|
219
|
+
**Rules:**
|
|
220
|
+
- Use transactions for test isolation
|
|
221
|
+
- Reset database state between tests
|
|
222
|
+
- Use test fixtures for consistent data
|
|
223
|
+
|
|
224
|
+
**Examples:**
|
|
225
|
+
```php
|
|
226
|
+
// ✅ Good - Transaction-based test
|
|
227
|
+
use Illuminate\Foundation\Testing\RefreshDatabase;
|
|
228
|
+
|
|
229
|
+
class UserRepositoryTest extends TestCase
|
|
230
|
+
{
|
|
231
|
+
use RefreshDatabase;
|
|
232
|
+
|
|
233
|
+
public function testFindUserById(): void
|
|
234
|
+
{
|
|
235
|
+
// Arrange
|
|
236
|
+
$user = User::factory()->create([
|
|
237
|
+
'email' => 'test@example.com'
|
|
238
|
+
]);
|
|
239
|
+
|
|
240
|
+
$repository = new UserRepository();
|
|
241
|
+
|
|
242
|
+
// Act
|
|
243
|
+
$found = $repository->findById($user->id);
|
|
244
|
+
|
|
245
|
+
// Assert
|
|
246
|
+
$this->assertNotNull($found);
|
|
247
|
+
$this->assertEquals('test@example.com', $found->email);
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
### API Testing
|
|
253
|
+
|
|
254
|
+
**Rules:**
|
|
255
|
+
- Test request/response contracts
|
|
256
|
+
- Verify HTTP status codes
|
|
257
|
+
- Validate response structure
|
|
258
|
+
- Test authentication and authorization
|
|
259
|
+
|
|
260
|
+
**Examples:**
|
|
261
|
+
```php
|
|
262
|
+
// ✅ Good - API endpoint test
|
|
263
|
+
public function testGetUserEndpoint(): void
|
|
264
|
+
{
|
|
265
|
+
// Arrange
|
|
266
|
+
$user = User::factory()->create();
|
|
267
|
+
|
|
268
|
+
// Act
|
|
269
|
+
$response = $this->getJson("/api/users/{$user->id}");
|
|
270
|
+
|
|
271
|
+
// Assert
|
|
272
|
+
$response->assertStatus(200)
|
|
273
|
+
->assertJson([
|
|
274
|
+
'id' => $user->id,
|
|
275
|
+
'email' => $user->email,
|
|
276
|
+
])
|
|
277
|
+
->assertJsonStructure([
|
|
278
|
+
'id',
|
|
279
|
+
'email',
|
|
280
|
+
'created_at',
|
|
281
|
+
'updated_at',
|
|
282
|
+
]);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
public function testUnauthorizedAccess(): void
|
|
286
|
+
{
|
|
287
|
+
$response = $this->getJson('/api/admin/users');
|
|
288
|
+
$response->assertStatus(401);
|
|
289
|
+
}
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
---
|
|
293
|
+
|
|
294
|
+
## Test Organization
|
|
295
|
+
|
|
296
|
+
### Test Naming
|
|
297
|
+
|
|
298
|
+
**Rules:**
|
|
299
|
+
- Use descriptive test names that explain what is being tested
|
|
300
|
+
- Include the expected outcome in the name
|
|
301
|
+
- Use snake_case or camelCase consistently
|
|
302
|
+
|
|
303
|
+
**Examples:**
|
|
304
|
+
```php
|
|
305
|
+
// ✅ Good - Descriptive names
|
|
306
|
+
public function testCreateUserWithValidDataReturnsUser(): void
|
|
307
|
+
public function testCreateUserWithInvalidEmailThrowsException(): void
|
|
308
|
+
public function testDeleteUserRemovesFromDatabase(): void
|
|
309
|
+
|
|
310
|
+
// ❌ Bad - Vague names
|
|
311
|
+
public function testUser(): void
|
|
312
|
+
public function testCreate(): void
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
### Test Coverage
|
|
316
|
+
|
|
317
|
+
**Rules:**
|
|
318
|
+
- Aim for at least 80% code coverage
|
|
319
|
+
- Focus on critical business logic
|
|
320
|
+
- Don't chase 100% coverage at the expense of test quality
|
|
321
|
+
|
|
322
|
+
**Generate Coverage Report:**
|
|
323
|
+
```bash
|
|
324
|
+
# ✅ Good
|
|
325
|
+
./vendor/bin/phpunit --coverage-html coverage/
|
|
326
|
+
```
|
|
327
|
+
|
|
328
|
+
### Setup and Teardown
|
|
329
|
+
|
|
330
|
+
**Rules:**
|
|
331
|
+
- Use `setUp()` for common test initialization
|
|
332
|
+
- Use `tearDown()` for cleanup
|
|
333
|
+
- Keep setup minimal and focused
|
|
334
|
+
|
|
335
|
+
**Examples:**
|
|
336
|
+
```php
|
|
337
|
+
// ✅ Good
|
|
338
|
+
class UserServiceTest extends TestCase
|
|
339
|
+
{
|
|
340
|
+
private UserService $service;
|
|
341
|
+
private UserRepositoryInterface $repository;
|
|
342
|
+
|
|
343
|
+
protected function setUp(): void
|
|
344
|
+
{
|
|
345
|
+
parent::setUp();
|
|
346
|
+
|
|
347
|
+
$this->repository = $this->createMock(UserRepositoryInterface::class);
|
|
348
|
+
$this->service = new UserService($this->repository);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
protected function tearDown(): void
|
|
352
|
+
{
|
|
353
|
+
parent::tearDown();
|
|
354
|
+
// Cleanup if needed
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
public function testSomething(): void
|
|
358
|
+
{
|
|
359
|
+
// Test uses $this->service
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
---
|
|
365
|
+
|
|
366
|
+
## Best Practices
|
|
367
|
+
|
|
368
|
+
### Test Independence
|
|
369
|
+
|
|
370
|
+
**Rules:**
|
|
371
|
+
- Tests MUST be independent of each other
|
|
372
|
+
- Tests MUST NOT rely on execution order
|
|
373
|
+
- Each test MUST set up its own state
|
|
374
|
+
|
|
375
|
+
### Fast Tests
|
|
376
|
+
|
|
377
|
+
**Rules:**
|
|
378
|
+
- Keep unit tests fast (< 100ms each)
|
|
379
|
+
- Mock external services
|
|
380
|
+
- Use in-memory databases for integration tests when possible
|
|
381
|
+
|
|
382
|
+
### Readable Tests
|
|
383
|
+
|
|
384
|
+
**Rules:**
|
|
385
|
+
- Tests should be easy to understand
|
|
386
|
+
- Use helper methods to reduce duplication
|
|
387
|
+
- Avoid complex logic in tests
|
|
388
|
+
|
|
389
|
+
**Examples:**
|
|
390
|
+
```php
|
|
391
|
+
// ✅ Good - Helper method
|
|
392
|
+
private function createTestUser(array $attributes = []): User
|
|
393
|
+
{
|
|
394
|
+
return User::factory()->create($attributes);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
public function testUserCreation(): void
|
|
398
|
+
{
|
|
399
|
+
$user = $this->createTestUser(['email' => 'test@example.com']);
|
|
400
|
+
$this->assertEquals('test@example.com', $user->email);
|
|
401
|
+
}
|
|
402
|
+
```
|
|
403
|
+
|