178 lines
5.6 KiB
Python
178 lines
5.6 KiB
Python
from __future__ import annotations
|
|
|
|
from backend import auth, notes
|
|
|
|
|
|
def test_is_lan():
|
|
assert auth.is_lan("192.168.1.23") is True
|
|
assert auth.is_lan("192.168.2.1") is False
|
|
assert auth.is_lan("8.8.8.8") is False
|
|
assert auth.is_lan(None) is False
|
|
assert auth.is_lan("not-an-ip") is False
|
|
|
|
|
|
def test_extract_tags():
|
|
tags = notes.extract_tags("Made a great soup today #recipe #dinner #recipe")
|
|
assert tags == ["recipe", "dinner"]
|
|
|
|
|
|
def test_extract_title_heading():
|
|
assert notes.extract_title("# My Note\n\nbody") == "My Note"
|
|
|
|
|
|
def test_extract_title_first_line():
|
|
assert notes.extract_title("Just a first line\nmore text") == "Just a first line"
|
|
|
|
|
|
def test_extract_title_untitled():
|
|
assert notes.extract_title(" \n\n") == "Untitled"
|
|
|
|
|
|
async def test_users_seeded(client):
|
|
r = await client.get("/api/users")
|
|
assert r.status_code == 200
|
|
names = [u["name"] for u in r.json()]
|
|
assert "schmeeve" in names
|
|
assert "ilya" in names
|
|
assert "common" in names
|
|
|
|
|
|
async def test_create_note_in_common_space(client):
|
|
r = await client.post("/api/notes", json={"body": "shared note", "username": "common"})
|
|
assert r.status_code == 200
|
|
assert r.json()["username"] == "common"
|
|
|
|
|
|
async def test_move_note_between_spaces(client):
|
|
r = await client.post("/api/notes", json={"body": "start here"})
|
|
note_id = r.json()["id"]
|
|
assert r.json()["username"] == "schmeeve"
|
|
|
|
r2 = await client.put(f"/api/notes/{note_id}", json={"body": "moved", "username": "common"})
|
|
assert r2.status_code == 200
|
|
assert r2.json()["username"] == "common"
|
|
|
|
|
|
async def test_create_note_unknown_space(client):
|
|
r = await client.post("/api/notes", json={"body": "x", "username": "ghost"})
|
|
assert r.status_code == 404
|
|
|
|
|
|
async def test_upload_and_serve_attachment(client):
|
|
r = await client.post(
|
|
"/api/attachments",
|
|
files={"file": ("photo.png", b"fakeimage", "image/png")},
|
|
data={"username": "common"},
|
|
)
|
|
assert r.status_code == 200
|
|
data = r.json()
|
|
assert data["url"].startswith("/api/attachments/common/")
|
|
assert data["path"] == f"common/attachments/{data['url'].rsplit('/', 1)[-1]}"
|
|
|
|
r2 = await client.get(data["url"])
|
|
assert r2.status_code == 200
|
|
assert r2.content == b"fakeimage"
|
|
|
|
|
|
async def test_attachment_not_found(client):
|
|
r = await client.get("/api/attachments/common/does-not-exist.png")
|
|
assert r.status_code == 404
|
|
|
|
|
|
async def test_create_and_get_note(client):
|
|
r = await client.post("/api/notes", json={"body": "# Test\nThis is a note #tag1"})
|
|
assert r.status_code == 200
|
|
note = r.json()
|
|
assert note["title"] == "Test"
|
|
assert note["tags"] == ["tag1"]
|
|
|
|
r2 = await client.get(f"/api/notes/{note['id']}")
|
|
assert r2.status_code == 200
|
|
assert r2.json()["body"] == "# Test\nThis is a note #tag1"
|
|
|
|
|
|
async def test_note_file_written(client, tmp_path):
|
|
r = await client.post("/api/notes", json={"body": "hello world"})
|
|
note = r.json()
|
|
import os
|
|
|
|
expected = os.path.join(str(tmp_path / "notes"), "schmeeve", f"{note['id']}.md")
|
|
assert os.path.isfile(expected)
|
|
assert open(expected).read() == "hello world"
|
|
|
|
|
|
async def test_update_note(client):
|
|
r = await client.post("/api/notes", json={"body": "original"})
|
|
note_id = r.json()["id"]
|
|
|
|
r2 = await client.put(f"/api/notes/{note_id}", json={"body": "updated #newtag"})
|
|
assert r2.status_code == 200
|
|
assert r2.json()["tags"] == ["newtag"]
|
|
|
|
|
|
async def test_delete_note(client):
|
|
r = await client.post("/api/notes", json={"body": "delete me"})
|
|
note_id = r.json()["id"]
|
|
|
|
r2 = await client.delete(f"/api/notes/{note_id}")
|
|
assert r2.status_code == 200
|
|
|
|
r3 = await client.get(f"/api/notes/{note_id}")
|
|
assert r3.status_code == 404
|
|
|
|
|
|
async def test_search(client):
|
|
await client.post("/api/notes", json={"body": "A note about recipes #recipe"})
|
|
await client.post("/api/notes", json={"body": "Completely different content"})
|
|
|
|
r = await client.get("/api/search", params={"q": "recipe"})
|
|
assert r.status_code == 200
|
|
results = r.json()
|
|
assert len(results) == 1
|
|
|
|
|
|
async def test_tag_counts(client):
|
|
await client.post("/api/notes", json={"body": "one #recipe"})
|
|
await client.post("/api/notes", json={"body": "two #recipe #dinner"})
|
|
await client.post("/api/notes", json={"body": "three #recipe"})
|
|
|
|
r = await client.get("/api/tags")
|
|
tags = {t["name"]: t["count"] for t in r.json()}
|
|
assert tags["recipe"] == 3
|
|
assert tags["dinner"] == 1
|
|
|
|
|
|
async def test_history_recorded(client):
|
|
r = await client.post("/api/notes", json={"body": "note"})
|
|
note_id = r.json()["id"]
|
|
|
|
r2 = await client.get(f"/api/notes/{note_id}/history")
|
|
history = r2.json()
|
|
assert len(history) == 1
|
|
assert history[0]["action"] == "create"
|
|
assert history[0]["ip"] == "192.168.1.5"
|
|
|
|
|
|
async def test_user_selection_cookie(client):
|
|
r = await client.post("/api/users/select", json={"username": "ilya"})
|
|
assert r.status_code == 200
|
|
assert "snotes_user" in r.cookies
|
|
|
|
|
|
async def test_remote_requires_auth(remote_client):
|
|
r = await remote_client.get("/api/notes")
|
|
assert r.status_code == 401
|
|
|
|
|
|
async def test_remote_login_unlocks(remote_client):
|
|
r = await remote_client.post("/api/auth/login", json={"password": "wrong"})
|
|
assert r.status_code == 401
|
|
|
|
r2 = await remote_client.post("/api/auth/login", json={"password": "hunter2"})
|
|
assert r2.status_code == 200
|
|
assert "snotes_auth" in r2.cookies
|
|
|
|
auth_cookie = r2.cookies["snotes_auth"]
|
|
r3 = await remote_client.get("/api/notes", headers={"Cookie": "snotes_auth=" + auth_cookie})
|
|
assert r3.status_code == 200
|