aboutsummaryrefslogtreecommitdiff
path: root/tests/integration/test_browse.py
blob: 875821d401957e209915fc2e54dc0b66573fd6cf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import io
import zipfile
from contextlib import contextmanager
from datetime import datetime

from testutils import load_gpx_asset
from fietsboek import models
from fietsboek.models.track import Visibility


@contextmanager
def added_tracks(tm, dbsession, owner, data_manager):
    """Adds some tracks to the database session.

    This function should be used as a context manager and it ensures that the
    added tracks are deleted again after the test, to make a clean slate for
    the next test.
    """
    # The normal transaction is "doomed", so we need to abort it, start a fresh
    # one, and then explicitely commit it, otherwise we will not persist the
    # objects to the database.
    tm.abort()

    tracks = []
    with tm:
        track = models.Track(
            owner=owner,
            title="Foobar",
            visibility=Visibility.PUBLIC,
            description="A foo'd track",
            badges=[],
            link_secret="foobar",
            tagged_people=[],
        )
        track.date = datetime(2022, 3, 14, 9, 26, 54)
        dbsession.add(track)
        dbsession.flush()
        data_manager.initialize(track.id).compress_gpx(load_gpx_asset("MyTourbook_1.gpx.gz"))
        tracks.append(track)

        track = models.Track(
            owner=owner,
            title="Barfoo",
            visibility=Visibility.PUBLIC,
            description="A bar'd track",
            badges=[],
            link_secret="barfoo",
            tagged_people=[],
        )
        track.date = datetime(2022, 10, 29, 13, 37, 11)
        dbsession.add(track)
        dbsession.flush()
        data_manager.initialize(track.id).compress_gpx(load_gpx_asset("Teasi_1.gpx.gz"))
        tracks.append(track)

    tm.begin()
    tm.doom()

    try:
        yield tracks
    finally:
        tm.abort()
        with tm:
            for track in tracks:
                dbsession.delete(track)
        tm.begin()
        tm.doom()


def test_browse(testapp, dbsession, route_path, logged_in, tm, data_manager):
    # pylint: disable=too-many-positional-arguments
    # Ensure there are some tracks in the database
    with added_tracks(tm, dbsession, logged_in, data_manager):
        # Now go to the browse page
        browse = testapp.get(route_path('browse'))

        assert "Foobar" in browse.text
        assert "Barfoo" in browse.text


def test_archive(testapp, dbsession, route_path, logged_in, tm, data_manager):
    # pylint: disable=too-many-positional-arguments
    with added_tracks(tm, dbsession, logged_in, data_manager):
        archive = testapp.get(
            route_path('track-archive', _query=[("track_id[]", "1"), ("track_id[]", "2")])
        )
        result = io.BytesIO(archive.body)

        with zipfile.ZipFile(result, 'r') as zipped:
            assert len(zipped.namelist()) == 2
            assert "track_1.gpx" in zipped.namelist()
            assert "track_2.gpx" in zipped.namelist()