forked from erp-dev/erp
208 lines
7.1 KiB
Python
208 lines
7.1 KiB
Python
from io import StringIO
|
|
|
|
from django.core.cache import cache
|
|
from django.core.management import call_command
|
|
from django.test import TestCase, override_settings
|
|
from django.utils import timezone
|
|
from rest_framework.test import APIClient
|
|
|
|
from api_v1.models import AppVersion
|
|
from flower.app_version import APP_VERSION_CACHE_KEY
|
|
|
|
|
|
class AppVersionAPITest(TestCase):
|
|
def setUp(self):
|
|
cache.delete(APP_VERSION_CACHE_KEY)
|
|
self.client = APIClient()
|
|
|
|
def tearDown(self):
|
|
cache.delete(APP_VERSION_CACHE_KEY)
|
|
|
|
@override_settings(
|
|
APP_LATEST_VERSION_MAJOR=1,
|
|
APP_LATEST_VERSION_MINOR=2,
|
|
APP_LATEST_VERSION_BUILD=345,
|
|
APP_DOWNLOAD_URL="https://example.com/app.apk",
|
|
APP_FORCE_UPDATE=True,
|
|
APP_PUBLISH_DATE="2026-07-08",
|
|
)
|
|
def test_app_version_api_returns_settings_payload_without_auth(self):
|
|
response = self.client.get("/api/app-version/")
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertEqual(
|
|
response.data,
|
|
{
|
|
"latest_version": {
|
|
"major": 1,
|
|
"minor": 2,
|
|
"build": 345,
|
|
},
|
|
"download_url": "https://example.com/app.apk",
|
|
"force": True,
|
|
"publish_date": "2026-07-08",
|
|
"message": "",
|
|
},
|
|
)
|
|
|
|
def test_app_version_api_returns_current_model_version(self):
|
|
AppVersion.objects.create(
|
|
major=1,
|
|
minor=0,
|
|
build=100,
|
|
download_url="https://example.com/old.apk",
|
|
publish_date="2026-07-01",
|
|
message="旧版本",
|
|
)
|
|
AppVersion.objects.create(
|
|
major=2,
|
|
minor=0,
|
|
build=200,
|
|
download_url="https://example.com/current.apk",
|
|
force=True,
|
|
publish_date="2026-07-08",
|
|
message="请更新到最新版本",
|
|
is_current=True,
|
|
)
|
|
|
|
response = self.client.get("/api/app-version/")
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertEqual(response.data["latest_version"], {"major": 2, "minor": 0, "build": 200})
|
|
self.assertEqual(response.data["download_url"], "https://example.com/current.apk")
|
|
self.assertEqual(response.data["force"], True)
|
|
self.assertEqual(response.data["publish_date"], "2026-07-08")
|
|
self.assertEqual(response.data["message"], "请更新到最新版本")
|
|
|
|
def test_app_version_api_returns_newest_model_version_when_no_current(self):
|
|
AppVersion.objects.create(
|
|
major=1,
|
|
minor=0,
|
|
build=100,
|
|
download_url="https://example.com/old.apk",
|
|
publish_date="2026-07-01",
|
|
)
|
|
AppVersion.objects.create(
|
|
major=1,
|
|
minor=1,
|
|
build=110,
|
|
download_url="https://example.com/new.apk",
|
|
publish_date="2026-07-02",
|
|
message="最新创建版本",
|
|
)
|
|
|
|
response = self.client.get("/api/app-version/")
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertEqual(response.data["latest_version"], {"major": 1, "minor": 1, "build": 110})
|
|
self.assertEqual(response.data["download_url"], "https://example.com/new.apk")
|
|
self.assertEqual(response.data["message"], "最新创建版本")
|
|
|
|
def test_app_version_current_flag_is_mutually_exclusive(self):
|
|
first = AppVersion.objects.create(
|
|
major=1,
|
|
minor=0,
|
|
build=100,
|
|
download_url="https://example.com/first.apk",
|
|
is_current=True,
|
|
)
|
|
second = AppVersion.objects.create(
|
|
major=2,
|
|
minor=0,
|
|
build=200,
|
|
download_url="https://example.com/second.apk",
|
|
is_current=True,
|
|
)
|
|
|
|
first.refresh_from_db()
|
|
second.refresh_from_db()
|
|
self.assertFalse(first.is_current)
|
|
self.assertTrue(second.is_current)
|
|
|
|
def test_package_file_does_not_override_download_url(self):
|
|
app_version = AppVersion.objects.create(
|
|
major=3,
|
|
minor=0,
|
|
build=300,
|
|
package_file="app_versions/broken-upload.apk",
|
|
download_url="https://example.com/manual-url.apk",
|
|
is_current=True,
|
|
)
|
|
|
|
response = self.client.get("/api/app-version/")
|
|
|
|
app_version.refresh_from_db()
|
|
self.assertEqual(app_version.download_url, "https://example.com/manual-url.apk")
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertEqual(response.data["download_url"], "https://example.com/manual-url.apk")
|
|
|
|
def test_package_file_sets_download_url_when_url_is_empty(self):
|
|
app_version = AppVersion.objects.create(
|
|
major=3,
|
|
minor=1,
|
|
build=310,
|
|
package_file="app_versions/uploaded.apk",
|
|
is_current=True,
|
|
)
|
|
|
|
response = self.client.get("/api/app-version/")
|
|
|
|
app_version.refresh_from_db()
|
|
self.assertTrue(app_version.download_url.endswith("/app_versions/uploaded.apk"))
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertEqual(response.data["download_url"], app_version.download_url)
|
|
|
|
def test_set_app_version_command_updates_cached_api_payload_with_defaults(self):
|
|
output = StringIO()
|
|
call_command(
|
|
"set_app_version",
|
|
"--major",
|
|
"2",
|
|
"--minor",
|
|
"5",
|
|
"--build",
|
|
"1001",
|
|
"--download-url",
|
|
"https://example.com/latest.apk",
|
|
stdout=output,
|
|
)
|
|
|
|
response = self.client.get("/api/app-version/")
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertEqual(response.data["latest_version"], {"major": 2, "minor": 5, "build": 1001})
|
|
self.assertEqual(response.data["download_url"], "https://example.com/latest.apk")
|
|
self.assertEqual(response.data["force"], False)
|
|
self.assertEqual(response.data["publish_date"], timezone.localdate().isoformat())
|
|
self.assertEqual(response.data["message"], "")
|
|
self.assertIn("'build': 1001", output.getvalue())
|
|
|
|
def test_set_app_version_command_accepts_force_and_publish_date(self):
|
|
output = StringIO()
|
|
call_command(
|
|
"set_app_version",
|
|
"--major",
|
|
"2",
|
|
"--minor",
|
|
"6",
|
|
"--build",
|
|
"1002",
|
|
"--download-url",
|
|
"https://example.com/force.apk",
|
|
"--force",
|
|
"--publish-date",
|
|
"2026-07-01",
|
|
"--message",
|
|
"强制升级说明",
|
|
stdout=output,
|
|
)
|
|
|
|
response = self.client.get("/api/app-version/")
|
|
|
|
self.assertEqual(response.status_code, 200)
|
|
self.assertEqual(response.data["latest_version"], {"major": 2, "minor": 6, "build": 1002})
|
|
self.assertEqual(response.data["download_url"], "https://example.com/force.apk")
|
|
self.assertEqual(response.data["force"], True)
|
|
self.assertEqual(response.data["publish_date"], "2026-07-01")
|
|
self.assertEqual(response.data["message"], "强制升级说明")
|