Completed
Push — master ( 6c4ac7...836a98 )
by
unknown
01:30
created

StatisticsTest.test_update_live_statistics()   A

Complexity

Conditions 1

Size

Total Lines 50

Duplication

Lines 0
Ratio 0 %

Importance

Changes 5
Bugs 0 Features 0
Metric Value
cc 1
c 5
b 0
f 0
dl 0
loc 50
rs 9.3333
1
# coding: utf8
2
3
"""
4
This software is licensed under the Apache 2 license, quoted below.
5
6
Copyright 2014 Crystalnix Limited
7
8
Licensed under the Apache License, Version 2.0 (the "License"); you may not
9
use this file except in compliance with the License. You may obtain a copy of
10
the License at
11
12
    http://www.apache.org/licenses/LICENSE-2.0
13
14
Unless required by applicable law or agreed to in writing, software
15
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
16
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
17
License for the specific language governing permissions and limitations under
18
the License.
19
"""
20
from django.test import TestCase, RequestFactory
21
22
from datetime import datetime
23
24
import mock
25
from django_redis import get_redis_connection
26
from bitmapist import DayEvents, HourEvents
27
from freezegun import freeze_time
28
29
from omaha.utils import get_id
30
from sparkle.statistics import add_app_statistics, userid_counting
31
32
redis = get_redis_connection('statistics')
33
34
35
class StatisticsTest(TestCase):
36
    request_factory = RequestFactory()
37
38
    def setUp(self):
39
        redis.flushdb()
40
41
    def tearDown(self):
42
        redis.flushdb()
43
44
    @freeze_time('2016-1-1')
45
    def test_add_app_statistics(self):
46
        now = datetime.utcnow()
47
        next_month = now.replace(month=now.month + 1)
48
        userid = 1
49
        platform = 'mac'
50
        appid = '{F97917B1-19AB-48C1-9802-CEF305B10804}'
51
        version = '0.0.0.1'
52
        channel = 'test'
53
        test_app = dict(appid=appid, version=version, tag=channel)
54
55
        events_request_appid = lambda date=now: DayEvents.from_date('request:%s' % appid, date)
56
        events_new_appid = lambda date=now: DayEvents.from_date('new_install:%s' % appid, date)
57
        events_request_appid_version = lambda date=now: DayEvents.from_date('request:{}:{}'.format(appid, version),
58
                                                                            date)
59
        events_request_appid_platform = lambda date=now: DayEvents.from_date('request:{}:{}'.format(appid, platform),
60
                                                                             date)
61
        events_new_appid_platform = lambda date=now: DayEvents.from_date('new_install:{}:{}'.format(appid, platform),
62
                                                                         date)
63
        events_request_appid_channel = lambda date=now: DayEvents.from_date('request:{}:{}'.format(appid, channel),
64
                                                                            date)
65
        events_request_appid_platform_version = lambda date=now: DayEvents.from_date(
66
            'request:{}:{}:{}'.format(appid, platform, version), date)
67
        events_request_appid_platform_channel_version = lambda date=now: DayEvents.from_date(
68
            'request:{}:{}:{}:{}'.format(appid, platform, channel, version), date)
69
70
        self.assertEqual(len(events_new_appid()), 0)
71
        self.assertEqual(len(events_request_appid()), 0)
72
        self.assertEqual(len(events_request_appid_version()), 0)
73
        self.assertEqual(len(events_request_appid_platform()), 0)
74
        self.assertEqual(len(events_new_appid_platform()), 0)
75
        self.assertEqual(len(events_request_appid_channel()), 0)
76
        self.assertEqual(len(events_request_appid_platform_version()), 0)
77
        self.assertEqual(len(events_request_appid_platform_channel_version()), 0)
78
79
        add_app_statistics(userid, platform, test_app)
80
        self.assertEqual(len(events_new_appid()), 1)
81
        self.assertEqual(len(events_request_appid()), 0)
82
        self.assertEqual(len(events_request_appid_version()), 1)
83
        self.assertEqual(len(events_new_appid_platform()), 1)
84
        self.assertEqual(len(events_request_appid_platform()), 0)
85
        self.assertEqual(len(events_request_appid_channel()), 1)
86
        self.assertEqual(len(events_request_appid_platform_version()), 1)
87
        self.assertEqual(len(events_request_appid_platform_channel_version()), 1)
88
89
        self.assertIn(userid, events_new_appid())
90
        self.assertIn(userid, events_request_appid_version())
91
        self.assertIn(userid, events_new_appid_platform())
