{"id":61,"date":"2021-10-01T09:26:55","date_gmt":"2021-10-01T09:26:55","guid":{"rendered":"https:\/\/quera.ir\/?p=61"},"modified":"2022-01-26T14:36:20","modified_gmt":"2022-01-26T14:36:20","slug":"quera-jump-courses","status":"publish","type":"post","link":"https:\/\/quera.org\/blog\/quera-jump-courses\/","title":{"rendered":"\u062a\u0645\u0631\u06cc\u0646\u200c\u0647\u0627\u06cc \u062a\u0633\u062a\u200c\u0646\u0648\u06cc\u0633\u06cc \u062f\u0648\u0631\u0647\u200c\u0647\u0627\u06cc \u00ab\u062c\u0627\u0645\u067e\u00bb \u06a9\u0648\u0626\u0631\u0627 \u06a9\u0627\u0644\u062c \u0631\u0627 \u0686\u06af\u0648\u0646\u0647 \u062f\u0627\u0648\u0631\u06cc \u0645\u06cc\u200c\u06a9\u0646\u06cc\u0645\u061f"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u062f\u0648\u0631\u0647\u200c\u0647\u0627\u06cc \u00ab\u062c\u0627\u0645\u067e \u0628\u06a9\u200c\u0627\u0646\u062f \u0628\u0627 \u062c\u0646\u06af\u0648\u00bb \u0648 \u00ab\u062c\u0627\u0645\u067e \u0628\u06a9\u200c\u0627\u0646\u062f \u0628\u0627 \u0644\u0627\u0631\u0627\u0648\u0644\u00bb \u0627\u0632 \u0645\u062d\u0628\u0648\u0628\u200c\u062a\u0631\u06cc\u0646 \u062f\u0648\u0631\u0647\u200c\u0647\u0627\u06cc \u0622\u0645\u0648\u0632\u0634 \u062c\u0646\u06af\u0648 \u0648 \u0644\u0627\u0631\u0627\u0648\u0644 \u0647\u0633\u062a\u0646\u062f. \u0627\u06cc\u0646 \u062f\u0648\u0631\u0647\u200c\u0647\u0627\u06cc \u0622\u0645\u0648\u0632\u0634\u06cc \u0634\u0627\u0645\u0644 \u062a\u0645\u0631\u06cc\u0646\u200c\u0647\u0627\u06cc \u0632\u06cc\u0627\u062f\u06cc \u0647\u0633\u062a\u0646\u062f \u06a9\u0647 \u062f\u0627\u0648\u0631\u06cc \u0648 \u0627\u0645\u062a\u06cc\u0627\u0632\u062f\u0647\u06cc \u0622\u0646\u200c\u0647\u0627 \u0628\u0647\u200c\u0635\u0648\u0631\u062a \u062e\u0648\u062f\u06a9\u0627\u0631 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u200c\u0634\u0648\u062f. \u0627\u06cc\u0646 \u0648\u06cc\u0698\u06af\u06cc\u060c \u062f\u0648\u0631\u0647\u200c\u0647\u0627\u06cc \u06a9\u0648\u0626\u0631\u0627 \u06a9\u0627\u0644\u062c \u0631\u0627 \u0627\u0632 \u0633\u0627\u06cc\u0631 \u062f\u0648\u0631\u0647\u200c\u0647\u0627 \u0645\u062a\u0645\u0627\u06cc\u0632 \u0645\u06cc\u200c\u06a9\u0646\u062f\u061b \u0627\u0645\u0627 \u0637\u0631\u0627\u062d\u06cc \u0686\u0646\u06cc\u0646 \u062f\u0648\u0631\u0647\u200c\u0647\u0627\u06cc\u06cc \u0628\u0647 \u0645\u0631\u0627\u062a\u0628 \u0633\u062e\u062a\u200c\u062a\u0631 \u0627\u0632 \u0633\u0627\u06cc\u0631 \u062f\u0648\u0631\u0647\u200c\u0647\u0627\u06cc \u0622\u0645\u0648\u0632\u0634\u06cc \u0627\u0633\u062a. \u0637\u0631\u0627\u062d\u0627\u0646 \u0627\u06cc\u0646 \u062f\u0648\u0631\u0647\u200c\u0647\u0627 \u0639\u0644\u0627\u0648\u0647 \u0628\u0631 \u0646\u0648\u0634\u062a\u0646 \u062f\u0631\u0633\u200c\u0646\u0627\u0645\u0647\u200c\u0647\u0627\u06cc \u0645\u062a\u0646\u06cc\u060c \u0636\u0628\u0637 \u0648\u06cc\u062f\u06cc\u0648\u0647\u0627\u06cc \u0622\u0645\u0648\u0632\u0634\u06cc \u0648 \u0646\u0648\u0634\u062a\u0646 \u0635\u0648\u0631\u062a \u062a\u0645\u0631\u06cc\u0646\u200c\u0647\u0627\u060c \u062a\u0633\u062a\u200c\u0647\u0627\u06cc\u06cc \u0628\u0631\u0627\u06cc \u062a\u0645\u0631\u06cc\u0646\u200c\u0647\u0627 \u0646\u0648\u0634\u062a\u0647\u200c\u0627\u0646\u062f \u06a9\u0647 \u0628\u0639\u0636\u0627\u064b \u0686\u0627\u0644\u0634\u06cc \u0647\u0633\u062a\u0646\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647\u060c \u0642\u0631\u0627\u0631 \u0627\u0633\u062a \u0646\u062d\u0648\u0647\u200c\u06cc \u062f\u0627\u0648\u0631\u06cc \u062a\u0645\u0631\u06cc\u0646\u200c\u0647\u0627\u06cc \u0641\u0635\u0644 \u00ab\u062a\u0633\u062a\u200c\u0646\u0648\u06cc\u0633\u06cc\u00bb \u062f\u0648\u0631\u0647\u200c\u06cc \u00ab\u062c\u0627\u0645\u067e \u0628\u06a9\u200c\u0627\u0646\u062f \u0628\u0627 \u0644\u0627\u0631\u0627\u0648\u0644\u00bb \u0648 \u0686\u0627\u0644\u0634\u200c\u0647\u0627\u06cc \u0622\u0646 \u0631\u0627 \u0628\u0631\u0631\u0633\u06cc \u06a9\u0646\u06cc\u0645.<\/p>\n\n\n\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_86 counter-hierarchy ez-toc-counter-rtl ez-toc-grey ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title ez-toc-toggle\" style=\"cursor:pointer\">\u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"\u062a\u063a\u06cc\u06cc\u0631 \u0648\u0636\u0639\u06cc\u062a \u0641\u0647\u0631\u0633\u062a \u0645\u0637\u0627\u0644\u0628\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/quera.org\/blog\/quera-jump-courses\/#%D8%A7%DB%8C%D8%AF%D9%87%E2%80%8C%DB%8C_%D8%A7%D9%88%D9%84%DB%8C%D9%87%E2%80%8C%DB%8C_%D8%B3%D8%A4%D8%A7%D9%84%D8%A7%D8%AA_%D9%88_%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%DA%86%D8%A7%D9%84%D8%B4\" >\u0627\u06cc\u062f\u0647\u200c\u06cc \u0627\u0648\u0644\u06cc\u0647\u200c\u06cc \u0633\u0624\u0627\u0644\u0627\u062a \u0648 \u0628\u0631\u0631\u0633\u06cc \u0686\u0627\u0644\u0634<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/quera.org\/blog\/quera-jump-courses\/#%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1_%D8%AA%D8%B3%D8%AA%E2%80%8C%D9%87%D8%A7\" >\u0633\u0627\u062e\u062a\u0627\u0631 \u062a\u0633\u062a\u200c\u0647\u0627<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/quera.org\/blog\/quera-jump-courses\/#%D8%AA%D8%B3%D8%AA%E2%80%8C%D9%87%D8%A7_%D8%B1%D8%A7_%D8%AA%D8%B3%D8%AA_%DA%A9%D9%86%DB%8C%D9%85\" >\u062a\u0633\u062a\u200c\u0647\u0627 \u0631\u0627 \u062a\u0633\u062a \u06a9\u0646\u06cc\u0645!<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/quera.org\/blog\/quera-jump-courses\/#%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87%E2%80%8C%D8%B3%D8%A7%D8%B2%DB%8C%E2%80%8C%D9%87%D8%A7%DB%8C_%D9%85%D8%AE%D8%AA%D9%84%D9%81_%D8%A7%D8%B2_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87\" >\u0627\u06cc\u062c\u0627\u062f \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/quera.org\/blog\/quera-jump-courses\/#%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C_%D8%AA%D8%B3%D8%AA%E2%80%8C%D9%87%D8%A7%DB%8C_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1_%D8%AF%D8%B1_PHPUnit\" >\u0627\u062c\u0631\u0627\u06cc \u062a\u0633\u062a\u200c\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631 PHPUnit<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-2'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/quera.org\/blog\/quera-jump-courses\/#%D8%AC%D9%85%D8%B9%E2%80%8C%D8%A8%D9%86%D8%AF%DB%8C\" >\u062c\u0645\u0639\u200c\u0628\u0646\u062f\u06cc<\/a><\/li><\/ul><\/nav><\/div>\n<h2 class=\"has-medium-font-size wp-block-heading\" id=\"\u0627\u06cc\u062f\u0647-\u06cc-\u0627\u0648\u0644\u06cc\u0647-\u06cc-\u0633\u0624\u0627\u0644\u0627\u062a-\u0648-\u0628\u0631\u0631\u0633\u06cc-\u0686\u0627\u0644\u0634\"><span class=\"ez-toc-section\" id=\"%D8%A7%DB%8C%D8%AF%D9%87%E2%80%8C%DB%8C_%D8%A7%D9%88%D9%84%DB%8C%D9%87%E2%80%8C%DB%8C_%D8%B3%D8%A4%D8%A7%D9%84%D8%A7%D8%AA_%D9%88_%D8%A8%D8%B1%D8%B1%D8%B3%DB%8C_%DA%86%D8%A7%D9%84%D8%B4\"><\/span><strong>\u0627\u06cc\u062f\u0647\u200c\u06cc \u0627\u0648\u0644\u06cc\u0647\u200c\u06cc \u0633\u0624\u0627\u0644\u0627\u062a \u0648 \u0628\u0631\u0631\u0633\u06cc \u0686\u0627\u0644\u0634<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u0627\u0648\u0644\u06cc\u0646 \u0686\u06cc\u0632\u06cc \u06a9\u0647 \u0628\u0631\u0627\u06cc \u0634\u0631\u0648\u0639 \u0637\u0631\u0627\u062d\u06cc \u06cc\u06a9 \u0633\u0624\u0627\u0644 \u0644\u0627\u0632\u0645 \u0627\u0633\u062a\u060c \u0627\u06cc\u062f\u0647 \u0648 \u0633\u0646\u0627\u0631\u06cc\u0648\u06cc \u0633\u0624\u0627\u0644 \u0627\u0633\u062a \u06a9\u0647 \u0628\u0627\u06cc\u062f \u062f\u0631 \u0630\u0647\u0646 \u0637\u0631\u0627\u062d \u0634\u06a9\u0644 \u0628\u06af\u06cc\u0631\u062f. \u0641\u0635\u0644 \u00ab\u062a\u0633\u062a\u200c\u0646\u0648\u06cc\u0633\u06cc\u00bb \u062f\u0648\u0631\u0647\u200c\u06cc \u0644\u0627\u0631\u0627\u0648\u0644 \u0634\u0627\u0645\u0644 \u062f\u0648 \u062a\u0645\u0631\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u062e\u0644\u0627\u0635\u0647\u200c\u06cc \u0633\u0646\u0627\u0631\u06cc\u0648\u06cc \u0622\u0646\u200c\u0647\u0627 \u0628\u0647 \u0634\u0631\u062d \u0632\u06cc\u0631 \u0627\u0633\u062a:<\/p>\n\n\n\n<ul class=\"wp-block-list\" style=\"font-size:14.5px\"><li>\u062a\u0639\u062f\u0627\u062f\u06cc \u062a\u0633\u062a \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f \u0648 \u0627\u0648 \u0628\u0627\u06cc\u062f \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u0637\u0648\u0631\u06cc \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u06a9\u0646\u062f \u062a\u0627 \u0627\u06cc\u0646 \u062a\u0633\u062a\u200c\u0647\u0627 pass \u0634\u0648\u0646\u062f.<\/li><li>\u0633\u0627\u062e\u062a\u0627\u0631 \u06cc\u06a9 \u06a9\u0644\u0627\u0633 \u062a\u0633\u062a \u0628\u0647 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f \u0648 \u0627\u0648 \u0628\u0627\u06cc\u062f \u062a\u0633\u062a\u200c\u0647\u0627 \u0631\u0627 \u0637\u0648\u0631\u06cc \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u06a9\u0646\u062f \u062a\u0627 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u0647\u200c\u062f\u0631\u0633\u062a\u06cc \u062a\u0633\u062a \u0634\u0648\u062f.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u0633\u0646\u0627\u0631\u06cc\u0648\u06cc \u0627\u0648\u0644 \u06a9\u0647 \u062f\u0631 \u062a\u0645\u0631\u06cc\u0646 \u00ab\u0645\u0633\u062a\u0631 \u062a\u0633\u062a\u0631\u00bb \u0627\u0632 \u0622\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a\u060c \u0633\u0646\u0627\u0631\u06cc\u0648\u06cc \u0633\u0627\u062f\u0647\u200c\u0627\u06cc \u0627\u0633\u062a \u0648 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0622\u0646 \u0628\u0633\u06cc\u0627\u0631 \u0631\u0627\u062d\u062a \u0627\u0633\u062a. \u06a9\u0627\u0641\u06cc \u0627\u0633\u062a \u062a\u0627 \u062a\u0639\u062f\u0627\u062f\u06cc \u062a\u0633\u062a \u0628\u0646\u0648\u06cc\u0633\u06cc\u0645 \u0648 \u0622\u0646\u200c\u0647\u0627 \u0631\u0627 \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 \u06a9\u0627\u0631\u0628\u0631 \u0642\u0631\u0627\u0631 \u062f\u0647\u06cc\u0645. \u0627\u0645\u0627 \u0633\u0646\u0627\u0631\u06cc\u0648\u06cc \u062f\u0648\u0645 \u0628\u0647\u200c\u0633\u0627\u062f\u06af\u06cc \u0633\u0646\u0627\u0631\u06cc\u0648\u06cc \u0627\u0648\u0644 \u0646\u06cc\u0633\u062a. \u062f\u0631 \u0627\u06cc\u0646 \u062d\u0627\u0644\u062a\u060c \u0686\u06af\u0648\u0646\u0647 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u0645 \u062a\u0634\u062e\u06cc\u0635 \u062f\u0647\u06cc\u0645 \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u062a\u0633\u062a\u200c\u0647\u0627\u06cc \u062f\u0631\u0633\u062a\u06cc \u0646\u0648\u0634\u062a\u0647 \u0627\u0633\u062a\u061f \u0627\u0635\u0644\u0627\u064b \u0686\u0647 \u062a\u0633\u062a\u200c\u0647\u0627\u06cc\u06cc \u0642\u0631\u0627\u0631 \u0627\u0633\u062a \u062a\u0648\u0633\u0637 \u06a9\u0627\u0631\u0628\u0631 \u0646\u0648\u0634\u062a\u0647 \u0634\u0648\u062f\u061f \u062f\u0631 \u0627\u062f\u0627\u0645\u0647\u060c \u0628\u0647 \u0646\u062d\u0648\u0647\u200c\u06cc \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0627\u06cc\u0646 \u062a\u0645\u0631\u06cc\u0646 \u0645\u06cc\u200c\u067e\u0631\u062f\u0627\u0632\u06cc\u0645.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u0627\u0632 \u0627\u06cc\u0646 \u0633\u0646\u0627\u0631\u06cc\u0648 \u062f\u0631 \u062a\u0645\u0631\u06cc\u0646 \u00ab\u0628\u06cc\u200c\u0628\u0627\u06af\u00bb \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a.<\/p>\n\n\n\n<h2 class=\"has-medium-font-size wp-block-heading\" id=\"\u0633\u0627\u062e\u062a\u0627\u0631-\u062a\u0633\u062a-\u0647\u0627\"><span class=\"ez-toc-section\" id=\"%D8%B3%D8%A7%D8%AE%D8%AA%D8%A7%D8%B1_%D8%AA%D8%B3%D8%AA%E2%80%8C%D9%87%D8%A7\"><\/span><strong>\u0633\u0627\u062e\u062a\u0627\u0631 \u062a\u0633\u062a\u200c\u0647\u0627<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u06a9\u0627\u0631\u0628\u0631 \u0642\u0631\u0627\u0631 \u0627\u0633\u062a \u062a\u0639\u062f\u0627\u062f\u06cc feature test \u06cc\u0627 \u0627\u0635\u0637\u0644\u0627\u062d\u0627\u064b <a href=\"https:\/\/en.wikipedia.org\/wiki\/Black-box_testing\" target=\"_blank\" rel=\"noreferrer noopener\">black-box test<\/a> \u0628\u0631\u0627\u06cc \u0628\u062e\u0634 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u06cc\u06a9 \u0648\u0628\u200c\u0633\u0627\u06cc\u062a \u0628\u0646\u0648\u06cc\u0633\u062f. \u0628\u062e\u0634\u06cc \u0627\u0632 \u0633\u0627\u062e\u062a\u0627\u0631 \u0622\u0646 \u0628\u0647\u200c\u0635\u0648\u0631\u062a \u0632\u06cc\u0631 \u0627\u0633\u062a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">&lt;?php\n\nnamespace Tests\\Feature;\n\nuse Illuminate\\Foundation\\Testing\\RefreshDatabase;\nuse Tests\\TestCase;\n\nclass AuthTest extends TestCase\n{\n    use RefreshDatabase;\n\n    public function test_login_successful()\n    {\n        \/\/ TODO: Implement\n    }\n\n    public function test_login_no_username_provided()\n    {\n        \/\/ TODO: Implement\n    }\n\n    public function test_login_no_password_provided()\n    {\n        \/\/ TODO: Implement\n    }\n\n    public function test_login_invalid_credentials()\n    {\n        \/\/ TODO: Implement\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u062f\u0631 \u0627\u06cc\u0646\u062c\u0627\u060c \u062d\u062a\u06cc \u0627\u062e\u062a\u06cc\u0627\u0631 \u0645\u062d\u062a\u0648\u06cc\u0627\u062a \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633 \u0647\u0645 \u062f\u0633\u062a \u0645\u0627 \u0646\u06cc\u0633\u062a! \u06a9\u0627\u0631\u0628\u0631 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u0647\u0631 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0631\u0627 \u0628\u0631\u0627\u06cc \u062a\u0633\u062a \u062f\u0631 \u062f\u06cc\u062a\u0627\u0628\u06cc\u0633 \u062f\u0631\u062c \u06a9\u0646\u062f \u0648 \u0627\u0632 \u0622\u0646 \u0628\u0631\u0627\u06cc \u062a\u0633\u062a \u0628\u0631\u0646\u0627\u0645\u0647 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0646\u062f. \u062f\u0631 \u0635\u0648\u0631\u062a \u0633\u0624\u0627\u0644\u060c \u062a\u0648\u0636\u06cc\u062d\u0627\u062a \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0647\u0631 \u06cc\u06a9 \u0627\u0632 \u062a\u0633\u062a\u200c\u0647\u0627 \u0630\u06a9\u0631 \u0634\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u0628\u062e\u0634\u06cc \u0627\u0632 \u0622\u0646 \u0628\u0647\u200c\u0635\u0648\u0631\u062a \u0632\u06cc\u0631 \u0627\u0633\u062a:<\/p>\n\n\n\n<ul class=\"wp-block-list\" style=\"font-size:14.5px\"><li><em>\u062a\u0633\u062a <code>test_login_successful<\/code>: \u0627\u06cc\u0646 \u062a\u0633\u062a \u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0645\u0639\u062a\u0628\u0631\u06cc \u0631\u0627 \u062f\u0631 \u0641\u0631\u0645 \u0648\u0631\u0648\u062f \u0648\u0627\u0631\u062f \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/em><\/li><li><em>\u062a\u0633\u062a <code>test_login_no_username_provided<\/code>: \u0627\u06cc\u0646 \u062a\u0633\u062a \u0641\u0642\u0637 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0631\u0627 \u062f\u0631 \u0641\u0631\u0645 \u0648\u0631\u0648\u062f \u0648\u0627\u0631\u062f \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/em><\/li><li><em>\u062a\u0633\u062a <code>test_login_no_password_provided<\/code>: \u0627\u06cc\u0646 \u062a\u0633\u062a \u0641\u0642\u0637 \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u06cc\u0627 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0631\u0627 \u062f\u0631 \u0641\u0631\u0645 \u0648\u0627\u0631\u062f \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/em><\/li><li><em>\u062a\u0633\u062a <code>test_login_invalid_credentials<\/code>: \u0627\u06cc\u0646 \u062a\u0633\u062a \u06cc\u06a9 \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u06cc\u0627 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0646\u0627\u062f\u0631\u0633\u062a \u0631\u0627 \u062f\u0631 \u0641\u0631\u0645 \u0648\u0631\u0648\u062f \u0648\u0627\u0631\u062f \u0645\u06cc\u200c\u06a9\u0646\u062f.<\/em><\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u06a9\u0627\u0631\u0628\u0631 \u0628\u0627\u06cc\u062f \u0628\u062f\u0627\u0646\u062f \u062f\u0631 \u0647\u0631 \u06cc\u06a9 \u0627\u0632 \u0627\u06cc\u0646 \u062a\u0633\u062a\u200c\u0647\u0627 \u0628\u0627\u06cc\u062f \u062f\u0642\u06cc\u0642\u0627\u064b \u0686\u0647 assertion\u0647\u0627\u06cc\u06cc \u0628\u0646\u0648\u06cc\u0633\u062f. \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646\u060c \u0631\u0641\u062a\u0627\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u062f\u0631 \u062d\u0627\u0644\u062a\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u062f\u0631 \u0635\u0648\u0631\u062a \u0633\u0624\u0627\u0644 \u0630\u06a9\u0631 \u0634\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u0628\u062e\u0634\u06cc \u0627\u0632 \u0622\u0646 \u0628\u0647\u200c\u0635\u0648\u0631\u062a \u0632\u06cc\u0631 \u0627\u0633\u062a:<\/p>\n\n\n\n<ul class=\"wp-block-list\" style=\"font-size:14.5px\"><li><em>\u0627\u06af\u0631 \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u0648\u0627\u0631\u062f \u0646\u0634\u062f\u0647 \u0628\u0627\u0634\u062f\u060c \u0639\u0628\u0627\u0631\u062a <code>__('validation.required', ['attribute' =&gt; 'username'])<\/code> \u062f\u0631 \u067e\u0627\u0633\u062e \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0638\u0627\u0647\u0631 \u062e\u0648\u0627\u0647\u062f \u0634\u062f.<\/em><\/li><li><em>\u0627\u06af\u0631 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0648\u0627\u0631\u062f \u0646\u0634\u062f\u0647 \u0628\u0627\u0634\u062f\u060c \u0639\u0628\u0627\u0631\u062a <code>__('validation.required', ['attribute' =&gt; 'password'])<\/code> \u062f\u0631 \u067e\u0627\u0633\u062e \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0638\u0627\u0647\u0631 \u062e\u0648\u0627\u0647\u062f \u0634\u062f.<\/em><\/li><li><em>\u0627\u06af\u0631 \u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u06cc \u06cc\u0627 \u0631\u0645\u0632 \u0639\u0628\u0648\u0631 \u0646\u0627\u062f\u0631\u0633\u062a \u0628\u0627\u0634\u062f\u060c \u0639\u0628\u0627\u0631\u062a <code>__('auth.failed')<\/code> \u062f\u0631 \u067e\u0627\u0633\u062e \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0638\u0627\u0647\u0631 \u062e\u0648\u0627\u0647\u062f \u0634\u062f.<\/em><\/li><li><em>\u0627\u06af\u0631 \u0648\u0631\u0648\u062f \u0645\u0648\u0641\u0642\u06cc\u062a\u200c\u0622\u0645\u06cc\u0632 \u0628\u0627\u0634\u062f\u060c \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631 \u0633\u06cc\u0633\u062a\u0645 \u0648\u0627\u0631\u062f \u062e\u0648\u0627\u0647\u062f \u0634\u062f \u0648 \u0639\u0628\u0627\u0631\u062a <code>__('auth.success')<\/code> \u062f\u0631 \u067e\u0627\u0633\u062e \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0638\u0627\u0647\u0631 \u062e\u0648\u0627\u0647\u062f \u0634\u062f.<\/em><\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u0647\u0645\u0686\u0646\u06cc\u0646\u060c \u0631\u0648\u062a\u200c\u0647\u0627\u06cc \u0628\u0631\u0646\u0627\u0645\u0647 \u0646\u06cc\u0632 \u062f\u0631 \u0627\u062e\u062a\u06cc\u0627\u0631 \u06a9\u0627\u0631\u0628\u0631 \u0642\u0631\u0627\u0631 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647\u200c\u0627\u0646\u062f \u062a\u0627 \u0628\u062f\u0627\u0646\u062f \u0628\u0647 \u0686\u0647 \u0622\u062f\u0631\u0633\u200c\u0647\u0627\u06cc\u06cc \u062f\u0631\u062e\u0648\u0627\u0633\u062a \u0627\u0631\u0633\u0627\u0644 \u06a9\u0646\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">&lt;?php\n\nuse App\\Http\\Controllers\\AuthController;\n\nRoute::prefix('panel')-&gt;group(function () {\n    Route::get('\/login', [AuthController::class, 'showLoginForm']);\n    Route::post('\/login', [AuthController::class, 'attemptLogin']);\n    Route::get('\/signup', [AuthController::class, 'showSignupForm']);\n    Route::post('\/signup', [AuthController::class, 'attemptSignup']);\n});<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u0628\u0627 \u0628\u06cc\u0627\u0646 \u0627\u06cc\u0646 \u062c\u0632\u0626\u06cc\u0627\u062a\u060c \u06a9\u0627\u0631\u0628\u0631 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u062a\u0633\u062a\u200c\u0647\u0627 \u0631\u0627 \u0628\u0647\u200c\u0637\u0648\u0631 \u06a9\u0627\u0645\u0644 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u06a9\u0646\u062f. \u0627\u0645\u0627 \u0686\u06af\u0648\u0646\u0647 \u0642\u0631\u0627\u0631 \u0627\u0633\u062a \u0645\u062a\u0648\u062c\u0647 \u0634\u0648\u06cc\u0645 \u06a9\u0647 \u0627\u06cc\u0646 \u062a\u0633\u062a\u200c\u0647\u0627 \u0628\u0647\u200c\u062f\u0631\u0633\u062a\u06cc \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0634\u062f\u0647\u200c\u0627\u0646\u062f\u061f<\/p>\n\n\n\n<h2 class=\"has-medium-font-size wp-block-heading\" id=\"\u062a\u0633\u062a-\u0647\u0627-\u0631\u0627-\u062a\u0633\u062a-\u06a9\u0646\u06cc\u0645\"><span class=\"ez-toc-section\" id=\"%D8%AA%D8%B3%D8%AA%E2%80%8C%D9%87%D8%A7_%D8%B1%D8%A7_%D8%AA%D8%B3%D8%AA_%DA%A9%D9%86%DB%8C%D9%85\"><\/span><strong>\u062a\u0633\u062a\u200c\u0647\u0627 \u0631\u0627 \u062a\u0633\u062a \u06a9\u0646\u06cc\u0645!<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u0628\u0631\u0627\u06cc \u062f\u0627\u0648\u0631\u06cc \u0633\u0624\u0627\u0644\u0627\u062a\u060c \u0628\u0647 \u0647\u0631 \u062d\u0627\u0644 \u0628\u0627\u06cc\u062f \u0645\u0648\u0627\u0631\u062f\u06cc \u06a9\u0647 \u06a9\u0627\u0631\u0628\u0631 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f \u0631\u0627 \u062a\u0633\u062a \u06a9\u0631\u062f. \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u0647\u0645 \u0628\u0627\u06cc\u062f \u062a\u0633\u062a\u200c\u0647\u0627 \u0631\u0627 \u062a\u0633\u062a \u06a9\u0631\u062f. \u0634\u0627\u06cc\u062f \u0627\u06cc\u0646 \u0631\u0627\u0647\u200c\u062d\u0644 \u06cc\u06a9 bad practice \u0645\u062d\u0633\u0648\u0628 \u0634\u0648\u062f\u060c \u0627\u0645\u0627 \u0686\u0627\u0631\u0647\u200c\u0627\u06cc \u0646\u06cc\u0633\u062a! \u0647\u0631 \u0631\u0648\u0634\u06cc \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0646\u0648\u06cc\u0633\u06cc \u06a9\u0647 \u062f\u0631 \u062d\u0627\u0644\u062a \u06a9\u0644\u06cc \u06cc\u06a9 \u0631\u0648\u0634 \u062e\u0648\u0628 \u0645\u062d\u0633\u0648\u0628 \u0645\u06cc\u200c\u0634\u0648\u062f\u060c \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u062f\u0631 \u0628\u0639\u0636\u06cc \u0634\u0631\u0627\u06cc\u0637 \u0628\u062f\u062a\u0631\u06cc\u0646 \u0631\u0648\u0634 \u0645\u0645\u06a9\u0646 \u0628\u0627\u0634\u062f. \u0628\u0631\u0639\u06a9\u0633 \u0627\u06cc\u0646 \u0642\u0636\u06cc\u0647 \u0628\u0631\u0627\u06cc \u0631\u0648\u0634\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0646\u0648\u06cc\u0633\u200c\u0647\u0627 \u0622\u0646\u200c\u0647\u0627 \u0631\u0627 \u0631\u0648\u0634\u200c\u0647\u0627\u06cc\u06cc \u0628\u062f \u062e\u0637\u0627\u0628 \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f \u0646\u06cc\u0632 \u0635\u0627\u062f\u0642 \u0627\u0633\u062a. \u0628\u06af\u0630\u0631\u06cc\u0645\u061b \u0628\u06cc\u0627\u06cc\u06cc\u062f \u0628\u0647 \u0628\u0631\u0631\u0633\u06cc \u0627\u06cc\u0646 \u0631\u0648\u0634 \u062c\u0630\u0627\u0628 \u0628\u0631\u0627\u06cc \u062a\u0633\u062a \u06a9\u0631\u062f\u0646 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u067e\u0631\u062f\u0627\u0632\u06cc\u0645.<\/p>\n\n\n\n<h2 class=\"has-medium-font-size wp-block-heading\" id=\"\u0627\u06cc\u062c\u0627\u062f-\u067e\u06cc\u0627\u062f\u0647-\u0633\u0627\u0632\u06cc-\u0647\u0627\u06cc-\u0645\u062e\u062a\u0644\u0641-\u0627\u0632-\u0628\u0631\u0646\u0627\u0645\u0647\"><span class=\"ez-toc-section\" id=\"%D8%A7%DB%8C%D8%AC%D8%A7%D8%AF_%D9%BE%DB%8C%D8%A7%D8%AF%D9%87%E2%80%8C%D8%B3%D8%A7%D8%B2%DB%8C%E2%80%8C%D9%87%D8%A7%DB%8C_%D9%85%D8%AE%D8%AA%D9%84%D9%81_%D8%A7%D8%B2_%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D9%87\"><\/span><strong>\u0627\u06cc\u062c\u0627\u062f \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u0628\u0631\u0627\u06cc \u062a\u0633\u062a \u06a9\u0627\u0645\u0644 \u062a\u0633\u062a\u200c\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u060c \u0628\u0627\u06cc\u062f \u062d\u0627\u0644\u062a\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641\u06cc \u0627\u0632 \u0628\u0631\u0646\u0627\u0645\u0647 \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u0645 \u06a9\u0647 \u062f\u0631 \u0622\u0646\u200c\u0647\u0627 \u0628\u062e\u0634\u06cc \u0627\u0632 \u062a\u0633\u062a\u200c\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0628\u0627\u06cc\u062f pass \u0634\u0648\u0646\u062f \u0648 \u0628\u062e\u0634\u06cc \u0627\u0632 \u0622\u0646\u200c\u0647\u0627 \u0628\u0627\u06cc\u062f fail \u0634\u0648\u0646\u062f.\u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u062f\u0631 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u062a\u0641\u0627\u0648\u062a \u062f\u0627\u0631\u0646\u062f \u062f\u0631 \u0642\u0627\u0644\u0628 stub \u062f\u0631\u200c\u0622\u0645\u062f\u0647\u200c\u0627\u0646\u062f \u062a\u0627 \u0628\u062a\u0648\u0627\u0646 \u0628\u062e\u0634\u200c\u0647\u0627\u06cc\u06cc \u0627\u0632 \u0622\u0646\u200c\u0647\u0627 \u0631\u0627 \u062f\u0631 \u062d\u0627\u0644\u062a\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0627\u062f. \u0628\u0631\u0627\u06cc \u0645\u062b\u0627\u0644\u060c stub \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u06a9\u0646\u062a\u0631\u0644\u0631 <code>AuthController<\/code> \u0628\u0647\u200c\u0635\u0648\u0631\u062a \u0632\u06cc\u0631 \u0627\u0633\u062a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">&lt;?php\n\nnamespace App\\Http\\Controllers;\n\nuse Illuminate\\Support\\Facades\\Auth;\n\nuse App\\Http\\Requests\\LoginRequest;\nuse App\\Models\\User;\n\nclass AuthController extends Controller\n{\n    public function attemptLogin(LoginRequest $request)\n    {\n        {{ attempt_login_body }}\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">stub \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u06a9\u0644\u0627\u0633 <code>LoginRequest<\/code> \u0646\u06cc\u0632 \u0628\u0647\u200c\u0635\u0648\u0631\u062a \u0632\u06cc\u0631 \u0627\u0633\u062a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">&lt;?php\n\nnamespace App\\Http\\Requests;\n\nuse Illuminate\\Contracts\\Validation\\Validator;\nuse Illuminate\\Foundation\\Http\\FormRequest;\nuse Illuminate\\Http\\Exceptions\\HttpResponseException;\n\nclass LoginRequest extends FormRequest\n{\n    public function authorize()\n    {\n        return true;\n    }\n\n    public function rules()\n    {\n        {{ rules }}\n    }\n\n    protected function failedValidation(Validator $validator)\n    {\n        $errors = $validator-&gt;errors();\n    \n        $response = response()-&gt;json($errors-&gt;messages(), 422);\n    \n        throw new HttpResponseException($response);\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u062d\u0627\u0644\u062a\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u06a9\u0646\u062a\u0631\u0644\u0631 \u0648 <code>FormRequest<\/code> \u062f\u0631 \u062a\u0639\u062f\u0627\u062f\u06cc \u0641\u0627\u06cc\u0644 \u0645\u062a\u0646\u06cc \u0646\u0648\u0634\u062a\u0647 \u0634\u062f\u0647\u200c\u0627\u0646\u062f \u0648 \u0647\u0645\u0647\u200c\u06cc \u062a\u0631\u06a9\u06cc\u0628\u200c\u0647\u0627\u06cc \u0645\u062e\u062a\u0644\u0641 \u0627\u06cc\u0646 \u062d\u0627\u0644\u062a\u200c\u0647\u0627 \u062a\u0648\u0633\u0637 \u06cc\u06a9 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u06a9\u0648\u0686\u06a9 \u062a\u0648\u0644\u06cc\u062f \u0645\u06cc\u200c\u0634\u0648\u0646\u062f. \u0647\u0645\u0627\u0646\u200c\u0637\u0648\u0631 \u06a9\u0647 \u0645\u06cc\u200c\u062f\u0627\u0646\u06cc\u062f\u060c \u0627\u06af\u0631 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0631\u0648\u06cc \u0646\u062a\u06cc\u062c\u0647\u200c\u06cc n \u062a\u0633\u062a \u062a\u0623\u062b\u06cc\u0631\u06af\u0630\u0627\u0631 \u0628\u0627\u0634\u062f\u060c \u0645\u062d\u062a\u0648\u0627\u06cc \u0627\u06cc\u0646 \u0641\u0627\u06cc\u0644 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f 2n \u062d\u0627\u0644\u062a \u0645\u062e\u062a\u0644\u0641 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f (\u0647\u0631 \u062a\u0633\u062a \u062f\u0648 \u062d\u0627\u0644\u062a \u062f\u0627\u0631\u062f\u061b \u06cc\u0627 pass \u0645\u06cc\u200c\u0634\u0648\u062f \u06cc\u0627 fail). \u062f\u0631 \u0648\u0627\u0642\u0639\u060c \u0645\u062a\u063a\u06cc\u0631 <code>attempt_login_body<\/code> \u0634\u0627\u0645\u0644 \u0627\u06cc\u0646 \u062a\u0639\u062f\u0627\u062f \u062d\u0627\u0644\u062a \u062e\u0648\u0627\u0647\u062f \u0628\u0648\u062f. \u0628\u0631\u0627\u06cc \u062a\u0648\u0644\u06cc\u062f \u0622\u0633\u0627\u0646 \u0627\u06cc\u0646 \u062d\u0627\u0644\u062a\u200c\u0647\u0627\u060c <code>attempt_login_body<\/code> \u0628\u0631 \u0627\u0633\u0627\u0633 \u0645\u0646\u0637\u0642\u0634 \u0628\u0647 \u062f\u0648 \u0628\u062e\u0634 \u062a\u0642\u0633\u06cc\u0645 \u0634\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u0628\u062e\u0634 \u0627\u0648\u0644 \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0648 \u0628\u062e\u0634 \u062f\u0648\u0645 \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0627\u0631\u0633\u0627\u0644 \u067e\u0627\u0633\u062e \u0627\u0633\u062a. \u0646\u0645\u0648\u0646\u0647\u200c\u06cc \u0635\u062d\u06cc\u062d \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0627\u06cc\u0646 \u062f\u0648 \u0628\u062e\u0634 \u0628\u0647\u200c\u0635\u0648\u0631\u062a \u0632\u06cc\u0631 \u0627\u0633\u062a:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">$success = Auth::attempt([\n    'username' =&gt; $request-&gt;input('username_or_email'),\n    'password' =&gt; $request-&gt;input('password')\n]);<\/code><\/pre>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">return response($success ? __('auth.success') : __('auth.failed'));<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u0627\u06a9\u0646\u0648\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646 \u0628\u0631\u0627\u06cc \u0647\u0631 \u06cc\u06a9 \u0627\u0632 \u062f\u0648 \u0628\u062e\u0634 \u0641\u0648\u0642\u060c \u062f\u0648 \u062a\u06a9\u0647 \u06a9\u062f \u062f\u0631\u0633\u062a \u0648 \u0646\u0627\u062f\u0631\u0633\u062a \u0646\u0648\u0634\u062a \u0648 \u0628\u0627 \u0646\u0648\u0634\u062a\u0646 \u06cc\u06a9 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0633\u0627\u062f\u0647\u060c \u0647\u0645\u0647\u200c\u06cc \u062a\u0631\u06a9\u06cc\u0628\u200c\u0647\u0627\u06cc \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0627\u06cc\u0646 \u062d\u0627\u0644\u062a\u200c\u0647\u0627 \u0631\u0627 \u062a\u0648\u0644\u06cc\u062f \u06a9\u0631\u062f. \u0647\u0631 \u062a\u06a9\u0647 \u06a9\u062f \u062f\u0631 \u0642\u0627\u0644\u0628 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0642\u0631\u0627\u0631 \u062f\u0627\u062f\u0647 \u0634\u062f\u0647 \u0648 \u062f\u0631 \u0627\u0646\u062a\u0647\u0627\u06cc \u0646\u0627\u0645 \u0622\u0646\u200c\u0647\u0627\u060c \u067e\u0633\u0648\u0646\u062f <code>_true<\/code> \u06cc\u0627<code> _false<\/code> \u0622\u0645\u062f\u0647 \u0627\u0633\u062a \u06a9\u0647 \u0628\u06cc\u0627\u0646\u06af\u0631 \u062f\u0631\u0633\u062a \u06cc\u0627 \u0646\u0627\u062f\u0631\u0633\u062a \u0628\u0648\u062f\u0646 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u0627\u0632 \u0622\u0646\u200c\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u062a\u0639\u062f\u0627\u062f \u0627\u06cc\u0646 \u062d\u0627\u0644\u062a\u200c\u0647\u0627 \u0628\u0633\u06cc\u0627\u0631 \u0632\u06cc\u0627\u062f \u0627\u0633\u062a \u0648 \u0627\u062c\u0631\u0627\u06cc \u062a\u0633\u062a\u200c\u0647\u0627 \u0631\u0627 \u0632\u0645\u0627\u0646\u200c\u0628\u0631 \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u062a\u0646\u0647\u0627 \u062a\u0639\u062f\u0627\u062f\u06cc \u0627\u0632 \u0622\u0646\u200c\u0647\u0627 \u0628\u0647\u200c\u0635\u0648\u0631\u062a \u062a\u0635\u0627\u062f\u0641\u06cc \u0627\u0646\u062a\u062e\u0627\u0628 \u0645\u06cc\u200c\u0634\u0648\u0646\u062f. \u0628\u0627 \u0627\u06cc\u0646 \u06a9\u0627\u0631\u060c \u0645\u0645\u06a9\u0646 \u0627\u0633\u062a \u062a\u0633\u062a\u200c\u0647\u0627\u06cc \u06cc\u06a9 \u06a9\u0627\u0631\u0628\u0631 \u0627\u06cc\u0631\u0627\u062f \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u0646\u062f\u060c \u0627\u0645\u0627 \u0627\u0645\u062a\u06cc\u0627\u0632 \u06a9\u0627\u0645\u0644 \u0627\u06cc\u0646 \u0633\u0624\u0627\u0644 \u0631\u0627 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0646\u062f (\u0627\u0644\u0628\u062a\u0647 \u0627\u062d\u062a\u0645\u0627\u0644 \u0648\u0642\u0648\u0639 \u0627\u06cc\u0646 \u062d\u0627\u0644\u062a \u0628\u0633\u06cc\u0627\u0631 \u06a9\u0645 \u0627\u0633\u062a). \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f \u06cc\u06a9 trade-off \u0628\u06cc\u0646 \u062f\u0642\u062a \u062a\u0633\u062a\u200c\u0647\u0627 \u0648 \u0633\u0631\u0639\u062a \u0627\u062c\u0631\u0627\u06cc \u0622\u0646\u200c\u0647\u0627 \u0627\u0633\u062a.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full is-resized\"><img decoding=\"async\" src=\"https:\/\/quera.ir\/blog\/wp-content\/uploads\/2021\/10\/\u062c\u0627\u0645\u067e-\u06a9\u0648\u0626\u0631\u0627-1.jpg\" alt=\"\" class=\"wp-image-1085\" width=\"500\" srcset=\"https:\/\/quera.org\/blog\/wp-content\/uploads\/2021\/10\/\u062c\u0627\u0645\u067e-\u06a9\u0648\u0626\u0631\u0627-1.jpg 625w, https:\/\/quera.org\/blog\/wp-content\/uploads\/2021\/10\/\u062c\u0627\u0645\u067e-\u06a9\u0648\u0626\u0631\u0627-1-300x253.jpg 300w\" sizes=\"(max-width: 625px) 100vw, 625px\" \/><\/figure><\/div>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u0627\u0644\u0628\u062a\u0647 \u0646\u0633\u0628\u062a \u062f\u0642\u062a \u062a\u0633\u062a\u200c\u0647\u0627 \u0628\u0647 \u062a\u0639\u062f\u0627\u062f \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc\u200c\u0647\u0627 \u062e\u0637\u06cc \u0646\u06cc\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u062d\u0627\u0644\u060c \u0628\u0627\u06cc\u062f \u0628\u062f\u0627\u0646\u06cc\u0645 \u06a9\u0647 \u0647\u0631 \u06cc\u06a9 \u0627\u0632 \u062a\u0633\u062a\u200c\u0647\u0627 \u062f\u0631 \u0647\u0631 \u06cc\u06a9 \u0627\u0632 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc\u200c\u0647\u0627 pass \u0645\u06cc\u200c\u0634\u0648\u062f \u06cc\u0627 fail. \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u06a9\u0627\u0631\u060c \u067e\u0627\u0633\u062e \u0635\u062d\u06cc\u062d \u0633\u0624\u0627\u0644 (\u06a9\u0647 \u0647\u0645\u0627\u0646 \u062a\u0633\u062a\u200c\u0647\u0627\u06cc \u0645\u0648\u062c\u0648\u062f \u062f\u0631 \u06a9\u0644\u0627\u0633 AuthTest \u0627\u0633\u062a) \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0634\u062f\u0647 \u0627\u0633\u062a \u062a\u0627 \u0628\u062a\u0648\u0627\u0646 \u0646\u062a\u06cc\u062c\u0647\u200c\u06cc \u0647\u0631 \u062a\u0633\u062a \u0631\u0627 \u0628\u0647 \u0627\u0632\u0627\u06cc \u0647\u0631 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631\u062f. \u06cc\u06a9 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u0633\u0627\u062f\u0647 \u0628\u0631\u0627\u06cc \u0627\u06cc\u0646 \u06a9\u0627\u0631 \u0646\u0648\u0634\u062a\u0647 \u0634\u062f\u0647 \u06a9\u0647 \u0646\u062a\u06cc\u062c\u0647\u200c\u06cc \u0627\u062c\u0631\u0627\u06cc \u062a\u0633\u062a\u200c\u0647\u0627 \u0631\u0627 \u062f\u0631 \u0642\u0627\u0644\u0628 JSON \u0628\u0647\u200c\u0635\u0648\u0631\u062a \u0632\u06cc\u0631 \u0628\u0631\u0645\u06cc\u200c\u06af\u0631\u062f\u0627\u0646\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">{\n    \"test_login_successful\": true,\n    \"test_login_no_username_provided\": true,\n    \"test_login_no_password_provided\": true,\n    \"test_login_invalid_credentials\": true\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u0627\u06cc\u0646 \u062e\u0631\u0648\u062c\u06cc \u0628\u0647 \u0627\u0632\u0627\u06cc \u0647\u0631 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u062a\u0648\u0644\u06cc\u062f \u0634\u062f\u0647 \u0648 \u062f\u0631 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u062f\u0631 \u06cc\u06a9 \u0641\u0627\u06cc\u0644 \u0630\u062e\u06cc\u0631\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0627\u06a9\u0646\u0648\u0646 \u0647\u0645\u0647 \u0686\u06cc\u0632 \u0628\u0631\u0627\u06cc \u062a\u0633\u062a \u06a9\u0631\u062f\u0646 \u062a\u0633\u062a\u200c\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0622\u0645\u0627\u062f\u0647 \u0627\u0633\u062a.<\/p>\n\n\n\n<h2 class=\"has-medium-font-size wp-block-heading\" id=\"\u0627\u062c\u0631\u0627\u06cc-\u062a\u0633\u062a-\u0647\u0627\u06cc-\u06a9\u0627\u0631\u0628\u0631-\u062f\u0631-phpunit\"><span class=\"ez-toc-section\" id=\"%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C_%D8%AA%D8%B3%D8%AA%E2%80%8C%D9%87%D8%A7%DB%8C_%DA%A9%D8%A7%D8%B1%D8%A8%D8%B1_%D8%AF%D8%B1_PHPUnit\"><\/span><strong>\u0627\u062c\u0631\u0627\u06cc \u062a\u0633\u062a\u200c\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631 PHPUnit<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u0633\u06cc\u0633\u062a\u0645 \u062f\u0627\u0648\u0631\u06cc \u0644\u0627\u0631\u0627\u0648\u0644 \u062f\u0631 \u06a9\u0648\u0626\u0631\u0627 \u0628\u0647\u200c\u0635\u0648\u0631\u062a \u067e\u06cc\u0634\u200c\u0641\u0631\u0636 \u062a\u0633\u062a\u200c\u0647\u0627\u06cc\u06cc \u06a9\u0647 \u0645\u0637\u0627\u0628\u0642 \u0628\u0627 \u06a9\u0627\u0646\u0641\u06cc\u06af \u0645\u0648\u062c\u0648\u062f \u062f\u0631 \u0641\u0627\u06cc\u0644 <code>phpunit.xml<\/code> \u0647\u0633\u062a\u0646\u062f \u0631\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0628\u0631\u0627\u06cc \u062c\u0644\u0648\u06af\u06cc\u0631\u06cc \u0627\u0632 \u0627\u062c\u0631\u0627\u06cc \u062a\u0633\u062a\u200c\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631 \u0634\u0631\u0648\u0639 \u0641\u0631\u0627\u06cc\u0646\u062f \u062a\u0633\u062a\u060c \u0628\u0627\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0628\u06cc\u0631\u0648\u0646 \u0627\u0632 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc `tests` \u0642\u0631\u0627\u0631 \u062f\u0627\u062f. \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u062a\u0633\u062a\u200c\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631\u060c \u06a9\u0627\u0641\u06cc \u0627\u0633\u062a \u062a\u0627 \u0641\u0627\u06cc\u0644 \u062a\u0633\u062a \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc\u200c\u0634\u062f\u0647 \u062a\u0648\u0633\u0637 \u06a9\u0627\u0631\u0628\u0631 \u062f\u0631 \u062f\u0627\u06cc\u0631\u06a9\u062a\u0648\u0631\u06cc \u062a\u0633\u062a\u200c\u0647\u0627 \u0642\u0631\u0627\u0631 \u062f\u0627\u062f\u0647 \u0634\u0648\u062f \u0648 \u0647\u0645\u0627\u0646 \u062f\u0633\u062a\u0648\u0631 \u0647\u0645\u06cc\u0634\u06af\u06cc <code>php artisan test<\/code> \u062f\u0631 \u062a\u0633\u062a\u200c\u0647\u0627 \u0627\u062c\u0631\u0627 \u0634\u0648\u062f. \u0627\u0644\u0628\u062a\u0647 \u0646\u0648\u0639 \u062e\u0631\u0648\u062c\u06cc \u062a\u0633\u062a\u200c\u0647\u0627 \u0645\u0647\u0645 \u0627\u0633\u062a. \u062e\u0631\u0648\u062c\u06cc\u200c\u0627\u06cc \u06a9\u0647 \u0647\u0645\u06cc\u0634\u0647 \u062f\u0631 \u062a\u0631\u0645\u06cc\u0646\u0627\u0644 \u0628\u0627 \u0622\u0646 \u0633\u0631\u0648\u06a9\u0627\u0631 \u062f\u0627\u0631\u06cc\u0645\u060c \u062e\u0631\u0648\u062c\u06cc\u200c\u0627\u06cc \u0646\u06cc\u0633\u062a \u06a9\u0647 \u0628\u0631\u0646\u0627\u0645\u0647 \u0628\u062a\u0648\u0627\u0646\u062f \u0622\u0646 \u0631\u0627 \u0628\u0647 \u0631\u0627\u062d\u062a\u06cc parse \u06a9\u0646\u062f. \u0645\u062a\u0623\u0633\u0641\u0627\u0646\u0647 PHPUnit \u0627\u0645\u06a9\u0627\u0646 \u0646\u0645\u0627\u06cc\u0634 \u062e\u0631\u0648\u062c\u06cc JSON \u0631\u0627 \u0646\u062f\u0627\u0631\u062f\u060c \u0627\u0645\u0627 \u062e\u0648\u0634\u0628\u062e\u062a\u0627\u0646\u0647 \u0627\u0632 \u0641\u0631\u0645\u062a\u200c\u0647\u0627\u06cc\u06cc \u0646\u0638\u06cc\u0631 XML \u067e\u0634\u062a\u06cc\u0628\u0627\u0646\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0647\u0645\u0686\u0646\u06cc\u0646\u060c \u0627\u0645\u06a9\u0627\u0646\u06cc \u0628\u0627 \u0646\u0627\u0645 TestDox \u062f\u0631 PHPUnit \u0648\u062c\u0648\u062f \u062f\u0627\u0631\u062f \u06a9\u0647 \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0622\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646 \u062e\u0631\u0648\u062c\u06cc \u062a\u0633\u062a\u200c\u0647\u0627 \u0631\u0627 \u0628\u0647 \u0627\u06cc\u0646 \u0634\u06a9\u0644 \u062f\u0631\u06cc\u0627\u0641\u062a \u06a9\u0631\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">$ phpunit --testdox BankAccountTest.php\nPHPUnit 9.5.0 by Sebastian Bergmann and contributors.\n\nBankAccount\n \u2714 Balance is initially zero\n \u2714 Balance cannot become negative<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u0627\u06af\u0631\u0686\u0647 \u0627\u06cc\u0646 \u062e\u0631\u0648\u062c\u06cc \u0647\u0645\u0627\u0646\u0646\u062f \u062e\u0631\u0648\u062c\u06cc XML \u0634\u0627\u0645\u0644 \u062a\u0645\u0627\u0645 \u062c\u0632\u0626\u06cc\u0627\u062a \u0627\u062c\u0631\u0627\u06cc \u062a\u0633\u062a\u200c\u0647\u0627 \u0646\u06cc\u0633\u062a\u060c \u0627\u0645\u0627 \u0628\u0647\u200c\u0631\u0627\u062d\u062a\u06cc \u0645\u06cc\u200c\u062a\u0648\u0627\u0646 \u0622\u0646 \u0631\u0627 parse \u06a9\u0631\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u062a\u0633\u062a\u200c\u0647\u0627\u060c \u0628\u0647\u200c\u062c\u0627\u06cc <code>shell_exec<\/code> \u06cc\u0627 <code>exec<\/code> \u06a9\u0647 \u0638\u0627\u0647\u0631 \u0632\u06cc\u0628\u0627\u06cc\u06cc \u0646\u062f\u0627\u0631\u0646\u062f\u060c \u0627\u0632 \u06a9\u0644\u0627\u0633 <code>Symfony\\Component\\Process\\Process<\/code> \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a. \u0627\u062c\u0631\u0627\u06cc \u062a\u0633\u062a\u200c\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u062a\u0648\u0633\u0637 \u0645\u062a\u062f <code>getTestResults<\/code> \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u200c\u0634\u0648\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">private static function getTestResults(): array\n{\n    $process = new Process([\n        'php',\n        'artisan',\n        'test',\n        '--order-by', 'random',\n        '--testdox-text', self::$testLogFilepath,\n        self::$testFilepath\n    ]);\n    $process-&gt;run();\n    preg_match_all('\/ \\[(.)] (.*)\/', file_get_contents(self::$testLogFilepath), $matches);\n    $result = [];\n    for ($i = 0; $i &lt; count($matches[0]); $i++) {\n        $testName = 'test_'.Str::snake($matches[2][$i]);\n        $result[$testName] = $matches[1][$i] == 'x';\n    }\n\n    return $result;\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u0627\u0632 \u0641\u0644\u06af <code>--order-by random<\/code> \u0628\u0647 \u0627\u06cc\u0646 \u062f\u0644\u06cc\u0644 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0634\u062f\u0647 \u062a\u0627 \u06a9\u0627\u0631\u0628\u0631 \u062a\u0627 \u062d\u062f\u06cc \u0645\u062c\u0628\u0648\u0631 \u0628\u0647 \u0631\u0639\u0627\u06cc\u062a \u0627\u0635\u0644 Independent \u0627\u0632 \u0627\u0635\u0648\u0644 F.I.R.S.T \u0634\u0648\u062f.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u0637\u0628\u0642 \u0642\u0631\u0627\u0631\u062f\u0627\u062f\u060c \u0627\u0648\u0644\u06cc\u0646 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0647\u0645\u0627\u0646 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc\u200c\u0627\u06cc \u0627\u0633\u062a \u06a9\u0647 \u0647\u0645\u0647\u200c\u06cc \u062a\u0633\u062a\u200c\u0647\u0627 \u0628\u0627\u06cc\u062f \u0628\u0647 \u0627\u0632\u0627\u06cc \u0622\u0646 pass \u0634\u0648\u0646\u062f. \u067e\u06cc\u0634 \u0627\u0632 \u0627\u062c\u0631\u0627\u06cc \u062a\u0633\u062a\u200c\u0647\u0627\u060c \u06cc\u06a9 mapping \u0627\u0632 \u0646\u0627\u0645 \u062a\u0633\u062a\u200c\u0647\u0627 \u0628\u0647 \u0646\u062a\u06cc\u062c\u0647\u200c\u06cc \u0627\u062c\u0631\u0627\u06cc \u0622\u0646\u200c\u0647\u0627 \u0627\u06cc\u062c\u0627\u062f \u0645\u06cc\u200c\u0634\u0648\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">public static function setUpBeforeClass(): void\n{\n    self::$tests = json_decode(file_get_contents(__DIR__.'\/'.self::$codesDirname.'\/1\/expected_results.json'), true);\n    if (!file_exists(self::$testFilepath)) {\n        copy(self::$submissionFilepath, self::$testFilepath);\n    }\n    self::runTests();\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u0645\u062a\u062f <code>runTests<\/code> \u0641\u0627\u06cc\u0644\u200c\u0647\u0627\u06cc \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0631\u0627 \u062f\u0631 \u0628\u0631\u0646\u0627\u0645\u0647 \u06a9\u067e\u06cc \u0645\u06cc\u200c\u06a9\u0646\u062f\u060c \u062a\u0633\u062a\u200c\u0647\u0627 \u0631\u0627 \u0627\u062c\u0631\u0627 \u0645\u06cc\u200c\u06a9\u0646\u062f \u0648 \u0646\u062a\u06cc\u062c\u0647 \u0631\u0627 \u0628\u0627 \u0646\u062a\u06cc\u062c\u0647\u200c\u06cc \u0645\u0648\u0631\u062f\u0627\u0646\u062a\u0638\u0627\u0631 \u0645\u0642\u0627\u06cc\u0633\u0647 \u0645\u06cc\u200c\u06a9\u0646\u062f. \u0627\u06af\u0631 \u0646\u062a\u06cc\u062c\u0647\u200c\u06cc \u062a\u0633\u062a\u200c\u0647\u0627 \u0628\u0627 \u0646\u062a\u06cc\u062c\u0647\u200c\u06cc \u0645\u0648\u0631\u062f\u0646\u0638\u0631 \u0645\u062a\u0641\u0627\u0648\u062a \u0628\u0627\u0634\u062f\u060c \u0645\u0642\u062f\u0627\u0631 \u0622\u0646 \u062f\u0631 map \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u062a\u0633\u062a\u200c\u0647\u0627 \u0628\u0647 <code>false<\/code> \u062a\u063a\u06cc\u06cc\u0631 \u0645\u06cc\u200c\u06a9\u0646\u062f:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">private static function runTests(): void\n{\n    $sampleDirs = glob(__DIR__.'\/'.self::$codesDirname.'\/*');\n    shuffle($sampleDirs);\n    foreach ($sampleDirs as $sampleDir) {\n        foreach (self::$fileMappings as $srcFile =&gt; $destDir) {\n            copy($sampleDir.'\/'.$srcFile, self::BASE_PATH.'\/'.$destDir.'\/'.$srcFile);\n        }\n        $expectedResults = json_decode(file_get_contents($sampleDir.'\/expected_results.json'), true);\n        $actualResults = self::getTestResults();\n        foreach ($expectedResults as $testName =&gt; $expectedResult) {\n            if (!array_key_exists($testName, $actualResults)\n                || $expectedResult != $actualResults[$testName]) {\n                self::$tests[$testName] = false;\n            }\n        }\n    }\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u067e\u0633 \u0627\u0632 \u0627\u062c\u0631\u0627\u06cc \u062a\u0633\u062a\u200c\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u0628\u0647 \u062a\u0639\u062f\u0627\u062f \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc\u200c\u0647\u0627\u060c \u0646\u0648\u0628\u062a \u0628\u0647 \u0627\u062c\u0631\u0627\u06cc \u062a\u0633\u062a\u200c\u0647\u0627\u06cc \u062f\u0627\u0648\u0631\u06cc \u0645\u06cc\u200c\u0631\u0633\u062f. \u0647\u0645\u0647\u200c\u06cc \u0627\u06cc\u0646 \u062a\u0633\u062a\u200c\u0647\u0627 \u0628\u062f\u0646\u0647\u200c\u06cc \u06cc\u06a9\u0633\u0627\u0646\u06cc \u062f\u0627\u0631\u0646\u062f \u0648 \u0635\u0631\u0641\u0627\u064b \u0628\u0631\u0631\u0633\u06cc \u0645\u06cc\u200c\u06a9\u0646\u0646\u062f \u06a9\u0647 \u0622\u06cc\u0627 \u062a\u0633\u062a \u0645\u0648\u0631\u062f\u0646\u0638\u0631 \u062f\u0631 \u0647\u0645\u0647\u200c\u06cc \u062d\u0627\u0644\u062a\u200c\u0647\u0627 \u0646\u062a\u06cc\u062c\u0647\u200c\u06cc \u062f\u0631\u0633\u062a\u06cc \u062f\u0627\u0634\u062a\u0647 \u06cc\u0627 \u0646\u0647:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"php\" class=\"language-php\">public function test_login_successful()\n{\n    $this-&gt;assertTrue(self::$tests[__FUNCTION__]);\n}\n\npublic function test_login_no_username_or_email_provided()\n{\n    $this-&gt;assertTrue(self::$tests[__FUNCTION__]);\n}\n\npublic function test_login_no_password_provided()\n{\n    $this-&gt;assertTrue(self::$tests[__FUNCTION__]);\n}\n\npublic function test_login_invalid_credentials()\n{\n    $this-&gt;assertTrue(self::$tests[__FUNCTION__]);\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u0628\u0647 \u0627\u06cc\u0646 \u062a\u0631\u062a\u06cc\u0628\u060c \u062a\u0633\u062a\u200c\u0647\u0627\u06cc \u06a9\u0627\u0631\u0628\u0631 \u062a\u0633\u062a \u0645\u06cc\u200c\u0634\u0648\u0646\u062f \u0648 \u06a9\u0627\u0631\u0628\u0631 \u0645\u062a\u0648\u062c\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f \u06a9\u0647 \u06a9\u062f\u0627\u0645 \u062a\u0633\u062a\u200c\u0647\u0627 \u0631\u0627 \u0628\u0647\u200c\u062f\u0631\u0633\u062a\u06cc \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u06a9\u0631\u062f\u0647 \u0627\u0633\u062a.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u0628\u0631\u0627\u06cc \u0628\u0647\u0628\u0648\u062f \u062a\u0633\u062a\u200c\u0647\u0627\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646 \u0646\u0648\u0639 \u062e\u0631\u0648\u062c\u06cc \u062a\u0633\u062a\u200c\u0647\u0627 \u0631\u0627 \u0628\u0647 XML \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0627\u062f \u0648 \u067e\u06cc\u0627\u0645 \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 assertion\u0647\u0627 \u0631\u0627 \u062f\u0631 \u062a\u0633\u062a\u200c\u0647\u0627 \u0630\u062e\u06cc\u0631\u0647 \u06a9\u0631\u062f. \u0628\u0627 \u0627\u06cc\u0646 \u06a9\u0627\u0631\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646 \u0627\u0632 \u0627\u06cc\u0646 \u067e\u06cc\u0627\u0645 \u062f\u0631 <code>assertTrue<\/code>\u0647\u0627\u06cc \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u062a\u0633\u062a\u200c\u0647\u0627\u06cc \u062f\u0627\u0648\u0631\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u06a9\u0631\u062f \u062a\u0627 \u0628\u062a\u0648\u0627\u0646 \u062a\u0633\u062a\u200c\u0647\u0627 \u0631\u0627 \u0631\u0627\u062d\u062a\u200c\u062a\u0631 \u062f\u06cc\u0628\u0627\u06af \u06a9\u0631\u062f.<\/p>\n\n\n\n<h2 class=\"has-medium-font-size wp-block-heading\" id=\"\u062c\u0645\u0639-\u0628\u0646\u062f\u06cc\"><span class=\"ez-toc-section\" id=\"%D8%AC%D9%85%D8%B9%E2%80%8C%D8%A8%D9%86%D8%AF%DB%8C\"><\/span><strong>\u062c\u0645\u0639\u200c\u0628\u0646\u062f\u06cc<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\" style=\"font-size:14.5px\">\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0631\u0648\u0634\u200c\u0647\u0627\u06cc \u0639\u062c\u06cc\u0628\u200c\u0648\u200c\u063a\u0631\u06cc\u0628 \u0628\u0631\u0627\u06cc \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0628\u0631\u0646\u0627\u0645\u0647\u200c\u0647\u0627 \u06af\u0631\u0686\u0647 \u0647\u0645\u06cc\u0634\u0647 \u062c\u0627\u0644\u0628 \u0628\u0647 \u0646\u0638\u0631 \u0646\u0645\u06cc\u200c\u0631\u0633\u062f\u060c \u0627\u0645\u0627 \u06af\u0627\u0647\u06cc \u0627\u0648\u0642\u0627\u062a \u062a\u0646\u0647\u0627 \u0631\u0627\u0647 \u0645\u0645\u06a9\u0646 \u0628\u0631\u0627\u06cc \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0647\u0645\u06cc\u0646 \u0631\u0648\u0634\u200c\u0647\u0627 \u0627\u0633\u062a \u0648 \u0646\u0645\u06cc\u200c\u062a\u0648\u0627\u0646 \u0627\u0632 \u0622\u0646\u200c\u0647\u0627 \u0627\u062c\u062a\u0646\u0627\u0628 \u0646\u0645\u0648\u062f. \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0642\u0627\u0644\u0647 \u0628\u0647 \u0628\u0631\u0631\u0633\u06cc \u0628\u062e\u0634\u06cc \u0627\u0632 \u062c\u0632\u0626\u06cc\u0627\u062a \u062a\u0633\u062a \u06a9\u0631\u062f\u0646 \u062a\u0633\u062a\u200c\u0647\u0627 \u067e\u0631\u062f\u0627\u062e\u062a\u0647 \u0634\u062f\u060c \u0627\u0645\u0627 \u0628\u0627 \u062d\u0630\u0641 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc\u200c\u0647\u0627\u06cc \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0648 \u0627\u06cc\u062c\u0627\u062f \u06cc\u06a9 \u0644\u0627\u06cc\u0647 \u062f\u0631 \u062a\u0633\u062a\u200c\u0647\u0627\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646 \u0638\u0627\u0647\u0631 \u0627\u06cc\u0646 \u0631\u0627\u0647\u200c\u062d\u0644 \u0631\u0627 \u0628\u0647 \u0632\u06cc\u0628\u0627\u062a\u0631\u06cc\u0646 \u0634\u06a9\u0644 \u0645\u0645\u06a9\u0646 \u062f\u0631\u200c\u0622\u0648\u0631\u062f. \u0627\u06cc\u0646 \u0686\u0627\u0644\u0634\u060c \u062a\u0646\u0647\u0627 \u06cc\u06a9 \u0686\u0627\u0644\u0634 \u06a9\u0648\u0686\u06a9 \u0648 \u0633\u0627\u062f\u0647 \u0627\u0632 \u0686\u0627\u0644\u0634\u200c\u0647\u0627\u06cc\u06cc \u0628\u0648\u062f \u06a9\u0647 \u062f\u0631 \u06a9\u0648\u0626\u0631\u0627 \u0628\u0627 \u0622\u0646 \u0645\u0648\u0627\u062c\u0647 \u0634\u062f\u0647 \u0628\u0648\u062f\u06cc\u0645. \u062f\u0631 \u0622\u06cc\u0646\u062f\u0647\u060c \u062f\u0627\u0633\u062a\u0627\u0646 \u0645\u0631\u0628\u0648\u0637 \u0628\u0647 \u0686\u0627\u0644\u0634\u200c\u0647\u0627\u06cc \u067e\u06cc\u0686\u06cc\u062f\u0647\u200c\u062a\u0631\u06cc \u0631\u0627 \u0646\u06cc\u0632 \u0628\u0627 \u0634\u0645\u0627 \u0628\u0647 \u0627\u0634\u062a\u0631\u0627\u06a9 \u062e\u0648\u0627\u0647\u06cc\u0645 \u06af\u0630\u0627\u0634\u062a.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u062f\u0648\u0631\u0647\u200c\u0647\u0627\u06cc \u00ab\u062c\u0627\u0645\u067e \u0628\u06a9\u200c\u0627\u0646\u062f \u0628\u0627 \u062c\u0646\u06af\u0648\u00bb \u0648 \u00ab\u062c\u0627\u0645\u067e \u0628\u06a9\u200c\u0627\u0646\u062f \u0628\u0627 \u0644\u0627\u0631\u0627\u0648\u0644\u00bb \u0627\u0632 \u0645\u062d\u0628\u0648\u0628\u200c\u062a\u0631\u06cc\u0646 \u062f\u0648\u0631\u0647\u200c\u0647\u0627\u06cc \u0622\u0645\u0648\u0632\u0634 \u062c\u0646\u06af\u0648 \u0648 \u0644\u0627\u0631\u0627\u0648\u0644 \u0647\u0633\u062a\u0646\u062f. \u0627\u06cc\u0646 \u062f\u0648\u0631\u0647\u200c\u0647\u0627\u06cc&#8230;<\/p>\n","protected":false},"author":8,"featured_media":325,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[50,46,93],"tags":[],"class_list":["post-61","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-quera-developer","category-developer","category-our-stories-dev"],"_links":{"self":[{"href":"https:\/\/quera.org\/blog\/wp-json\/wp\/v2\/posts\/61","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/quera.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/quera.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/quera.org\/blog\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/quera.org\/blog\/wp-json\/wp\/v2\/comments?post=61"}],"version-history":[{"count":35,"href":"https:\/\/quera.org\/blog\/wp-json\/wp\/v2\/posts\/61\/revisions"}],"predecessor-version":[{"id":32975,"href":"https:\/\/quera.org\/blog\/wp-json\/wp\/v2\/posts\/61\/revisions\/32975"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/quera.org\/blog\/wp-json\/wp\/v2\/media\/325"}],"wp:attachment":[{"href":"https:\/\/quera.org\/blog\/wp-json\/wp\/v2\/media?parent=61"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/quera.org\/blog\/wp-json\/wp\/v2\/categories?post=61"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/quera.org\/blog\/wp-json\/wp\/v2\/tags?post=61"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}