[CHORE] flake8 issues E402, E721 and F821 (#1874)

* F821: undefine name
disabled and logged webhook_listener for opennode and lnpay because they are obviously not working
* E402: module level import not at top of file
* E721 fixes, only popped up for python3.9 not 3.10
This commit is contained in:
dni ⚡ 2023-08-16 12:22:14 +02:00 committed by GitHub
parent 355806608b
commit f0a66e41fb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 108 additions and 112 deletions

View File

@ -3,8 +3,9 @@ max-line-length = 150
exclude = lnbits/wallets/lnd_grpc_files/, lnbits/extensions/ exclude = lnbits/wallets/lnd_grpc_files/, lnbits/extensions/
ignore = ignore =
# E203 whitespace before ':' black does not like it # E203 whitespace before ':' black does not like it
E203 E203,
# E402: module level import not at top of file # E402: module level import not at top of file
# needed for https://github.com/lnbits/lnbits/pull/1876
E402, E402,
# W503: line break before binary operator # W503: line break before binary operator
W503, W503,

View File

@ -468,7 +468,7 @@ async def api_payments_sse(
async def api_payment(payment_hash, X_Api_Key: Optional[str] = Header(None)): async def api_payment(payment_hash, X_Api_Key: Optional[str] = Header(None)):
# We use X_Api_Key here because we want this call to work with and without keys # We use X_Api_Key here because we want this call to work with and without keys
# If a valid key is given, we also return the field "details", otherwise not # If a valid key is given, we also return the field "details", otherwise not
wallet = await get_wallet_for_key(X_Api_Key) if type(X_Api_Key) == str else None # type: ignore wallet = await get_wallet_for_key(X_Api_Key) if isinstance(X_Api_Key, str) else None # type: ignore
# we have to specify the wallet id here, because postgres and sqlite return internal payments in different order # we have to specify the wallet id here, because postgres and sqlite return internal payments in different order
# and get_standalone_payment otherwise just fetches the first one, causing unpredictable results # and get_standalone_payment otherwise just fetches the first one, causing unpredictable results

View File

@ -462,7 +462,7 @@ class Filters(BaseModel, Generic[TFilterModel]):
if self.search and self.model: if self.search and self.model:
if DB_TYPE == POSTGRES: if DB_TYPE == POSTGRES:
where_stmts.append( where_stmts.append(
f"lower(concat({f', '.join(self.model.__search_fields__)})) LIKE ?" f"lower(concat({', '.join(self.model.__search_fields__)})) LIKE ?"
) )
elif DB_TYPE == SQLITE: elif DB_TYPE == SQLITE:
where_stmts.append( where_stmts.append(

View File

@ -1,17 +1,16 @@
import uvloop
from uvicorn.supervisors import ChangeReload
uvloop.install()
import multiprocessing as mp import multiprocessing as mp
import time import time
from pathlib import Path from pathlib import Path
import click import click
import uvicorn import uvicorn
import uvloop
from uvicorn.supervisors import ChangeReload
from lnbits.settings import set_cli_settings, settings from lnbits.settings import set_cli_settings, settings
uvloop.install()
@click.command( @click.command(
context_settings=dict( context_settings=dict(

View File

@ -26,7 +26,7 @@ def list_parse_fallback(v):
class LNbitsSettings(BaseSettings): class LNbitsSettings(BaseSettings):
@classmethod @classmethod
def validate(cls, val): def validate(cls, val):
if type(val) == str: if isinstance(val, str):
val = val.split(",") if val else [] val = val.split(",") if val else []
return val return val

View File

@ -46,8 +46,8 @@ class SseListenersDict(dict):
self.name = name or f"sse_listener_{str(uuid.uuid4())[:8]}" self.name = name or f"sse_listener_{str(uuid.uuid4())[:8]}"
def __setitem__(self, key, value): def __setitem__(self, key, value):
assert type(key) == str, f"{key} is not a string" assert isinstance(key, str), f"{key} is not a string"
assert type(value) == asyncio.Queue, f"{value} is not an asyncio.Queue" assert isinstance(value, asyncio.Queue), f"{value} is not an asyncio.Queue"
logger.trace(f"sse: adding listener {key} to {self.name}. len = {len(self)+1}") logger.trace(f"sse: adding listener {key} to {self.name}. len = {len(self)+1}")
return super().__setitem__(key, value) return super().__setitem__(key, value)

View File

@ -1,10 +1,3 @@
imports_ok = True
try:
import grpc
from grpc import RpcError
except ImportError: # pragma: nocover
imports_ok = False
import asyncio import asyncio
import base64 import base64
import hashlib import hashlib
@ -13,14 +6,6 @@ from typing import AsyncGenerator, Dict, Optional
from loguru import logger from loguru import logger
from .macaroon import AESCipher, load_macaroon
if imports_ok:
import lnbits.wallets.lnd_grpc_files.lightning_pb2 as ln
import lnbits.wallets.lnd_grpc_files.lightning_pb2_grpc as lnrpc
import lnbits.wallets.lnd_grpc_files.router_pb2 as router
import lnbits.wallets.lnd_grpc_files.router_pb2_grpc as routerrpc
from lnbits.settings import settings from lnbits.settings import settings
from .base import ( from .base import (
@ -30,6 +15,20 @@ from .base import (
StatusResponse, StatusResponse,
Wallet, Wallet,
) )
from .macaroon import AESCipher, load_macaroon
imports_ok = True
try:
import grpc
from grpc import RpcError
except ImportError: # pragma: nocover
imports_ok = False
if imports_ok:
import lnbits.wallets.lnd_grpc_files.lightning_pb2 as ln
import lnbits.wallets.lnd_grpc_files.lightning_pb2_grpc as lnrpc
import lnbits.wallets.lnd_grpc_files.router_pb2 as router
import lnbits.wallets.lnd_grpc_files.router_pb2_grpc as routerrpc
def get_ssl_context(cert_path: str): def get_ssl_context(cert_path: str):

View File

@ -1,11 +1,8 @@
import asyncio import asyncio
import hashlib import hashlib
import json
from http import HTTPStatus
from typing import AsyncGenerator, Dict, Optional from typing import AsyncGenerator, Dict, Optional
import httpx import httpx
from fastapi import HTTPException
from loguru import logger from loguru import logger
from lnbits.settings import settings from lnbits.settings import settings
@ -65,7 +62,7 @@ class LNPayWallet(Wallet):
memo: Optional[str] = None, memo: Optional[str] = None,
description_hash: Optional[bytes] = None, description_hash: Optional[bytes] = None,
unhashed_description: Optional[bytes] = None, unhashed_description: Optional[bytes] = None,
**kwargs, **_,
) -> InvoiceResponse: ) -> InvoiceResponse:
data: Dict = {"num_satoshis": f"{amount}"} data: Dict = {"num_satoshis": f"{amount}"}
if description_hash: if description_hash:
@ -139,25 +136,26 @@ class LNPayWallet(Wallet):
yield value yield value
async def webhook_listener(self): async def webhook_listener(self):
logger.error("LNPay webhook listener disabled.")
return
# TODO: request.get_data is undefined, was it something with Flask or quart? # TODO: request.get_data is undefined, was it something with Flask or quart?
# probably issue introduced when refactoring? # probably issue introduced when refactoring?
text: str = await request.get_data() # type: ignore # text: str = await request.get_data()
try: # try:
data = json.loads(text) # data = json.loads(text)
except json.decoder.JSONDecodeError: # except json.decoder.JSONDecodeError:
logger.error(f"got something wrong on lnpay webhook endpoint: {text[:200]}") # logger.error(f"error on lnpay webhook endpoint: {text[:200]}")
data = None # data = None
if ( # if (
type(data) is not dict # type(data) is not dict
or "event" not in data # or "event" not in data
or data["event"].get("name") != "wallet_receive" # or data["event"].get("name") != "wallet_receive"
): # ):
raise HTTPException(status_code=HTTPStatus.NO_CONTENT) # raise HTTPException(status_code=HTTPStatus.NO_CONTENT)
lntx_id = data["data"]["wtx"]["lnTx"]["id"] # lntx_id = data["data"]["wtx"]["lnTx"]["id"]
r = await self.client.get(f"/lntx/{lntx_id}?fields=settled") # r = await self.client.get(f"/lntx/{lntx_id}?fields=settled")
data = r.json() # data = r.json()
if data["settled"]: # if data["settled"]:
await self.queue.put(lntx_id) # await self.queue.put(lntx_id)
# raise HTTPException(status_code=HTTPStatus.NO_CONTENT)
raise HTTPException(status_code=HTTPStatus.NO_CONTENT)

View File

@ -52,7 +52,7 @@ class AESCipher:
return data + (chr(length) * length).encode() return data + (chr(length) * length).encode()
def unpad(self, data): def unpad(self, data):
return data[: -(data[-1] if type(data[-1]) == int else ord(data[-1]))] return data[: -(data[-1] if isinstance(data[-1], int) else ord(data[-1]))]
@property @property
def passphrase(self): def passphrase(self):

View File

@ -1,10 +1,7 @@
import asyncio import asyncio
import hmac
from http import HTTPStatus
from typing import AsyncGenerator, Optional from typing import AsyncGenerator, Optional
import httpx import httpx
from fastapi import HTTPException
from loguru import logger from loguru import logger
from lnbits.settings import settings from lnbits.settings import settings
@ -136,18 +133,20 @@ class OpenNodeWallet(Wallet):
yield value yield value
async def webhook_listener(self): async def webhook_listener(self):
logger.error("webhook listener for opennode is disabled.")
return
# TODO: request.form is undefined, was it something with Flask or quart? # TODO: request.form is undefined, was it something with Flask or quart?
# probably issue introduced when refactoring? # probably issue introduced when refactoring?
data = await request.form # type: ignore # data = await request.form # type: ignore
if "status" not in data or data["status"] != "paid": # if "status" not in data or data["status"] != "paid":
raise HTTPException(status_code=HTTPStatus.NO_CONTENT) # raise HTTPException(status_code=HTTPStatus.NO_CONTENT)
charge_id = data["id"] # charge_id = data["id"]
x = hmac.new(self.auth["Authorization"].encode("ascii"), digestmod="sha256") # x = hmac.new(self.auth["Authorization"].encode("ascii"), digestmod="sha256")
x.update(charge_id.encode("ascii")) # x.update(charge_id.encode("ascii"))
if x.hexdigest() != data["hashed_order"]: # if x.hexdigest() != data["hashed_order"]:
logger.error("invalid webhook, not from opennode") # logger.error("invalid webhook, not from opennode")
raise HTTPException(status_code=HTTPStatus.NO_CONTENT) # raise HTTPException(status_code=HTTPStatus.NO_CONTENT)
await self.queue.put(charge_id) # await self.queue.put(charge_id)
raise HTTPException(status_code=HTTPStatus.NO_CONTENT) # raise HTTPException(status_code=HTTPStatus.NO_CONTENT)

90
poetry.lock generated
View File

@ -543,13 +543,13 @@ dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "sphinx (<2)", "tox"]
[[package]] [[package]]
name = "dill" name = "dill"
version = "0.3.6" version = "0.3.7"
description = "serialize all of python" description = "serialize all of Python"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, {file = "dill-0.3.7-py3-none-any.whl", hash = "sha256:76b122c08ef4ce2eedcd4d1abd8e641114bfc6c2867f49f3c41facf65bf19f5e"},
{file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, {file = "dill-0.3.7.tar.gz", hash = "sha256:cc1c8b182eb3013e24bd475ff2e9295af86c1a38eb1aff128dac8962a9ce3c03"},
] ]
[package.extras] [package.extras]
@ -667,19 +667,19 @@ testing = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "diff-cover (>=7.5)", "p
[[package]] [[package]]
name = "flake8" name = "flake8"
version = "6.0.0" version = "6.1.0"
description = "the modular source code checker: pep8 pyflakes and co" description = "the modular source code checker: pep8 pyflakes and co"
optional = false optional = false
python-versions = ">=3.8.1" python-versions = ">=3.8.1"
files = [ files = [
{file = "flake8-6.0.0-py2.py3-none-any.whl", hash = "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7"}, {file = "flake8-6.1.0-py2.py3-none-any.whl", hash = "sha256:ffdfce58ea94c6580c77888a86506937f9a1a227dfcd15f245d694ae20a6b6e5"},
{file = "flake8-6.0.0.tar.gz", hash = "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181"}, {file = "flake8-6.1.0.tar.gz", hash = "sha256:d5b3857f07c030bdb5bf41c7f53799571d75c4491748a3adcd47de929e34cd23"},
] ]
[package.dependencies] [package.dependencies]
mccabe = ">=0.7.0,<0.8.0" mccabe = ">=0.7.0,<0.8.0"
pycodestyle = ">=2.10.0,<2.11.0" pycodestyle = ">=2.11.0,<2.12.0"
pyflakes = ">=3.0.0,<3.1.0" pyflakes = ">=3.1.0,<3.2.0"
[[package]] [[package]]
name = "grpcio" name = "grpcio"
@ -795,13 +795,13 @@ socks = ["socksio (==1.*)"]
[[package]] [[package]]
name = "identify" name = "identify"
version = "2.5.25" version = "2.5.26"
description = "File identification library for Python" description = "File identification library for Python"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "identify-2.5.25-py2.py3-none-any.whl", hash = "sha256:9df2489842707d431b38ce3410ef8df40da5b10a3e28a3fcac1a42523e956409"}, {file = "identify-2.5.26-py2.py3-none-any.whl", hash = "sha256:c22a8ead0d4ca11f1edd6c9418c3220669b3b7533ada0a0ffa6cc0ef85cf9b54"},
{file = "identify-2.5.25.tar.gz", hash = "sha256:db4de0e758c0db8f81996816cd2f3f2f8c5c8d49a7fd02f3b4109aac6fd80e29"}, {file = "identify-2.5.26.tar.gz", hash = "sha256:7243800bce2f58404ed41b7c002e53d4d22bcf3ae1b7900c2d7aefd95394bf7f"},
] ]
[package.extras] [package.extras]
@ -839,13 +839,13 @@ testing = ["flake8 (<5)", "flufl.flake8", "importlib-resources (>=1.3)", "packag
[[package]] [[package]]
name = "importlib-resources" name = "importlib-resources"
version = "6.0.0" version = "6.0.1"
description = "Read resources from Python packages" description = "Read resources from Python packages"
optional = false optional = false
python-versions = ">=3.8" python-versions = ">=3.8"
files = [ files = [
{file = "importlib_resources-6.0.0-py3-none-any.whl", hash = "sha256:d952faee11004c045f785bb5636e8f885bed30dc3c940d5d42798a2a4541c185"}, {file = "importlib_resources-6.0.1-py3-none-any.whl", hash = "sha256:134832a506243891221b88b4ae1213327eea96ceb4e407a00d790bb0626f45cf"},
{file = "importlib_resources-6.0.0.tar.gz", hash = "sha256:4cf94875a8368bd89531a756df9a9ebe1f150e0f885030b461237bc7f2d905f2"}, {file = "importlib_resources-6.0.1.tar.gz", hash = "sha256:4359457e42708462b9626a04657c6208ad799ceb41e5c58c57ffa0e6a098a5d4"},
] ]
[package.dependencies] [package.dependencies]
@ -1290,29 +1290,29 @@ files = [
[[package]] [[package]]
name = "pathspec" name = "pathspec"
version = "0.11.1" version = "0.11.2"
description = "Utility library for gitignore style pattern matching of file paths." description = "Utility library for gitignore style pattern matching of file paths."
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "pathspec-0.11.1-py3-none-any.whl", hash = "sha256:d8af70af76652554bd134c22b3e8a1cc46ed7d91edcdd721ef1a0c51a84a5293"}, {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"},
{file = "pathspec-0.11.1.tar.gz", hash = "sha256:2798de800fa92780e33acca925945e9a19a133b715067cf165b8866c15a31687"}, {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"},
] ]
[[package]] [[package]]
name = "platformdirs" name = "platformdirs"
version = "3.9.1" version = "3.10.0"
description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "platformdirs-3.9.1-py3-none-any.whl", hash = "sha256:ad8291ae0ae5072f66c16945166cb11c63394c7a3ad1b1bc9828ca3162da8c2f"}, {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"},
{file = "platformdirs-3.9.1.tar.gz", hash = "sha256:1b42b450ad933e981d56e59f1b97495428c9bd60698baab9f3eb3d00d5822421"}, {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"},
] ]
[package.extras] [package.extras]
docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-autodoc-typehints (>=1.23,!=1.23.4)"] docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"]
test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.3.1)", "pytest-cov (>=4.1)", "pytest-mock (>=3.10)"] test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"]
[[package]] [[package]]
name = "pluggy" name = "pluggy"
@ -1417,13 +1417,13 @@ files = [
[[package]] [[package]]
name = "pycodestyle" name = "pycodestyle"
version = "2.10.0" version = "2.11.0"
description = "Python style guide checker" description = "Python style guide checker"
optional = false optional = false
python-versions = ">=3.6" python-versions = ">=3.8"
files = [ files = [
{file = "pycodestyle-2.10.0-py2.py3-none-any.whl", hash = "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610"}, {file = "pycodestyle-2.11.0-py2.py3-none-any.whl", hash = "sha256:5d1013ba8dc7895b548be5afb05740ca82454fd899971563d2ef625d090326f8"},
{file = "pycodestyle-2.10.0.tar.gz", hash = "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053"}, {file = "pycodestyle-2.11.0.tar.gz", hash = "sha256:259bcc17857d8a8b3b4a2327324b79e5f020a13c16074670f9c8c8f872ea76d0"},
] ]
[[package]] [[package]]
@ -1526,28 +1526,28 @@ email = ["email-validator (>=1.0.3)"]
[[package]] [[package]]
name = "pyflakes" name = "pyflakes"
version = "3.0.1" version = "3.1.0"
description = "passive checker of Python programs" description = "passive checker of Python programs"
optional = false optional = false
python-versions = ">=3.6" python-versions = ">=3.8"
files = [ files = [
{file = "pyflakes-3.0.1-py2.py3-none-any.whl", hash = "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf"}, {file = "pyflakes-3.1.0-py2.py3-none-any.whl", hash = "sha256:4132f6d49cb4dae6819e5379898f2b8cce3c5f23994194c24b77d5da2e36f774"},
{file = "pyflakes-3.0.1.tar.gz", hash = "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd"}, {file = "pyflakes-3.1.0.tar.gz", hash = "sha256:a0aae034c444db0071aa077972ba4768d40c830d9539fd45bf4cd3f8f6992efc"},
] ]
[[package]] [[package]]
name = "pylint" name = "pylint"
version = "2.17.4" version = "2.17.5"
description = "python code static checker" description = "python code static checker"
optional = false optional = false
python-versions = ">=3.7.2" python-versions = ">=3.7.2"
files = [ files = [
{file = "pylint-2.17.4-py3-none-any.whl", hash = "sha256:7a1145fb08c251bdb5cca11739722ce64a63db479283d10ce718b2460e54123c"}, {file = "pylint-2.17.5-py3-none-any.whl", hash = "sha256:73995fb8216d3bed149c8d51bba25b2c52a8251a2c8ac846ec668ce38fab5413"},
{file = "pylint-2.17.4.tar.gz", hash = "sha256:5dcf1d9e19f41f38e4e85d10f511e5b9c35e1aa74251bf95cdd8cb23584e2db1"}, {file = "pylint-2.17.5.tar.gz", hash = "sha256:f7b601cbc06fef7e62a754e2b41294c2aa31f1cb659624b9a85bcba29eaf8252"},
] ]
[package.dependencies] [package.dependencies]
astroid = ">=2.15.4,<=2.17.0-dev0" astroid = ">=2.15.6,<=2.17.0-dev0"
colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""}
dill = [ dill = [
{version = ">=0.2", markers = "python_version < \"3.11\""}, {version = ">=0.2", markers = "python_version < \"3.11\""},
@ -2089,13 +2089,13 @@ files = [
[[package]] [[package]]
name = "tomlkit" name = "tomlkit"
version = "0.11.8" version = "0.12.1"
description = "Style preserving TOML library" description = "Style preserving TOML library"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "tomlkit-0.11.8-py3-none-any.whl", hash = "sha256:8c726c4c202bdb148667835f68d68780b9a003a9ec34167b6c673b38eff2a171"}, {file = "tomlkit-0.12.1-py3-none-any.whl", hash = "sha256:712cbd236609acc6a3e2e97253dfc52d4c2082982a88f61b640ecf0817eab899"},
{file = "tomlkit-0.11.8.tar.gz", hash = "sha256:9330fc7faa1db67b541b28e62018c17d20be733177d290a13b24c62d1614e0c3"}, {file = "tomlkit-0.12.1.tar.gz", hash = "sha256:38e1ff8edb991273ec9f6181244a6a391ac30e9f5098e7535640ea6be97a7c86"},
] ]
[[package]] [[package]]
@ -2197,23 +2197,23 @@ test = ["aiohttp", "flake8 (>=3.9.2,<3.10.0)", "mypy (>=0.800)", "psutil", "pyOp
[[package]] [[package]]
name = "virtualenv" name = "virtualenv"
version = "20.24.1" version = "20.24.2"
description = "Virtual Python Environment builder" description = "Virtual Python Environment builder"
optional = false optional = false
python-versions = ">=3.7" python-versions = ">=3.7"
files = [ files = [
{file = "virtualenv-20.24.1-py3-none-any.whl", hash = "sha256:01aacf8decd346cf9a865ae85c0cdc7f64c8caa07ff0d8b1dfc1733d10677442"}, {file = "virtualenv-20.24.2-py3-none-any.whl", hash = "sha256:43a3052be36080548bdee0b42919c88072037d50d56c28bd3f853cbe92b953ff"},
{file = "virtualenv-20.24.1.tar.gz", hash = "sha256:2ef6a237c31629da6442b0bcaa3999748108c7166318d1f55cc9f8d7294e97bd"}, {file = "virtualenv-20.24.2.tar.gz", hash = "sha256:fd8a78f46f6b99a67b7ec5cf73f92357891a7b3a40fd97637c27f854aae3b9e0"},
] ]
[package.dependencies] [package.dependencies]
distlib = ">=0.3.6,<1" distlib = ">=0.3.7,<1"
filelock = ">=3.12,<4" filelock = ">=3.12.2,<4"
platformdirs = ">=3.5.1,<4" platformdirs = ">=3.9.1,<4"
[package.extras] [package.extras]
docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] docs = ["furo (>=2023.5.20)", "proselint (>=0.13)", "sphinx (>=7.0.1)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"]
test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.3.1)", "pytest-env (>=0.8.1)", "pytest-freezer (>=0.4.6)", "pytest-mock (>=3.10)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=67.8)", "time-machine (>=2.9)"] test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"]
[[package]] [[package]]
name = "websocket-client" name = "websocket-client"