92
        self.assertIn(userid, events_request_appid_channel())
93
        self.assertIn(userid, events_request_appid_platform_version())
94
        self.assertIn(userid, events_request_appid_platform_channel_version())
95
96
        add_app_statistics(userid, platform, test_app)
97
        self.assertEqual(len(events_new_appid()), 1)
98
        self.assertEqual(len(events_request_appid()), 0)
99
        self.assertEqual(len(events_request_appid_version()), 1)
100
        self.assertEqual(len(events_new_appid_platform()), 1)
101
        self.assertEqual(len(events_request_appid_platform()), 0)
102
        self.assertEqual(len(events_request_appid_channel()), 1)
103
        self.assertEqual(len(events_request_appid_platform_version()), 1)
104
        self.assertEqual(len(events_request_appid_platform_channel_version()), 1)
105
106
        with freeze_time(next_month):
107
            add_app_statistics(userid, platform, test_app)
108
109
        self.assertEqual(len(events_request_appid(next_month)), 1)
110
        self.assertEqual(len(events_request_appid_platform(next_month)), 1)
111
        self.assertEqual(len(events_new_appid(next_month)), 0)
112
        self.assertEqual(len(events_request_appid_version(next_month)), 1)
113
        self.assertEqual(len(events_new_appid_platform(next_month)), 0)
114
        self.assertEqual(len(events_request_appid_channel(next_month)), 1)
115
        self.assertEqual(len(events_request_appid_platform_version(next_month)), 1)
116
        self.assertEqual(len(events_request_appid_platform_channel_version(next_month)), 1)
117
118
        self.assertIn(userid, events_request_appid(next_month))
119
        self.assertIn(userid, events_request_appid_platform(next_month))
120
        self.assertIn(userid, events_request_appid_platform_channel_version(next_month))
121
122
    def test_update_live_statistics(self):
123
        userid1 = '{F07B3878-CD6F-4B96-B52F-95C4D23077E0}'
124
        user1_id = get_id(userid1)
125
126
        userid2 = '{EC4C5647-F798-4BCA-83DA-926CD448A1D5}'
127
        user2_id = get_id(userid2)
128
129
        appid = '{F97917B1-19AB-48C1-9802-CEF305B10804}'
130
        version = '0.0.0.1'
131
        channel = 'test'
132
        test_app = dict(appid=appid, version=version, tag=channel)
133
        platform = 'mac'
134
135
        request_version_events = HourEvents('request:{}:{}'.format(appid, version))
136
        request_platform_version_events = HourEvents('request:{}:{}:{}'.format(appid, 'mac', version))
137
        request_appid_platform_channel_version = HourEvents('request:{}:{}:{}:{}'.format(appid, 'mac', channel, version))
138
139
        self.assertFalse(user1_id in request_version_events)
140
        self.assertEqual(len(request_version_events), 0)
141
        self.assertFalse(user1_id in request_platform_version_events)
142
        self.assertEqual(len(request_platform_version_events), 0)
143
        self.assertFalse(user1_id in request_appid_platform_channel_version)
144
        self.assertEqual(len(request_appid_platform_channel_version), 0)
145
146
        userid_counting(userid1, test_app, platform)
147
148
        self.assertTrue(user1_id in request_version_events)
149
        self.assertEqual(len(request_version_events), 1)
150
        self.assertTrue(user1_id in request_platform_version_events)
151
        self.assertEqual(len(request_platform_version_events), 1)
152
        self.assertTrue(user1_id in request_appid_platform_channel_version)
153
        self.assertEqual(len(request_appid_platform_channel_version), 1)
154
155
        userid_counting(userid1, test_app, platform)
156
157
        self.assertTrue(user1_id in request_version_events)
158
        self.assertEqual(len(request_version_events), 1)
159
        self.assertTrue(user1_id in request_platform_version_events)
160
        self.assertEqual(len(request_platform_version_events), 1)
161
        self.assertTrue(user1_id in request_appid_platform_channel_version)
162
        self.assertEqual(len(request_appid_platform_channel_version), 1)
163
164
        userid_counting(userid2, test_app, platform)
165
166
        self.assertTrue(user2_id in request_version_events)
167
        self.assertEqual(len(request_version_events), 2)
168
        self.assertTrue(user2_id in request_platform_version_events)
169
        self.assertEqual(len(request_platform_version_events), 2)
170
        self.assertTrue(user2_id in request_appid_platform_channel_version)
171
        self.assertEqual(len(request_appid_platform_channel_version), 2)
172