File: test_activity.py

package info (click to toggle)
python-logi-circle 0.2.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 300 kB
  • sloc: python: 1,685; xml: 16; sh: 5; makefile: 4
file content (131 lines) | stat: -rw-r--r-- 5,888 bytes parent folder | download
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# -*- coding: utf-8 -*-
"""The tests for the Logi API platform."""
import json
import os
from unittest.mock import MagicMock
from datetime import datetime
import pytz
import aresponses
from tests.test_base import LogiUnitTestBase
from logi_circle.activity import Activity
from logi_circle.const import (API_BASE,
                               ISO8601_FORMAT_MASK,
                               ACCEPT_IMAGE_HEADER,
                               ACCEPT_VIDEO_HEADER,
                               ACTIVITY_IMAGE_ENDPOINT,
                               ACTIVITY_MP4_ENDPOINT,
                               ACTIVITY_DASH_ENDPOINT,
                               ACTIVITY_HLS_ENDPOINT)
from .helpers import async_return

BASE_ACTIVITY_URL = '/abc123'
TEST_TZ = 'Etc/GMT+10'
TEMP_FILE = 'temp.mp4'


class TestActivity(LogiUnitTestBase):
    """Unit test for the Activity class."""

    def setUp(self):
        """Set up Activity class with fixtures"""
        super(TestActivity, self).setUp()

        self.activity_json = json.loads(self.fixtures['activity'])
        self.activity = Activity(activity=self.activity_json,
                                 logi=self.logi,
                                 url=BASE_ACTIVITY_URL,
                                 local_tz=pytz.timezone(TEST_TZ))

    def tearDown(self):
        """Remove test Activity instance"""
        super(TestActivity, self).tearDown()
        del self.activity_json
        del self.activity

    def cleanup(self):
        """Cleanup any assets downloaded as part of the unit tests."""
        super(TestActivity, self).cleanup()
        if os.path.isfile(TEMP_FILE):
            os.remove(TEMP_FILE)

    def test_activity_props(self):
        """Test props match fixture"""
        self.assertEqual(self.activity.activity_id, self.activity_json['activityId'])
        self.assertEqual(self.activity.duration.seconds, self.activity_json['playbackDuration'] / 1000)
        self.assertEqual(self.activity.start_time_utc,
                         datetime.strptime(self.activity_json['startTime'], ISO8601_FORMAT_MASK))
        self.assertEqual(self.activity.end_time_utc,
                         datetime.strptime(self.activity_json['endTime'], ISO8601_FORMAT_MASK))
        self.assertEqual(self.activity.start_time,
                         self.activity.start_time_utc.replace(
                             tzinfo=pytz.utc).astimezone(self.activity._local_tz))
        self.assertEqual(self.activity.end_time,
                         self.activity.end_time_utc.replace(
                             tzinfo=pytz.utc).astimezone(self.activity._local_tz))

    def test_activity_assets(self):
        """Test props match fixture"""
        url_base = '%s%s/%s' % (API_BASE, BASE_ACTIVITY_URL, self.activity_json['activityId'])
        self.assertEqual(self.activity.jpeg_url, url_base + ACTIVITY_IMAGE_ENDPOINT)
        self.assertEqual(self.activity.mp4_url, url_base + ACTIVITY_MP4_ENDPOINT)
        self.assertEqual(self.activity.hls_url, url_base + ACTIVITY_HLS_ENDPOINT)
        self.assertEqual(self.activity.dash_url, url_base + ACTIVITY_DASH_ENDPOINT)

        my_file = 'myfile.file'

        self.activity._get_file = MagicMock(
            return_value=async_return(None))

        async def run_test():
            # Image
            await self.activity.download_jpeg(my_file)
            self.activity._get_file.assert_called_with(url=self.activity.jpeg_url,
                                                       filename=my_file,
                                                       accept_header=ACCEPT_IMAGE_HEADER)

            # Video
            await self.activity.download_mp4(my_file)
            self.activity._get_file.assert_called_with(url=self.activity.mp4_url,
                                                       filename=my_file,
                                                       accept_header=ACCEPT_VIDEO_HEADER)

            # Dash
            await self.activity.download_dash(my_file)
            self.activity._get_file.assert_called_with(url=self.activity.dash_url,
                                                       filename=my_file)

            # HLS
            await self.activity.download_hls(my_file)
            self.activity._get_file.assert_called_with(url=self.activity.hls_url,
                                                       filename=my_file)

        self.loop.run_until_complete(run_test())

    def test_get_file(self):
        """Test get file utility function."""

        self.logi.auth_provider = self.get_authorized_auth_provider()
        test_file_endpoint = '/coolfile.mp4'

        async def run_test():
            async with aresponses.ResponsesMockServer(loop=self.loop) as arsps:
                arsps.add('myfile.com', test_file_endpoint, 'get',
                          aresponses.Response(status=200,
                                              text='123456',
                                              headers={'content-type': 'application/octet-stream'}))
                arsps.add('myfile.com', test_file_endpoint, 'get',
                          aresponses.Response(status=200,
                                              text='789012',
                                              headers={'content-type': 'application/octet-stream'}))

                # Should serve file as bytes object if filename parameter not specified
                myfile = await self.activity._get_file('https://myfile.com/coolfile.mp4')
                self.assertEqual(myfile, b'123456')

                # Should download file
                await self.activity._get_file('https://myfile.com/coolfile.mp4', TEMP_FILE)
                with open(TEMP_FILE, 'r') as test_file:
                    data = test_file.read()
                    self.assertEqual(data, "789012")

        self.loop.run_until_complete(run_test())