View File

@ -9,4 +9,4 @@ from lnbits.db import POSTGRES
async def test_date_conversion(db): async def test_date_conversion(db):
if db.type == POSTGRES: if db.type == POSTGRES:
row = await db.fetchone("SELECT now()::date") row = await db.fetchone("SELECT now()::date")
assert row and type(row[0]) == date assert row and isinstance(row[0], date)

View File

@ -285,7 +285,7 @@ async def test_decode_invoice(client, invoice):
async def test_api_payment_without_key(invoice): async def test_api_payment_without_key(invoice):
# check the payment status # check the payment status
response = await api_payment(invoice["payment_hash"]) response = await api_payment(invoice["payment_hash"])
assert type(response) == dict assert isinstance(response, dict)
assert response["paid"] is True assert response["paid"] is True
# no key, that's why no "details" # no key, that's why no "details"
assert "details" not in response assert "details" not in response
@ -298,7 +298,7 @@ async def test_api_payment_with_key(invoice, inkey_headers_from):
response = await api_payment( response = await api_payment(
invoice["payment_hash"], inkey_headers_from["X-Api-Key"] invoice["payment_hash"], inkey_headers_from["X-Api-Key"]
) )
assert type(response) == dict assert isinstance(response, dict)
assert response["paid"] is True assert response["paid"] is True
assert "details" in response assert "details" in response