561 lines
23 KiB
Python
561 lines
23 KiB
Python
|
# The Mia! Accounting Flask Project.
|
||
|
# Author: imacat@mail.imacat.idv.tw (imacat), 2023/2/1
|
||
|
|
||
|
# Copyright (c) 2023 imacat.
|
||
|
#
|
||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
# you may not use this file except in compliance with the License.
|
||
|
# You may obtain a copy of the License at
|
||
|
#
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
#
|
||
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
# See the License for the specific language governing permissions and
|
||
|
# limitations under the License.
|
||
|
"""The test for the currency management.
|
||
|
|
||
|
"""
|
||
|
import time
|
||
|
import unittest
|
||
|
|
||
|
import httpx
|
||
|
from click.testing import Result
|
||
|
from flask import Flask
|
||
|
from flask.testing import FlaskCliRunner
|
||
|
|
||
|
from test_site import create_app
|
||
|
from testlib import get_client, set_locale
|
||
|
|
||
|
|
||
|
class CurrencyCommandTestCase(unittest.TestCase):
|
||
|
"""The account console command test case."""
|
||
|
|
||
|
def setUp(self) -> None:
|
||
|
"""Sets up the test.
|
||
|
This is run once per test.
|
||
|
|
||
|
:return: None.
|
||
|
"""
|
||
|
self.app: Flask = create_app(is_testing=True)
|
||
|
|
||
|
runner: FlaskCliRunner = self.app.test_cli_runner()
|
||
|
with self.app.app_context():
|
||
|
from accounting.database import db
|
||
|
from accounting.models import Currency, CurrencyL10n
|
||
|
result: Result
|
||
|
result = runner.invoke(args="init-db")
|
||
|
self.assertEqual(result.exit_code, 0)
|
||
|
CurrencyL10n.query.delete()
|
||
|
Currency.query.delete()
|
||
|
db.session.commit()
|
||
|
|
||
|
def test_init(self) -> None:
|
||
|
"""Tests the "accounting-init-currencies" console command.
|
||
|
|
||
|
:return: None.
|
||
|
"""
|
||
|
from accounting.models import Currency, CurrencyL10n
|
||
|
runner: FlaskCliRunner = self.app.test_cli_runner()
|
||
|
with self.app.app_context():
|
||
|
result: Result = runner.invoke(
|
||
|
args=["accounting-init-currencies", "-u", "editor"])
|
||
|
self.assertEqual(result.exit_code, 0)
|
||
|
currencies: list[Currency] = Currency.query.all()
|
||
|
l10n: list[CurrencyL10n] = CurrencyL10n.query.all()
|
||
|
self.assertEqual(len(currencies), 2)
|
||
|
self.assertEqual(len(l10n), 2 * 2)
|
||
|
l10n_keys: set[str] = {f"{x.currency_code}-{x.locale}" for x in l10n}
|
||
|
for currency in currencies:
|
||
|
self.assertIn(f"{currency.code}-zh_Hant", l10n_keys)
|
||
|
self.assertIn(f"{currency.code}-zh_Hant", l10n_keys)
|
||
|
|
||
|
|
||
|
class CurrencyTestCase(unittest.TestCase):
|
||
|
"""The currency test case."""
|
||
|
|
||
|
def setUp(self) -> None:
|
||
|
"""Sets up the test.
|
||
|
This is run once per test.
|
||
|
|
||
|
:return: None.
|
||
|
"""
|
||
|
self.app: Flask = create_app(is_testing=True)
|
||
|
|
||
|
runner: FlaskCliRunner = self.app.test_cli_runner()
|
||
|
with self.app.app_context():
|
||
|
from accounting.database import db
|
||
|
from accounting.models import Currency, CurrencyL10n
|
||
|
result: Result
|
||
|
result = runner.invoke(args="init-db")
|
||
|
self.assertEqual(result.exit_code, 0)
|
||
|
CurrencyL10n.query.delete()
|
||
|
Currency.query.delete()
|
||
|
db.session.commit()
|
||
|
|
||
|
self.client, self.csrf_token = get_client(self, self.app, "editor")
|
||
|
response: httpx.Response
|
||
|
|
||
|
response = self.client.post("/accounting/currencies/store",
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": "ZZA",
|
||
|
"name": "Testing Dollar #A"})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"],
|
||
|
"/accounting/currencies/ZZA")
|
||
|
|
||
|
response = self.client.post("/accounting/currencies/store",
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": "ZZB",
|
||
|
"name": "Testing Dollar #B"})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"],
|
||
|
"/accounting/currencies/ZZB")
|
||
|
|
||
|
def test_nobody(self) -> None:
|
||
|
"""Test the permission as nobody.
|
||
|
|
||
|
:return: None.
|
||
|
"""
|
||
|
client, csrf_token = get_client(self, self.app, "nobody")
|
||
|
response: httpx.Response
|
||
|
|
||
|
response = client.get("/accounting/currencies")
|
||
|
self.assertEqual(response.status_code, 403)
|
||
|
|
||
|
response = client.get("/accounting/currencies/ZZA")
|
||
|
self.assertEqual(response.status_code, 403)
|
||
|
|
||
|
response = client.get("/accounting/currencies/create")
|
||
|
self.assertEqual(response.status_code, 403)
|
||
|
|
||
|
response = client.post("/accounting/currencies/store",
|
||
|
data={"csrf_token": csrf_token,
|
||
|
"code": "ZZC",
|
||
|
"name": "Testing Dollar #C"})
|
||
|
self.assertEqual(response.status_code, 403)
|
||
|
|
||
|
response = client.get("/accounting/currencies/ZZA/edit")
|
||
|
self.assertEqual(response.status_code, 403)
|
||
|
|
||
|
response = client.post("/accounting/currencies/ZZA/update",
|
||
|
data={"csrf_token": csrf_token,
|
||
|
"code": "ZZD",
|
||
|
"name": "Testing Dollar #D"})
|
||
|
self.assertEqual(response.status_code, 403)
|
||
|
|
||
|
response = client.post("/accounting/currencies/ZZB/delete",
|
||
|
data={"csrf_token": csrf_token})
|
||
|
self.assertEqual(response.status_code, 403)
|
||
|
|
||
|
def test_viewer(self) -> None:
|
||
|
"""Test the permission as viewer.
|
||
|
|
||
|
:return: None.
|
||
|
"""
|
||
|
client, csrf_token = get_client(self, self.app, "viewer")
|
||
|
response: httpx.Response
|
||
|
|
||
|
response = client.get("/accounting/currencies")
|
||
|
self.assertEqual(response.status_code, 200)
|
||
|
|
||
|
response = client.get("/accounting/currencies/ZZA")
|
||
|
self.assertEqual(response.status_code, 200)
|
||
|
|
||
|
response = client.get("/accounting/currencies/create")
|
||
|
self.assertEqual(response.status_code, 403)
|
||
|
|
||
|
response = client.post("/accounting/currencies/store",
|
||
|
data={"csrf_token": csrf_token,
|
||
|
"code": "ZZC",
|
||
|
"name": "Testing Dollar #C"})
|
||
|
self.assertEqual(response.status_code, 403)
|
||
|
|
||
|
response = client.get("/accounting/currencies/ZZA/edit")
|
||
|
self.assertEqual(response.status_code, 403)
|
||
|
|
||
|
response = client.post("/accounting/currencies/ZZA/update",
|
||
|
data={"csrf_token": csrf_token,
|
||
|
"code": "ZZD",
|
||
|
"name": "Testing Dollar #D"})
|
||
|
self.assertEqual(response.status_code, 403)
|
||
|
|
||
|
response = client.post("/accounting/currencies/ZZB/delete",
|
||
|
data={"csrf_token": csrf_token})
|
||
|
self.assertEqual(response.status_code, 403)
|
||
|
|
||
|
def test_editor(self) -> None:
|
||
|
"""Test the permission as editor.
|
||
|
|
||
|
:return: None.
|
||
|
"""
|
||
|
response: httpx.Response
|
||
|
|
||
|
response = self.client.get("/accounting/currencies")
|
||
|
self.assertEqual(response.status_code, 200)
|
||
|
|
||
|
response = self.client.get("/accounting/currencies/ZZA")
|
||
|
self.assertEqual(response.status_code, 200)
|
||
|
|
||
|
response = self.client.get("/accounting/currencies/create")
|
||
|
self.assertEqual(response.status_code, 200)
|
||
|
|
||
|
response = self.client.post("/accounting/currencies/store",
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": "ZZC",
|
||
|
"name": "Testing Dollar #C"})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"],
|
||
|
"/accounting/currencies/ZZC")
|
||
|
|
||
|
response = self.client.get("/accounting/currencies/ZZA/edit")
|
||
|
self.assertEqual(response.status_code, 200)
|
||
|
|
||
|
response = self.client.post("/accounting/currencies/ZZA/update",
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": "ZZD",
|
||
|
"name": "Testing Dollar #D"})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"],
|
||
|
"/accounting/currencies/ZZD")
|
||
|
|
||
|
response = self.client.post("/accounting/currencies/ZZB/delete",
|
||
|
data={"csrf_token": self.csrf_token})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"],
|
||
|
"/accounting/currencies")
|
||
|
|
||
|
def test_add(self) -> None:
|
||
|
"""Tests to add the currencies.
|
||
|
|
||
|
:return: None.
|
||
|
"""
|
||
|
from accounting.models import Currency
|
||
|
from test_site import db
|
||
|
zzc_code, zzc_name = "ZZC", "Testing Dollar #C"
|
||
|
create_uri: str = "/accounting/currencies/create"
|
||
|
store_uri: str = "/accounting/currencies/store"
|
||
|
response: httpx.Response
|
||
|
|
||
|
with self.app.app_context():
|
||
|
self.assertEqual({x.code for x in Currency.query.all()},
|
||
|
{"ZZA", "ZZB"})
|
||
|
|
||
|
# Missing CSRF token
|
||
|
response = self.client.post(store_uri,
|
||
|
data={"code": zzc_code,
|
||
|
"name": zzc_name})
|
||
|
self.assertEqual(response.status_code, 400)
|
||
|
|
||
|
# CSRF token mismatch
|
||
|
response = self.client.post(store_uri,
|
||
|
data={"csrf_token": f"{self.csrf_token}-2",
|
||
|
"code": zzc_code,
|
||
|
"name": zzc_name})
|
||
|
self.assertEqual(response.status_code, 400)
|
||
|
|
||
|
# Empty code
|
||
|
response = self.client.post(store_uri,
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": " ",
|
||
|
"name": zzc_name})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"], create_uri)
|
||
|
|
||
|
# Blocked code, with spaces to be stripped
|
||
|
response = self.client.post(store_uri,
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": " create ",
|
||
|
"name": zzc_name})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"], create_uri)
|
||
|
|
||
|
# Bad code
|
||
|
response = self.client.post(store_uri,
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": " zzc ",
|
||
|
"name": zzc_name})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"], create_uri)
|
||
|
|
||
|
# Empty name
|
||
|
response = self.client.post(store_uri,
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": zzc_code,
|
||
|
"name": " "})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"], create_uri)
|
||
|
|
||
|
# Success, with spaces to be stripped
|
||
|
response = self.client.post(store_uri,
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": f" {zzc_code} ",
|
||
|
"name": f" {zzc_name} "})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"],
|
||
|
f"/accounting/currencies/{zzc_code}")
|
||
|
|
||
|
# Duplicated code
|
||
|
response = self.client.post(store_uri,
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": zzc_code,
|
||
|
"name": zzc_name})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"], create_uri)
|
||
|
|
||
|
with self.app.app_context():
|
||
|
self.assertEqual({x.code for x in Currency.query.all()},
|
||
|
{"ZZA", "ZZB", zzc_code})
|
||
|
|
||
|
zzc: Currency = db.session.get(Currency, zzc_code)
|
||
|
self.assertEqual(zzc.code, zzc_code)
|
||
|
self.assertEqual(zzc.name_l10n, zzc_name)
|
||
|
|
||
|
def test_basic_update(self) -> None:
|
||
|
"""Tests the basic rules to update a user.
|
||
|
|
||
|
:return: None.
|
||
|
"""
|
||
|
from accounting.models import Currency
|
||
|
from test_site import db
|
||
|
zza_code: str = "ZZA"
|
||
|
zzc_code, zzc_name = "ZZC", "Testing Dollar #C"
|
||
|
edit_uri: str = f"/accounting/currencies/{zza_code}/edit"
|
||
|
update_uri: str = f"/accounting/currencies/{zza_code}/update"
|
||
|
response: httpx.Response
|
||
|
|
||
|
# Success, with spaces to be stripped
|
||
|
response = self.client.post(update_uri,
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": f" {zza_code} ",
|
||
|
"name": f" {zzc_name} "})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"],
|
||
|
f"/accounting/currencies/{zza_code}")
|
||
|
|
||
|
with self.app.app_context():
|
||
|
zza: Currency = db.session.get(Currency, zza_code)
|
||
|
self.assertEqual(zza.code, zza_code)
|
||
|
self.assertEqual(zza.name_l10n, zzc_name)
|
||
|
|
||
|
# Empty code
|
||
|
response = self.client.post(update_uri,
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": " ",
|
||
|
"name": zzc_name})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"], edit_uri)
|
||
|
|
||
|
# Blocked code, with spaces to be stripped
|
||
|
response = self.client.post(update_uri,
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": " create ",
|
||
|
"name": zzc_name})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"], edit_uri)
|
||
|
|
||
|
# Bad code
|
||
|
response = self.client.post(update_uri,
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": "abc/def",
|
||
|
"name": zzc_name})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"], edit_uri)
|
||
|
|
||
|
# Empty name
|
||
|
response = self.client.post(update_uri,
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": zzc_code,
|
||
|
"name": " "})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"], edit_uri)
|
||
|
|
||
|
# Duplicated code
|
||
|
response = self.client.post(update_uri,
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": "ZZB",
|
||
|
"name": zzc_name})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"], edit_uri)
|
||
|
|
||
|
# Change code
|
||
|
response = self.client.post(update_uri,
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": zzc_code,
|
||
|
"name": zzc_name})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"],
|
||
|
f"/accounting/currencies/{zzc_code}")
|
||
|
|
||
|
response = self.client.get(f"/accounting/currencies/{zza_code}")
|
||
|
self.assertEqual(response.status_code, 404)
|
||
|
|
||
|
response = self.client.get(f"/accounting/currencies/{zzc_code}")
|
||
|
self.assertEqual(response.status_code, 200)
|
||
|
|
||
|
def test_update_not_modified(self) -> None:
|
||
|
"""Tests that the data is not modified.
|
||
|
|
||
|
:return: None.
|
||
|
"""
|
||
|
from accounting.models import Currency
|
||
|
from test_site import db
|
||
|
zza_code, zza_name = "ZZA", "Testing Dollar #A"
|
||
|
detail_uri: str = f"/accounting/currencies/{zza_code}"
|
||
|
update_uri: str = f"/accounting/currencies/{zza_code}/update"
|
||
|
response: httpx.Response
|
||
|
time.sleep(1)
|
||
|
|
||
|
response = self.client.post(update_uri,
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": f" {zza_code} ",
|
||
|
"name": f" {zza_name} "})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"], detail_uri)
|
||
|
|
||
|
with self.app.app_context():
|
||
|
zza: Currency = db.session.get(Currency, zza_code)
|
||
|
self.assertIsNotNone(zza)
|
||
|
self.assertEqual(zza.created_at, zza.updated_at)
|
||
|
|
||
|
response = self.client.post(update_uri,
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": zza_code,
|
||
|
"name": "Testing Dollar #C"})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"], detail_uri)
|
||
|
|
||
|
with self.app.app_context():
|
||
|
zza: Currency = db.session.get(Currency, zza_code)
|
||
|
self.assertIsNotNone(zza)
|
||
|
self.assertNotEqual(zza.created_at, zza.updated_at)
|
||
|
|
||
|
def test_created_updated_by(self) -> None:
|
||
|
"""Tests the created-by and updated-by record.
|
||
|
|
||
|
:return: None.
|
||
|
"""
|
||
|
from accounting.models import Currency
|
||
|
from test_site import db
|
||
|
zza_code, zza_name = "ZZA", "Testing Dollar #A"
|
||
|
editor_username, editor2_username = "editor", "editor2"
|
||
|
client, csrf_token = get_client(self, self.app, editor2_username)
|
||
|
response: httpx.Response
|
||
|
|
||
|
with self.app.app_context():
|
||
|
currency: Currency = db.session.get(Currency, zza_code)
|
||
|
self.assertEqual(currency.created_by.username, editor_username)
|
||
|
self.assertEqual(currency.updated_by.username, editor_username)
|
||
|
|
||
|
response = client.post(f"/accounting/currencies/{zza_code}/update",
|
||
|
data={"csrf_token": csrf_token,
|
||
|
"code": zza_code,
|
||
|
"name": f"{zza_name}-2"})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"],
|
||
|
f"/accounting/currencies/{zza_code}")
|
||
|
|
||
|
with self.app.app_context():
|
||
|
currency: Currency = db.session.get(Currency, zza_code)
|
||
|
self.assertEqual(currency.created_by.username, editor_username)
|
||
|
self.assertEqual(currency.updated_by.username, editor2_username)
|
||
|
|
||
|
def test_l10n(self) -> None:
|
||
|
"""Tests the localization.
|
||
|
|
||
|
:return: None
|
||
|
"""
|
||
|
from accounting.models import Currency
|
||
|
from test_site import db
|
||
|
zza_code, zza_name = "ZZA", "Testing Dollar #A"
|
||
|
|
||
|
with self.app.app_context():
|
||
|
zza: Currency = db.session.get(Currency, zza_code)
|
||
|
self.assertEqual(zza.name_l10n, zza_name)
|
||
|
self.assertEqual(zza.l10n, [])
|
||
|
|
||
|
set_locale(self, self.client, self.csrf_token, "zh_Hant")
|
||
|
|
||
|
response = self.client.post(
|
||
|
f"/accounting/currencies/{zza_code}/update",
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": zza_code,
|
||
|
"name": f"{zza_name}-zh_Hant"})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"],
|
||
|
f"/accounting/currencies/{zza_code}")
|
||
|
|
||
|
with self.app.app_context():
|
||
|
zza: Currency = db.session.get(Currency, zza_code)
|
||
|
self.assertEqual(zza.name_l10n, zza_name)
|
||
|
self.assertEqual({(x.locale, x.name) for x in zza.l10n},
|
||
|
{("zh_Hant", f"{zza_name}-zh_Hant")})
|
||
|
|
||
|
set_locale(self, self.client, self.csrf_token, "en")
|
||
|
|
||
|
response = self.client.post(
|
||
|
f"/accounting/currencies/{zza_code}/update",
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": zza_code,
|
||
|
"name": f"{zza_name}-2"})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"],
|
||
|
f"/accounting/currencies/{zza_code}")
|
||
|
|
||
|
with self.app.app_context():
|
||
|
zza: Currency = db.session.get(Currency, zza_code)
|
||
|
self.assertEqual(zza.name_l10n, f"{zza_name}-2")
|
||
|
self.assertEqual({(x.locale, x.name) for x in zza.l10n},
|
||
|
{("zh_Hant", f"{zza_name}-zh_Hant")})
|
||
|
|
||
|
set_locale(self, self.client, self.csrf_token, "zh_Hant")
|
||
|
|
||
|
response = self.client.post(
|
||
|
f"/accounting/currencies/{zza_code}/update",
|
||
|
data={"csrf_token": self.csrf_token,
|
||
|
"code": zza_code,
|
||
|
"name": f"{zza_name}-zh_Hant-2"})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"],
|
||
|
f"/accounting/currencies/{zza_code}")
|
||
|
|
||
|
with self.app.app_context():
|
||
|
zza: Currency = db.session.get(Currency, zza_code)
|
||
|
self.assertEqual(zza.name_l10n, f"{zza_name}-2")
|
||
|
self.assertEqual({(x.locale, x.name) for x in zza.l10n},
|
||
|
{("zh_Hant", f"{zza_name}-zh_Hant-2")})
|
||
|
|
||
|
def test_delete(self) -> None:
|
||
|
"""Tests to delete a currency.
|
||
|
|
||
|
:return: None.
|
||
|
"""
|
||
|
from accounting.models import Currency
|
||
|
zza_code, zzb_code = "ZZA", "ZZB"
|
||
|
response: httpx.Response
|
||
|
|
||
|
with self.app.app_context():
|
||
|
self.assertEqual({x.code for x in Currency.query.all()},
|
||
|
{zza_code, zzb_code})
|
||
|
|
||
|
response = self.client.get(f"/accounting/currencies/{zza_code}")
|
||
|
self.assertEqual(response.status_code, 200)
|
||
|
response = self.client.post(
|
||
|
f"/accounting/currencies/{zza_code}/delete",
|
||
|
data={"csrf_token": self.csrf_token})
|
||
|
self.assertEqual(response.status_code, 302)
|
||
|
self.assertEqual(response.headers["Location"],
|
||
|
"/accounting/currencies")
|
||
|
|
||
|
with self.app.app_context():
|
||
|
self.assertEqual({x.code for x in Currency.query.all()},
|
||
|
{zzb_code})
|
||
|
|
||
|
response = self.client.get(f"/accounting/currencies/{zza_code}")
|
||
|
self.assertEqual(response.status_code, 404)
|
||
|
response = self.client.post(
|
||
|
f"/accounting/currencies/{zza_code}/delete",
|
||
|
data={"csrf_token": self.csrf_token})
|
||
|
self.assertEqual(response.status_code, 404)
|