feat: add public homepage and downloads
This commit is contained in:
@@ -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")
|
||||
|
||||
|
||||
Reference in New Issue
Block a user