<?xml version="1.0" encoding="utf-8"?><testsuites name="pytest tests"><testsuite name="pytest" errors="0" failures="3" skipped="0" tests="20" time="2.810" timestamp="2026-09-13T18:18:45.369173+00:00" hostname="agent-env-55c1e4e6-ea3c-4c0b-ab73-278c98ea6109"><testcase classname="tests.test_recipe_crave.TestAuth" name="test_login_success_sets_cookies" time="0.388" /><testcase classname="tests.test_recipe_crave.TestPublic" name="test_root" time="0.398" /><testcase classname="tests.test_recipe_crave.TestAuth" name="test_login_invalid" time="0.378" /><testcase classname="tests.test_recipe_crave.TestPublic" name="test_recipes_list" time="0.075" /><testcase classname="tests.test_recipe_crave.TestPublic" name="test_categories" time="0.304" /><testcase classname="tests.test_recipe_crave.TestAuth" name="test_me_requires_auth" time="0.217" /><testcase classname="tests.test_recipe_crave.TestPublic" name="test_collections" time="0.073" /><testcase classname="tests.test_recipe_crave.TestPublic" name="test_authors" time="0.075" /><testcase classname="tests.test_recipe_crave.TestPublic" name="test_recipe_by_slug" time="0.153" /><testcase classname="tests.test_recipe_crave.TestPublic" name="test_recipe_slug_not_found" time="0.269" /><testcase classname="tests.test_recipe_crave.TestAuth" name="test_me_with_auth" time="0.448" /><testcase classname="tests.test_recipe_crave.TestPublic" name="test_category_by_slug" time="0.147" /><testcase classname="tests.test_recipe_crave.TestSitemap" name="test_sitemap_xml_base" time="0.146"><failure message="assert ('&lt;urlset' in '&lt;!doctype html&gt;\n&lt;html lang=&quot;en&quot;&gt;\n    &lt;head&gt;\n        &lt;meta charset=&quot;utf-8&quot; /&gt;\n        &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot; /&gt;\n        &lt;meta name=&quot;theme-color&quot; content=&quot;#000000&quot; /&gt;\n        &lt;meta name=&quot;description&quot; content=&quot;A product of emergent.sh&quot; /&gt;\n        &lt;link rel=&quot;preconnect&quot; href=&quot;https://fonts.googleapis.com&quot; /&gt;\n        &lt;link rel=&quot;preconnect&quot; href=&quot;https://fonts.gstatic.com&quot; crossorigin /&gt;\n        &lt;link href=&quot;https://fonts.googleapis.com/css2?family=Inter:wght@600&amp;display=swap&quot; rel=&quot;stylesheet&quot; /&gt;\n        &lt;!--\n        manifest.json provides metadata used when your web app is installed on a\n        user\'s mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/\n        --&gt;\n        &lt;!--\n        Notice the use of  in the tags above.\n        It will be replaced with the URL of the `public` folder during the build.\n        Only files inside the `public` folder can be referenced from the HTML.\n\n        Unlike &quot;/favicon.ico&quot; or &quot;favicon.ico&quot;, &quot;/favicon.ico&quot; will\n        work correctly both with client-side routing and a non-root public URL.\n        Learn how to configure a non-root public U...sers as well,\n                session_recording: {\n                    recordCrossOriginIframes: true,\n                    capturePerformance: false,\n                },\n            });\n        &lt;/script&gt;\n    &lt;script&gt;(function(){function c(){var b=a.contentDocument||(a.contentWindow&amp;&amp;a.contentWindow.document);if(b){var d=b.createElement(\'script\');d.innerHTML=&quot;window.__CF$cv$params={r:\'a3a9280d9a0aef0a\',t:\'MTc4OTMyMzUyNw==\'};var a=document.createElement(\'script\');a.src=\'/cdn-cgi/challenge-platform/scripts/jsd/main.js\';document.getElementsByTagName(\'head\')[0].appendChild(a);&quot;;b.getElementsByTagName(\'head\')[0].appendChild(d)}}if(document.body){var a=document.createElement(\'iframe\');a.height=1;a.width=1;a.style.position=\'absolute\';a.style.top=0;a.style.left=0;a.style.border=\'none\';a.style.visibility=\'hidden\';document.body.appendChild(a);if(\'loading\'!==document.readyState)c();else if(window.addEventListener)document.addEventListener(\'DOMContentLoaded\',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);\'loading\'!==document.readyState&amp;&amp;(document.onreadystatechange=e,c())}}}})();&lt;/script&gt;&lt;/body&gt;\n&lt;/html&gt;\n' or '&lt;sitemapindex' in '&lt;!doctype html&gt;\n&lt;html lang=&quot;en&quot;&gt;\n    &lt;head&gt;\n        &lt;meta charset=&quot;utf-8&quot; /&gt;\n        &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot; /&gt;\n        &lt;meta name=&quot;theme-color&quot; content=&quot;#000000&quot; /&gt;\n        &lt;meta name=&quot;description&quot; content=&quot;A product of emergent.sh&quot; /&gt;\n        &lt;link rel=&quot;preconnect&quot; href=&quot;https://fonts.googleapis.com&quot; /&gt;\n        &lt;link rel=&quot;preconnect&quot; href=&quot;https://fonts.gstatic.com&quot; crossorigin /&gt;\n        &lt;link href=&quot;https://fonts.googleapis.com/css2?family=Inter:wght@600&amp;display=swap&quot; rel=&quot;stylesheet&quot; /&gt;\n        &lt;!--\n        manifest.json provides metadata used when your web app is installed on a\n        user\'s mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/\n        --&gt;\n        &lt;!--\n        Notice the use of  in the tags above.\n        It will be replaced with the URL of the `public` folder during the build.\n        Only files inside the `public` folder can be referenced from the HTML.\n\n        Unlike &quot;/favicon.ico&quot; or &quot;favicon.ico&quot;, &quot;/favicon.ico&quot; will\n        work correctly both with client-side routing and a non-root public URL.\n        Learn how to configure a non-root public U...sers as well,\n                session_recording: {\n                    recordCrossOriginIframes: true,\n                    capturePerformance: false,\n                },\n            });\n        &lt;/script&gt;\n    &lt;script&gt;(function(){function c(){var b=a.contentDocument||(a.contentWindow&amp;&amp;a.contentWindow.document);if(b){var d=b.createElement(\'script\');d.innerHTML=&quot;window.__CF$cv$params={r:\'a3a9280d9a0aef0a\',t:\'MTc4OTMyMzUyNw==\'};var a=document.createElement(\'script\');a.src=\'/cdn-cgi/challenge-platform/scripts/jsd/main.js\';document.getElementsByTagName(\'head\')[0].appendChild(a);&quot;;b.getElementsByTagName(\'head\')[0].appendChild(d)}}if(document.body){var a=document.createElement(\'iframe\');a.height=1;a.width=1;a.style.position=\'absolute\';a.style.top=0;a.style.left=0;a.style.border=\'none\';a.style.visibility=\'hidden\';document.body.appendChild(a);if(\'loading\'!==document.readyState)c();else if(window.addEventListener)document.addEventListener(\'DOMContentLoaded\',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);\'loading\'!==document.readyState&amp;&amp;(document.onreadystatechange=e,c())}}}})();&lt;/script&gt;&lt;/body&gt;\n&lt;/html&gt;\n')&#10; +  where '&lt;!doctype html&gt;\n&lt;html lang=&quot;en&quot;&gt;\n    &lt;head&gt;\n        &lt;meta charset=&quot;utf-8&quot; /&gt;\n        &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot; /&gt;\n        &lt;meta name=&quot;theme-color&quot; content=&quot;#000000&quot; /&gt;\n        &lt;meta name=&quot;description&quot; content=&quot;A product of emergent.sh&quot; /&gt;\n        &lt;link rel=&quot;preconnect&quot; href=&quot;https://fonts.googleapis.com&quot; /&gt;\n        &lt;link rel=&quot;preconnect&quot; href=&quot;https://fonts.gstatic.com&quot; crossorigin /&gt;\n        &lt;link href=&quot;https://fonts.googleapis.com/css2?family=Inter:wght@600&amp;display=swap&quot; rel=&quot;stylesheet&quot; /&gt;\n        &lt;!--\n        manifest.json provides metadata used when your web app is installed on a\n        user\'s mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/\n        --&gt;\n        &lt;!--\n        Notice the use of  in the tags above.\n        It will be replaced with the URL of the `public` folder during the build.\n        Only files inside the `public` folder can be referenced from the HTML.\n\n        Unlike &quot;/favicon.ico&quot; or &quot;favicon.ico&quot;, &quot;/favicon.ico&quot; will\n        work correctly both with client-side routing and a non-root public URL.\n        Learn how to configure a non-root public U...sers as well,\n                session_recording: {\n                    recordCrossOriginIframes: true,\n                    capturePerformance: false,\n                },\n            });\n        &lt;/script&gt;\n    &lt;script&gt;(function(){function c(){var b=a.contentDocument||(a.contentWindow&amp;&amp;a.contentWindow.document);if(b){var d=b.createElement(\'script\');d.innerHTML=&quot;window.__CF$cv$params={r:\'a3a9280d9a0aef0a\',t:\'MTc4OTMyMzUyNw==\'};var a=document.createElement(\'script\');a.src=\'/cdn-cgi/challenge-platform/scripts/jsd/main.js\';document.getElementsByTagName(\'head\')[0].appendChild(a);&quot;;b.getElementsByTagName(\'head\')[0].appendChild(d)}}if(document.body){var a=document.createElement(\'iframe\');a.height=1;a.width=1;a.style.position=\'absolute\';a.style.top=0;a.style.left=0;a.style.border=\'none\';a.style.visibility=\'hidden\';document.body.appendChild(a);if(\'loading\'!==document.readyState)c();else if(window.addEventListener)document.addEventListener(\'DOMContentLoaded\',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);\'loading\'!==document.readyState&amp;&amp;(document.onreadystatechange=e,c())}}}})();&lt;/script&gt;&lt;/body&gt;\n&lt;/html&gt;\n' = &lt;Response [200]&gt;.text&#10; +  and   '&lt;!doctype html&gt;\n&lt;html lang=&quot;en&quot;&gt;\n    &lt;head&gt;\n        &lt;meta charset=&quot;utf-8&quot; /&gt;\n        &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot; /&gt;\n        &lt;meta name=&quot;theme-color&quot; content=&quot;#000000&quot; /&gt;\n        &lt;meta name=&quot;description&quot; content=&quot;A product of emergent.sh&quot; /&gt;\n        &lt;link rel=&quot;preconnect&quot; href=&quot;https://fonts.googleapis.com&quot; /&gt;\n        &lt;link rel=&quot;preconnect&quot; href=&quot;https://fonts.gstatic.com&quot; crossorigin /&gt;\n        &lt;link href=&quot;https://fonts.googleapis.com/css2?family=Inter:wght@600&amp;display=swap&quot; rel=&quot;stylesheet&quot; /&gt;\n        &lt;!--\n        manifest.json provides metadata used when your web app is installed on a\n        user\'s mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/\n        --&gt;\n        &lt;!--\n        Notice the use of  in the tags above.\n        It will be replaced with the URL of the `public` folder during the build.\n        Only files inside the `public` folder can be referenced from the HTML.\n\n        Unlike &quot;/favicon.ico&quot; or &quot;favicon.ico&quot;, &quot;/favicon.ico&quot; will\n        work correctly both with client-side routing and a non-root public URL.\n        Learn how to configure a non-root public U...sers as well,\n                session_recording: {\n                    recordCrossOriginIframes: true,\n                    capturePerformance: false,\n                },\n            });\n        &lt;/script&gt;\n    &lt;script&gt;(function(){function c(){var b=a.contentDocument||(a.contentWindow&amp;&amp;a.contentWindow.document);if(b){var d=b.createElement(\'script\');d.innerHTML=&quot;window.__CF$cv$params={r:\'a3a9280d9a0aef0a\',t:\'MTc4OTMyMzUyNw==\'};var a=document.createElement(\'script\');a.src=\'/cdn-cgi/challenge-platform/scripts/jsd/main.js\';document.getElementsByTagName(\'head\')[0].appendChild(a);&quot;;b.getElementsByTagName(\'head\')[0].appendChild(d)}}if(document.body){var a=document.createElement(\'iframe\');a.height=1;a.width=1;a.style.position=\'absolute\';a.style.top=0;a.style.left=0;a.style.border=\'none\';a.style.visibility=\'hidden\';document.body.appendChild(a);if(\'loading\'!==document.readyState)c();else if(window.addEventListener)document.addEventListener(\'DOMContentLoaded\',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);\'loading\'!==document.readyState&amp;&amp;(document.onreadystatechange=e,c())}}}})();&lt;/script&gt;&lt;/body&gt;\n&lt;/html&gt;\n' = &lt;Response [200]&gt;.text">backend/tests/test_recipe_crave.py:101: in test_sitemap_xml_base
    assert "&lt;urlset" in r.text or "&lt;sitemapindex" in r.text
