lnbits/tests/extensions/invoices/test_invoices_api.py
Lee Salminen c32ff1de59
New Extension: Invoicing (#733)
* initial commit

* add docs

* black & prettier

* mobile styles

* add print view

* prettier

* make format

* initial migrations un-messed

* make migrations work for sqlite

* add invoices table

* clean migrations

* add migration to conv

* fix card size

* hopefully fix test migration

* add missing status

* timestamp

* init testing

* remove draft invoice by default on create

* what should i test

* make format

* raise if not invoice

* new test and renaming

* fix issue reported by @talvasconcelos which prevented users from setting status on creation

* readme

* run black

* trying to make tests work

* make it work again

* send paid amount

* partial pay flow

* good coding

* can't get these test to work

* clean up and commenting

* make format

* validation for 2 decimals

Co-authored-by: ben <ben@arc.wales>
Co-authored-by: Tiago vasconcelos <talvasconcelos@gmail.com>
2022-08-13 21:37:44 +02:00

136 lines
4.1 KiB
Python

import pytest
import pytest_asyncio
from loguru import logger
from lnbits.core.crud import get_wallet
from tests.conftest import adminkey_headers_from, client, invoice
from tests.extensions.invoices.conftest import accounting_invoice, invoices_wallet
from tests.helpers import credit_wallet
from tests.mocks import WALLET
@pytest.mark.asyncio
async def test_invoices_unknown_invoice(client):
response = await client.get("/invoices/pay/u")
assert response.json() == {"detail": "Invoice does not exist."}
@pytest.mark.asyncio
async def test_invoices_api_create_invoice_valid(client, invoices_wallet):
query = {
"status": "open",
"currency": "EUR",
"company_name": "LNBits, Inc.",
"first_name": "Ben",
"last_name": "Arc",
"email": "ben@legend.arc",
"items": [
{"amount": 2.34, "description": "Item 1"},
{"amount": 0.98, "description": "Item 2"},
],
}
status = query["status"]
currency = query["currency"]
fname = query["first_name"]
total = sum(d["amount"] for d in query["items"])
response = await client.post(
"/invoices/api/v1/invoice",
json=query,
headers={"X-Api-Key": invoices_wallet.inkey},
)
assert response.status_code == 201
data = response.json()
assert data["status"] == status
assert data["wallet"] == invoices_wallet.id
assert data["currency"] == currency
assert data["first_name"] == fname
assert sum(d["amount"] / 100 for d in data["items"]) == total
@pytest.mark.asyncio
async def test_invoices_api_partial_pay_invoice(
client, accounting_invoice, adminkey_headers_from
):
invoice_id = accounting_invoice["id"]
amount_to_pay = int(5.05 * 100) # mock invoice total amount is 10 USD
# ask for an invoice
response = await client.post(
f"/invoices/api/v1/invoice/{invoice_id}/payments?famount={amount_to_pay}"
)
assert response.status_code < 300
data = response.json()
payment_hash = data["payment_hash"]
# pay the invoice
data = {"out": True, "bolt11": data["payment_request"]}
response = await client.post(
"/api/v1/payments", json=data, headers=adminkey_headers_from
)
assert response.status_code < 300
assert len(response.json()["payment_hash"]) == 64
assert len(response.json()["checking_id"]) > 0
# check invoice is paid
response = await client.get(
f"/invoices/api/v1/invoice/{invoice_id}/payments/{payment_hash}"
)
assert response.status_code == 200
assert response.json()["paid"] == True
# check invoice status
response = await client.get(f"/invoices/api/v1/invoice/{invoice_id}")
assert response.status_code == 200
data = response.json()
assert data["status"] == "open"
####
#
# TEST FAILS FOR NOW, AS LISTENERS ARE NOT WORKING ON TESTING
#
###
# @pytest.mark.asyncio
# async def test_invoices_api_full_pay_invoice(client, accounting_invoice, adminkey_headers_to):
# invoice_id = accounting_invoice["id"]
# print(accounting_invoice["id"])
# amount_to_pay = int(10.20 * 100)
# # ask for an invoice
# response = await client.post(
# f"/invoices/api/v1/invoice/{invoice_id}/payments?famount={amount_to_pay}"
# )
# assert response.status_code == 201
# data = response.json()
# payment_hash = data["payment_hash"]
# # pay the invoice
# data = {"out": True, "bolt11": data["payment_request"]}
# response = await client.post(
# "/api/v1/payments", json=data, headers=adminkey_headers_to
# )
# assert response.status_code < 300
# assert len(response.json()["payment_hash"]) == 64
# assert len(response.json()["checking_id"]) > 0
# # check invoice is paid
# response = await client.get(
# f"/invoices/api/v1/invoice/{invoice_id}/payments/{payment_hash}"
# )
# assert response.status_code == 200
# assert response.json()["paid"] == True
# # check invoice status
# response = await client.get(f"/invoices/api/v1/invoice/{invoice_id}")
# assert response.status_code == 200
# data = response.json()
# print(data)
# assert data["status"] == "paid"