from flask import url_for

from app.db import Session
from app.models import Notification
from tests.api.utils import get_new_user_and_api_key


def test_get_notifications(flask_client):
    user, api_key = get_new_user_and_api_key()

    # create some notifications
    Notification.create(user_id=user.id, message="Test message 1")
    Notification.create(user_id=user.id, message="Test message 2")
    Session.commit()

    r = flask_client.get(
        "/api/notifications?page=0",
        headers={"Authentication": api_key.code},
    )

    assert r.status_code == 200
    assert r.json["more"] is False
    assert len(r.json["notifications"]) == 2
    for n in r.json["notifications"]:
        assert n["id"] > 0
        assert n["message"]
        assert "title" in n
        assert n["read"] is False
        assert n["created_at"]

    # no more post at the next page
    r = flask_client.get(
        url_for("api.get_notifications", page=1),
        headers={"Authentication": api_key.code},
    )
    assert r.json["more"] is False
    assert len(r.json["notifications"]) == 0


def test_mark_notification_as_read(flask_client):
    user, api_key = get_new_user_and_api_key()

    notif_id = Notification.create(
        user_id=user.id, message="Test message 1", flush=True
    ).id
    Session.commit()

    r = flask_client.post(
        url_for("api.mark_as_read", notification_id=notif_id),
        headers={"Authentication": api_key.code},
    )

    assert r.status_code == 200
    notification = Notification.filter_by(id=notif_id).first()
    assert notification.read