E   assert ('&lt;urlset' in '&lt;!doctype html&gt;\n&lt;html lang="en"&gt;\n    &lt;head&gt;\n        &lt;meta charset="utf-8" /&gt;\n        &lt;meta name="viewport" content="width=device-width, initial-scale=1" /&gt;\n        &lt;meta name="theme-color" content="#000000" /&gt;\n        &lt;meta name="description" content="A product of emergent.sh" /&gt;\n        &lt;link rel="preconnect" href="https://fonts.googleapis.com" /&gt;\n        &lt;link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /&gt;\n        &lt;link href="https://fonts.googleapis.com/css2?family=Inter:wght@600&amp;display=swap" rel="stylesheet" /&gt;\n        &lt;!--\n        manifest.json provides metadata used when your web app is installed on a\n        user\'s mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/\n        --&gt;\n        &lt;!--\n        Notice the use of  in the tags above.\n        It will be replaced with the URL of the `public` folder during the build.\n        Only files inside the `public` folder can be referenced from the HTML.\n\n        Unlike "/favicon.ico" or "favicon.ico", "/favicon.ico" will\n        work correctly both with client-side routing and a non-root public URL.\n        Learn how to configure a non-root public U...sers as well,\n                session_recording: {\n                    recordCrossOriginIframes: true,\n                    capturePerformance: false,\n                },\n            });\n        &lt;/script&gt;\n    &lt;script&gt;(function(){function c(){var b=a.contentDocument||(a.contentWindow&amp;&amp;a.contentWindow.document);if(b){var d=b.createElement(\'script\');d.innerHTML="window.__CF$cv$params={r:\'a3a9280d9a0aef0a\',t:\'MTc4OTMyMzUyNw==\'};var a=document.createElement(\'script\');a.src=\'/cdn-cgi/challenge-platform/scripts/jsd/main.js\';document.getElementsByTagName(\'head\')[0].appendChild(a);";b.getElementsByTagName(\'head\')[0].appendChild(d)}}if(document.body){var a=document.createElement(\'iframe\');a.height=1;a.width=1;a.style.position=\'absolute\';a.style.top=0;a.style.left=0;a.style.border=\'none\';a.style.visibility=\'hidden\';document.body.appendChild(a);if(\'loading\'!==document.readyState)c();else if(window.addEventListener)document.addEventListener(\'DOMContentLoaded\',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);\'loading\'!==document.readyState&amp;&amp;(document.onreadystatechange=e,c())}}}})();&lt;/script&gt;&lt;/body&gt;\n&lt;/html&gt;\n' or '&lt;sitemapindex' in '&lt;!doctype html&gt;\n&lt;html lang="en"&gt;\n    &lt;head&gt;\n        &lt;meta charset="utf-8" /&gt;\n        &lt;meta name="viewport" content="width=device-width, initial-scale=1" /&gt;\n        &lt;meta name="theme-color" content="#000000" /&gt;\n        &lt;meta name="description" content="A product of emergent.sh" /&gt;\n        &lt;link rel="preconnect" href="https://fonts.googleapis.com" /&gt;\n        &lt;link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /&gt;\n        &lt;link href="https://fonts.googleapis.com/css2?family=Inter:wght@600&amp;display=swap" rel="stylesheet" /&gt;\n        &lt;!--\n        manifest.json provides metadata used when your web app is installed on a\n        user\'s mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/\n        --&gt;\n        &lt;!--\n        Notice the use of  in the tags above.\n        It will be replaced with the URL of the `public` folder during the build.\n        Only files inside the `public` folder can be referenced from the HTML.\n\n        Unlike "/favicon.ico" or "favicon.ico", "/favicon.ico" will\n        work correctly both with client-side routing and a non-root public URL.\n        Learn how to configure a non-root public U...sers as well,\n                session_recording: {\n                    recordCrossOriginIframes: true,\n                    capturePerformance: false,\n                },\n            });\n        &lt;/script&gt;\n    &lt;script&gt;(function(){function c(){var b=a.contentDocument||(a.contentWindow&amp;&amp;a.contentWindow.document);if(b){var d=b.createElement(\'script\');d.innerHTML="window.__CF$cv$params={r:\'a3a9280d9a0aef0a\',t:\'MTc4OTMyMzUyNw==\'};var a=document.createElement(\'script\');a.src=\'/cdn-cgi/challenge-platform/scripts/jsd/main.js\';document.getElementsByTagName(\'head\')[0].appendChild(a);";b.getElementsByTagName(\'head\')[0].appendChild(d)}}if(document.body){var a=document.createElement(\'iframe\');a.height=1;a.width=1;a.style.position=\'absolute\';a.style.top=0;a.style.left=0;a.style.border=\'none\';a.style.visibility=\'hidden\';document.body.appendChild(a);if(\'loading\'!==document.readyState)c();else if(window.addEventListener)document.addEventListener(\'DOMContentLoaded\',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);\'loading\'!==document.readyState&amp;&amp;(document.onreadystatechange=e,c())}}}})();&lt;/script&gt;&lt;/body&gt;\n&lt;/html&gt;\n')
E    +  where '&lt;!doctype html&gt;\n&lt;html lang="en"&gt;\n    &lt;head&gt;\n        &lt;meta charset="utf-8" /&gt;\n        &lt;meta name="viewport" content="width=device-width, initial-scale=1" /&gt;\n        &lt;meta name="theme-color" content="#000000" /&gt;\n        &lt;meta name="description" content="A product of emergent.sh" /&gt;\n        &lt;link rel="preconnect" href="https://fonts.googleapis.com" /&gt;\n        &lt;link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /&gt;\n        &lt;link href="https://fonts.googleapis.com/css2?family=Inter:wght@600&amp;display=swap" rel="stylesheet" /&gt;\n        &lt;!--\n        manifest.json provides metadata used when your web app is installed on a\n        user\'s mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/\n        --&gt;\n        &lt;!--\n        Notice the use of  in the tags above.\n        It will be replaced with the URL of the `public` folder during the build.\n        Only files inside the `public` folder can be referenced from the HTML.\n\n        Unlike "/favicon.ico" or "favicon.ico", "/favicon.ico" will\n        work correctly both with client-side routing and a non-root public URL.\n        Learn how to configure a non-root public U...sers as well,\n                session_recording: {\n                    recordCrossOriginIframes: true,\n                    capturePerformance: false,\n                },\n            });\n        &lt;/script&gt;\n    &lt;script&gt;(function(){function c(){var b=a.contentDocument||(a.contentWindow&amp;&amp;a.contentWindow.document);if(b){var d=b.createElement(\'script\');d.innerHTML="window.__CF$cv$params={r:\'a3a9280d9a0aef0a\',t:\'MTc4OTMyMzUyNw==\'};var a=document.createElement(\'script\');a.src=\'/cdn-cgi/challenge-platform/scripts/jsd/main.js\';document.getElementsByTagName(\'head\')[0].appendChild(a);";b.getElementsByTagName(\'head\')[0].appendChild(d)}}if(document.body){var a=document.createElement(\'iframe\');a.height=1;a.width=1;a.style.position=\'absolute\';a.style.top=0;a.style.left=0;a.style.border=\'none\';a.style.visibility=\'hidden\';document.body.appendChild(a);if(\'loading\'!==document.readyState)c();else if(window.addEventListener)document.addEventListener(\'DOMContentLoaded\',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);\'loading\'!==document.readyState&amp;&amp;(document.onreadystatechange=e,c())}}}})();&lt;/script&gt;&lt;/body&gt;\n&lt;/html&gt;\n' = &lt;Response [200]&gt;.text
E    +  and   '&lt;!doctype html&gt;\n&lt;html lang="en"&gt;\n    &lt;head&gt;\n        &lt;meta charset="utf-8" /&gt;\n        &lt;meta name="viewport" content="width=device-width, initial-scale=1" /&gt;\n        &lt;meta name="theme-color" content="#000000" /&gt;\n        &lt;meta name="description" content="A product of emergent.sh" /&gt;\n        &lt;link rel="preconnect" href="https://fonts.googleapis.com" /&gt;\n        &lt;link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /&gt;\n        &lt;link href="https://fonts.googleapis.com/css2?family=Inter:wght@600&amp;display=swap" rel="stylesheet" /&gt;\n        &lt;!--\n        manifest.json provides metadata used when your web app is installed on a\n        user\'s mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/\n        --&gt;\n        &lt;!--\n        Notice the use of  in the tags above.\n        It will be replaced with the URL of the `public` folder during the build.\n        Only files inside the `public` folder can be referenced from the HTML.\n\n        Unlike "/favicon.ico" or "favicon.ico", "/favicon.ico" will\n        work correctly both with client-side routing and a non-root public URL.\n        Learn how to configure a non-root public U...sers as well,\n                session_recording: {\n                    recordCrossOriginIframes: true,\n                    capturePerformance: false,\n                },\n            });\n        &lt;/script&gt;\n    &lt;script&gt;(function(){function c(){var b=a.contentDocument||(a.contentWindow&amp;&amp;a.contentWindow.document);if(b){var d=b.createElement(\'script\');d.innerHTML="window.__CF$cv$params={r:\'a3a9280d9a0aef0a\',t:\'MTc4OTMyMzUyNw==\'};var a=document.createElement(\'script\');a.src=\'/cdn-cgi/challenge-platform/scripts/jsd/main.js\';document.getElementsByTagName(\'head\')[0].appendChild(a);";b.getElementsByTagName(\'head\')[0].appendChild(d)}}if(document.body){var a=document.createElement(\'iframe\');a.height=1;a.width=1;a.style.position=\'absolute\';a.style.top=0;a.style.left=0;a.style.border=\'none\';a.style.visibility=\'hidden\';document.body.appendChild(a);if(\'loading\'!==document.readyState)c();else if(window.addEventListener)document.addEventListener(\'DOMContentLoaded\',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);\'loading\'!==document.readyState&amp;&amp;(document.onreadystatechange=e,c())}}}})();&lt;/script&gt;&lt;/body&gt;\n&lt;/html&gt;\n' = &lt;Response [200]&gt;.text</failure></testcase><testcase classname="tests.test_recipe_crave.TestProtected" name="test_create_recipe_unauthed" time="0.132" /><testcase classname="tests.test_recipe_crave.TestSitemap" name="test_sitemap_api_backup" time="0.066" /><testcase classname="tests.test_recipe_crave.TestSitemap" name="test_robots" time="0.076"><failure message="assert 'Sitemap:' in '# As a condition of accessing this website, you agree to abide by the following\n# content signals:\n\n# (a)  If a Content-Signal = yes, you may collect content for the corresponding\n#      use.\n# (b)  If a Content-Signal = no, you may not collect content for the\n#      corresponding use.\n# (c)  If the website operator does not include a Content-Signal for a\n#      corresponding use, the website operator neither grants nor restricts\n#      permission via Content-Signal with respect to the corresponding use.\n\n# The content signals and their meanings are:\n\n# search:   building a search index and providing search results (e.g., returning\n#           hyperlinks and short excerpts from your website\'s contents). Search does not\n#           include providing AI-generated search summaries.\n# ai-input: inputting content into one or more AI models (e.g., retrieval\n#           augmented generation, grounding, or other real-time taking of content for\n#           generative AI search answers).\n# ai-train: training or fine-tuning AI models.\n# use:      how AI systems may consume the content (immediate, reference, or full).\n\n# ANY RESTRICTIONS EXPRESSED VIA CONTENT SIGNALS ...ding sessionRecordingStarted captureException loadToolbar get_property getSessionProperty Es $s createPersonProfile Is opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing clear_opt_in_out_capturing Ss debug xs getPageViewId captureTraceFeedback captureTraceMetric&quot;.split(\n                                        &quot; &quot;,\n                                    ),\n                                n = 0;\n                            n &lt; o.length;\n                            n++\n                        )\n                            g(u, o[n]);\n                        e._i.push([i, s, a]);\n                    }),\n                    (e.__SV = 1));\n            })(document, window.posthog || []);\n            posthog.init(&quot;phc_DbsPb39SRc8z3EiQ6Dhj6ikv4H4rTKcht9d4sZSesceP&quot;, {\n                api_host: &quot;https://ap.emergent.sh&quot;,\n                person_profiles: &quot;identified_only&quot;, // or \'always\' to create profiles for anonymous users as well,\n                session_recording: {\n                    recordCrossOriginIframes: true,\n                    capturePerformance: false,\n                },\n            });\n        &lt;/script&gt;\n    &lt;/body&gt;\n&lt;/html&gt;\n'&#10; +  where '# As a condition of accessing this website, you agree to abide by the following\n# content signals:\n\n# (a)  If a Content-Signal = yes, you may collect content for the corresponding\n#      use.\n# (b)  If a Content-Signal = no, you may not collect content for the\n#      corresponding use.\n# (c)  If the website operator does not include a Content-Signal for a\n#      corresponding use, the website operator neither grants nor restricts\n#      permission via Content-Signal with respect to the corresponding use.\n\n# The content signals and their meanings are:\n\n# search:   building a search index and providing search results (e.g., returning\n#           hyperlinks and short excerpts from your website\'s contents). Search does not\n#           include providing AI-generated search summaries.\n# ai-input: inputting content into one or more AI models (e.g., retrieval\n#           augmented generation, grounding, or other real-time taking of content for\n#           generative AI search answers).\n# ai-train: training or fine-tuning AI models.\n# use:      how AI systems may consume the content (immediate, reference, or full).\n\n# ANY RESTRICTIONS EXPRESSED VIA CONTENT SIGNALS ...ding sessionRecordingStarted captureException loadToolbar get_property getSessionProperty Es $s createPersonProfile Is opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing clear_opt_in_out_capturing Ss debug xs getPageViewId captureTraceFeedback captureTraceMetric&quot;.split(\n                                        &quot; &quot;,\n                                    ),\n                                n = 0;\n                            n &lt; o.length;\n                            n++\n                        )\n                            g(u, o[n]);\n                        e._i.push([i, s, a]);\n                    }),\n                    (e.__SV = 1));\n            })(document, window.posthog || []);\n            posthog.init(&quot;phc_DbsPb39SRc8z3EiQ6Dhj6ikv4H4rTKcht9d4sZSesceP&quot;, {\n                api_host: &quot;https://ap.emergent.sh&quot;,\n                person_profiles: &quot;identified_only&quot;, // or \'always\' to create profiles for anonymous users as well,\n                session_recording: {\n                    recordCrossOriginIframes: true,\n                    capturePerformance: false,\n                },\n            });\n        &lt;/script&gt;\n    &lt;/body&gt;\n&lt;/html&gt;\n' = &lt;Response [200]&gt;.text">backend/tests/test_recipe_crave.py:110: in test_robots
    assert "Sitemap:" in r.text
