feat: add public homepage and downloads

This commit is contained in:
QiuSW
2026-07-06 23:18:08 +08:00
parent 8283573ddc
commit f158a08b9d
18 changed files with 1166 additions and 96 deletions
+70
View File
@@ -18,6 +18,7 @@ from apps.billing.models import (
PricingRule,
RechargeOrder,
)
from apps.portal.models import DownloadRelease
from apps.users.models import ApiKey, UserWallet
@@ -110,6 +111,25 @@ class PortalAccountFlowTests(TestCase):
ai_model=ai_model,
)
def create_download_release(
self,
*,
version: str = "1.0.0",
platform: str = DownloadRelease.Platform.WINDOWS,
is_current: bool = True,
external_url: str = "https://download.example.com/cmhub-desktop.exe",
sha256: str = "a" * 64,
release_notes: str = "首版 Windows 客户端",
) -> DownloadRelease:
return DownloadRelease.objects.create(
platform=platform,
version=version,
is_current=is_current,
external_url=external_url,
sha256=sha256,
release_notes=release_notes,
)
def assert_nav_link_active(self, response, *, href: str, label: str):
html = response.content.decode("utf-8")
self.assertIn(
@@ -211,6 +231,56 @@ class PortalAccountFlowTests(TestCase):
self.assertEqual(response.status_code, 403)
def test_homepage_is_public_and_shows_anonymous_onboarding_without_release(self):
response = self.client.get("/")
self.assertEqual(response.status_code, 200)
self.assertEqual(response.resolver_match.url_name, "portal-home")
self.assertContains(response, "cmhub AI 电商生成台")
self.assertContains(response, "免费注册")
self.assertContains(response, "登录")
self.assertContains(response, "客户端暂未发布")
self.assertContains(response, "暂未发布")
self.assertNotContains(response, "/login?next=")
def test_homepage_shows_current_download_release(self):
release = self.create_download_release(
version="1.2.3",
external_url="https://download.example.com/cmhub-1.2.3.exe",
sha256="b" * 64,
release_notes="修复下载入口并补充 SHA256",
)
response = self.client.get("/")
self.assertEqual(response.status_code, 200)
self.assertEqual(response.context["current_release"], release)
self.assertContains(response, "Windows 客户端 1.2.3")
self.assertContains(response, "https://download.example.com/cmhub-1.2.3.exe")
self.assertContains(response, "b" * 64)
self.assertContains(response, "修复下载入口并补充 SHA256")
self.assertContains(response, "未知发布者")
def test_homepage_shows_dashboard_entry_for_authenticated_user(self):
user = self.create_verified_user()
self.client.force_login(user)
response = self.client.get("/")
self.assertEqual(response.status_code, 200)
self.assertContains(response, "进入控制台")
self.assertNotContains(response, "免费注册")
def test_download_release_only_keeps_one_current_per_platform(self):
old_release = self.create_download_release(version="1.0.0", sha256="c" * 64)
new_release = self.create_download_release(version="1.1.0", sha256="d" * 64)
old_release.refresh_from_db()
new_release.refresh_from_db()
self.assertFalse(old_release.is_current)
self.assertTrue(new_release.is_current)
def test_apikeys_requires_session_login(self):
response = self.client.get("/apikeys")