E   assert 'Sitemap:' in '# As a condition of accessing this website, you agree to abide by the following\n# content signals:\n\n# (a)  If a Content-Signal = yes, you may collect content for the corresponding\n#      use.\n# (b)  If a Content-Signal = no, you may not collect content for the\n#      corresponding use.\n# (c)  If the website operator does not include a Content-Signal for a\n#      corresponding use, the website operator neither grants nor restricts\n#      permission via Content-Signal with respect to the corresponding use.\n\n# The content signals and their meanings are:\n\n# search:   building a search index and providing search results (e.g., returning\n#           hyperlinks and short excerpts from your website\'s contents). Search does not\n#           include providing AI-generated search summaries.\n# ai-input: inputting content into one or more AI models (e.g., retrieval\n#           augmented generation, grounding, or other real-time taking of content for\n#           generative AI search answers).\n# ai-train: training or fine-tuning AI models.\n# use:      how AI systems may consume the content (immediate, reference, or full).\n\n# ANY RESTRICTIONS EXPRESSED VIA CONTENT SIGNALS ...ding sessionRecordingStarted captureException loadToolbar get_property getSessionProperty Es $s createPersonProfile Is opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing clear_opt_in_out_capturing Ss debug xs getPageViewId captureTraceFeedback captureTraceMetric".split(\n                                        " ",\n                                    ),\n                                n = 0;\n                            n &lt; o.length;\n                            n++\n                        )\n                            g(u, o[n]);\n                        e._i.push([i, s, a]);\n                    }),\n                    (e.__SV = 1));\n            })(document, window.posthog || []);\n            posthog.init("phc_DbsPb39SRc8z3EiQ6Dhj6ikv4H4rTKcht9d4sZSesceP", {\n                api_host: "https://ap.emergent.sh",\n                person_profiles: "identified_only", // or \'always\' to create profiles for anonymous users as well,\n                session_recording: {\n                    recordCrossOriginIframes: true,\n                    capturePerformance: false,\n                },\n            });\n        &lt;/script&gt;\n    &lt;/body&gt;\n&lt;/html&gt;\n'
E    +  where '# As a condition of accessing this website, you agree to abide by the following\n# content signals:\n\n# (a)  If a Content-Signal = yes, you may collect content for the corresponding\n#      use.\n# (b)  If a Content-Signal = no, you may not collect content for the\n#      corresponding use.\n# (c)  If the website operator does not include a Content-Signal for a\n#      corresponding use, the website operator neither grants nor restricts\n#      permission via Content-Signal with respect to the corresponding use.\n\n# The content signals and their meanings are:\n\n# search:   building a search index and providing search results (e.g., returning\n#           hyperlinks and short excerpts from your website\'s contents). Search does not\n#           include providing AI-generated search summaries.\n# ai-input: inputting content into one or more AI models (e.g., retrieval\n#           augmented generation, grounding, or other real-time taking of content for\n#           generative AI search answers).\n# ai-train: training or fine-tuning AI models.\n# use:      how AI systems may consume the content (immediate, reference, or full).\n\n# ANY RESTRICTIONS EXPRESSED VIA CONTENT SIGNALS ...ding sessionRecordingStarted captureException loadToolbar get_property getSessionProperty Es $s createPersonProfile Is opt_in_capturing opt_out_capturing has_opted_in_capturing has_opted_out_capturing clear_opt_in_out_capturing Ss debug xs getPageViewId captureTraceFeedback captureTraceMetric".split(\n                                        " ",\n                                    ),\n                                n = 0;\n                            n &lt; o.length;\n                            n++\n                        )\n                            g(u, o[n]);\n                        e._i.push([i, s, a]);\n                    }),\n                    (e.__SV = 1));\n            })(document, window.posthog || []);\n            posthog.init("phc_DbsPb39SRc8z3EiQ6Dhj6ikv4H4rTKcht9d4sZSesceP", {\n                api_host: "https://ap.emergent.sh",\n                person_profiles: "identified_only", // or \'always\' to create profiles for anonymous users as well,\n                session_recording: {\n                    recordCrossOriginIframes: true,\n                    capturePerformance: false,\n                },\n            });\n        &lt;/script&gt;\n    &lt;/body&gt;\n&lt;/html&gt;\n' = &lt;Response [200]&gt;.text</failure></testcase><testcase classname="tests.test_recipe_crave.TestRecipeCRUD" name="test_create_update_delete_recipe" time="0.231"><failure message="AssertionError: Create failed: 422 {&quot;detail&quot;:[{&quot;type&quot;:&quot;string_type&quot;,&quot;loc&quot;:[&quot;body&quot;,&quot;prepTime&quot;],&quot;msg&quot;:&quot;Input should be a valid string&quot;,&quot;input&quot;:5,&quot;url&quot;:&quot;https://errors.pydantic.dev/2.13/v/string_type&quot;},{&quot;type&quot;:&quot;string_type&quot;,&quot;loc&quot;:[&quot;body&quot;,&quot;cookTime&quot;],&quot;msg&quot;:&quot;Input should be a valid string&quot;,&quot;input&quot;:10,&quot;url&quot;:&quot;https://errors.pydantic.dev/2.13/v/string_type&quot;},{&quot;type&quot;:&quot;string_type&quot;,&quot;loc&quot;:[&quot;body&quot;,&quot;servings&quot;],&quot;msg&quot;:&quot;Input should be a valid string&quot;,&quot;input&quot;:2,&quot;url&quot;:&quot;https://errors.pydantic.dev/2.13/v/string_type&quot;}]}&#10;assert 422 in (200, 201)&#10; +  where 422 = &lt;Response [422]&gt;.status_code">backend/tests/test_recipe_crave.py:182: in test_create_update_delete_recipe
    assert r.status_code in (200, 201), f"Create failed: {r.status_code} {r.text}"
E   AssertionError: Create failed: 422 {"detail":[{"type":"string_type","loc":["body","prepTime"],"msg":"Input should be a valid string","input":5,"url":"https://errors.pydantic.dev/2.13/v/string_type"},{"type":"string_type","loc":["body","cookTime"],"msg":"Input should be a valid string","input":10,"url":"https://errors.pydantic.dev/2.13/v/string_type"},{"type":"string_type","loc":["body","servings"],"msg":"Input should be a valid string","input":2,"url":"https://errors.pydantic.dev/2.13/v/string_type"}]}
E   assert 422 in (200, 201)
E    +  where 422 = &lt;Response [422]&gt;.status_code</failure></testcase><testcase classname="tests.test_recipe_crave.TestProtected" name="test_admin_stats" time="0.409" /><testcase classname="tests.test_recipe_crave.TestContact" name="test_contact_submit" time="0.077" /><testcase classname="tests.test_recipe_crave.TestCategoryCRUD" name="test_category_crud" time="0.211" /></testsuite></testsuites>