Completed
Push — master ( 7ae2ee...38e972 )
by
unknown
56s
created

StatisticsTest.generate_version()   A

Complexity

Conditions 1

Size

Total Lines 22

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
c 1
b 0
f 0
dl 0
loc 22
rs 9.2
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
21
from builtins import range
22
23
from django.utils import timezone
24
from datetime import datetime, timedelta
25
from uuid import UUID
26
27
from django.test import TestCase
28
from django.core.files.uploadedfile import SimpleUploadedFile
29
30
from mock import patch
31
from freezegun import freeze_time
32
from bitmapist import DayEvents, HourEvents, mark_event
33
34
from omaha.tests import fixtures
35
from omaha.parser import parse_request
36
from omaha.statistics import (
37
    userid_counting,
38
    add_app_statistics,
39
    is_user_active,
40
    get_kwargs_for_model,
41
    parse_os,
42
    parse_hw,
43
    parse_req,
44
    parse_apps,
45
    parse_events,
46
    collect_statistics,
47
    get_users_statistics_months,
48
    get_channel_statistics,
49
    get_users_versions,
50
    get_users_live_versions,
51
)
52
53
from omaha.tests.utils import temporary_media_root, create_app_xml
54
from omaha.utils import redis, get_id
55
from omaha.settings import DEFAULT_CHANNEL
56
from omaha.models import (
57
    ACTIVE_USERS_DICT_CHOICES,
58
    Os,
59
    Hw,
60
    Request,
61
    AppRequest,
62
    Event,
63
    Application,
64
    Platform,
65
    Channel,
66
    Version,
67
)
68
from sparkle.models import SparkleVersion
69
from sparkle.statistics import userid_counting as mac_userid_counting
70
71
72
class StatisticsTest(TestCase):
73
    def setUp(self):
74
        redis.flushdb()
75
76
    def tearDown(self):
77
        redis.flushdb()
78
79
    def generate_version(self, is_enabled):
80
        app = Application.objects.create(id='{D0AB2EBC-931B-4013-9FEB-C9C4C2225C8C}', name='app')
81
        platform = Platform.objects.create(name='win')
82
        channel = Channel.objects.create(name='stable')
83
        userid = 1
84
        Version.objects.create(
85
            is_enabled=is_enabled,
86
            app=app,
87
            platform=platform,
88
            channel=channel,
89
            version='0.0.0.2',
90
            file=SimpleUploadedFile('./chrome_installer.exe', False))
91
        start = timezone.now() - timedelta(3)
92
        end = timezone.now()
93
        request = parse_request(fixtures.request_event_uninstall_success)
94
        apps = request.findall('app')
95
        userid_counting(userid, apps, platform)
96
        return get_users_live_versions(
97
            app_id=app.pk,
98
            channel=channel,
99
            start=start,
100
            end=end,
101
        )
102
103
    def test_get_live_statistics_with_enabled_version(self):
104
        data = self.generate_version(is_enabled=True)
105
        assert len(data['win'].keys()) == 1
106
107
    def test_get_live_statistics_with_disabled_version(self):
108
        data = self.generate_version(is_enabled=False)
109
        assert len(data['win'].keys()) == 1
110
111
    @patch('omaha.statistics.add_app_statistics')
112
    def test_userid_counting(self, mock_add_app_statistics):
113
        now = datetime.utcnow()
114
115
        userid1 = '{F07B3878-CD6F-4B96-B52F-95C4D23077E0}'
116
        user1_id = get_id(userid1)
117
118
        userid2 = '{EC4C5647-F798-4BCA-83DA-926CD448A1D5}'
119
        user2_id = get_id(userid2)
120
121
        app_list = [dict(appid='{F97917B1-19AB-48C1-9802-CEF305B10804}'),
122
                    dict(appid='{555B8D18-076D-4576-9579-1FD7F0399EAE}')]
123
124
        request_events = DayEvents('request', now.year, now.month, now.day)
125
126
        self.assertFalse(user1_id in request_events)
127
        self.assertEqual(len(request_events), 0)
128
129
        userid_counting(userid1, app_list, 'win')
130
131
        for app in app_list:
132
            mock_add_app_statistics.assert_any_call(user1_id, 'win', app, now=None)
133
134
        self.assertEqual(len(request_events), 1)
135
        self.assertTrue(user1_id in request_events)
136
137
        userid_counting(userid1, app_list, 'win')
138
139
        for app in app_list:
140
            mock_add_app_statistics.assert_any_call(user1_id, 'win', app, now=None)
141
142
        self.assertEqual(len(request_events), 1)
143
144
        self.assertFalse(user2_id in request_events)
145
        userid_counting(userid2, app_list[:1], 'win')
146
        self.assertTrue(user2_id in request_events)
147
        for app in app_list[:1]:
148
            mock_add_app_statistics.assert_any_call(user2_id, 'win', app, now=None)
149
150
        self.assertEqual(len(request_events), 2)
151
152
    @freeze_time('2016-1-1')
153
    def test_add_app_statistics(self):
154
        now = datetime.utcnow()
155
        next_month = now.replace(month=now.month + 1)
156
        userid = 1
157
        channel = DEFAULT_CHANNEL
158
        platform = 'win'
159
        app_kwargs = dict(appid='{2882CF9B-D9C2-4edb-9AAF-8ED5FCF366F7}', nextversion='0.0.0.1')
160
        success_app = create_app_xml(events=fixtures.event_install_success, **app_kwargs)
161
        error_app = create_app_xml(events=fixtures.event_install_error, **app_kwargs)
162
        appid = app_kwargs.get('appid')
163
        version = app_kwargs.get('nextversion')
164
165
        events_request_appid = lambda date=now: DayEvents.from_date('request:%s' % appid, date)
166
        events_new_appid = lambda date=now: DayEvents.from_date('new_install:%s' % appid, date)
167
        events_request_appid_version = lambda date=now: DayEvents.from_date('request:{}:{}'.format(appid, version), date)
168
        events_request_appid_platform = lambda date=now: DayEvents.from_date('request:{}:{}'.format(appid, platform), date)
169
        events_new_appid_platform = lambda date=now: DayEvents.from_date('new_install:{}:{}'.format(appid, platform), date)
170
        events_request_appid_channel = lambda date=now: DayEvents.from_date('request:{}:{}'.format(appid, channel), date)
171
        events_request_appid_platform_version = lambda date=now: DayEvents.from_date(
172
            'request:{}:{}:{}'.format(appid, platform, version), date)
173
        events_request_appid_platform_channel_version = lambda date=now: DayEvents.from_date(
174
            'request:{}:{}:{}:{}'.format(appid, platform, channel, version), date)
175
176
        self.assertEqual(len(events_new_appid()), 0)
177
        self.assertEqual(len(events_request_appid()), 0)
178
        self.assertEqual(len(events_request_appid_version()), 0)
179
        self.assertEqual(len(events_request_appid_platform()), 0)
180
        self.assertEqual(len(events_new_appid_platform()), 0)
181
        self.assertEqual(len(events_request_appid_channel()), 0)
182
        self.assertEqual(len(events_request_appid_platform_version()), 0)
183
        self.assertEqual(len(events_request_appid_platform_channel_version()), 0)
184
185
        add_app_statistics(userid, platform, error_app)
186
187
        self.assertEqual(len(events_new_appid()), 0)
188
        self.assertEqual(len(events_request_appid()), 0)
189
        self.assertEqual(len(events_request_appid_version()), 0)
190
        self.assertEqual(len(events_request_appid_platform()), 0)
191
        self.assertEqual(len(events_new_appid_platform()), 0)
192
        self.assertEqual(len(events_request_appid_channel()), 0)
193
        self.assertEqual(len(events_request_appid_platform_version()), 0)
194
        self.assertEqual(len(events_request_appid_platform_channel_version()), 0)
195
196
        add_app_statistics(userid, platform, success_app)
197
        self.assertEqual(len(events_new_appid()), 1)
198
        self.assertEqual(len(events_request_appid()), 0)
199
        self.assertEqual(len(events_request_appid_version()), 1)
200
        self.assertEqual(len(events_new_appid_platform()), 1)
201
        self.assertEqual(len(events_request_appid_platform()), 0)
202
        self.assertEqual(len(events_request_appid_channel()), 1)
203
        self.assertEqual(len(events_request_appid_platform_version()), 1)
204
        self.assertEqual(len(events_request_appid_platform_channel_version()), 1)
205
206
        self.assertIn(userid, events_new_appid())
207
        self.assertIn(userid, events_request_appid_version())
208
        self.assertIn(userid, events_new_appid_platform())
209
        self.assertIn(userid, events_request_appid_channel())
210
        self.assertIn(userid, events_request_appid_platform_version())
211
        self.assertIn(userid, events_request_appid_platform_channel_version())
212
213
        add_app_statistics(userid, platform, success_app)
214
        self.assertEqual(len(events_new_appid()), 1)
215
        self.assertEqual(len(events_request_appid()), 0)
216
        self.assertEqual(len(events_request_appid_version()), 1)
217
        self.assertEqual(len(events_new_appid_platform()), 1)
218
        self.assertEqual(len(events_request_appid_platform()), 0)
219
        self.assertEqual(len(events_request_appid_channel()), 1)
220
        self.assertEqual(len(events_request_appid_platform_version()), 1)
221
222
        with freeze_time(next_month):
223
            add_app_statistics(userid, platform, error_app)
224
225
        self.assertEqual(len(events_request_appid(next_month)), 0)
226
        self.assertEqual(len(events_request_appid_platform(next_month)), 0)
227
228
        with freeze_time(next_month):
229
            add_app_statistics(userid, platform, success_app)
230
231
        self.assertEqual(len(events_request_appid(next_month)), 1)
232
        self.assertEqual(len(events_request_appid_platform(next_month)), 1)
233
        self.assertEqual(len(events_new_appid(next_month)), 0)
234
        self.assertEqual(len(events_request_appid_version(next_month)), 1)
235
        self.assertEqual(len(events_new_appid_platform(next_month)), 0)
236
        self.assertEqual(len(events_request_appid_channel(next_month)), 1)
237
        self.assertEqual(len(events_request_appid_platform_version(next_month)), 1)
238
        self.assertEqual(len(events_request_appid_platform_channel_version(next_month)), 1)
239
240
        self.assertIn(userid, events_request_appid(next_month))
241
        self.assertIn(userid, events_request_appid_platform(next_month))
242
243
    def test_is_user_active(self):
244
        userid = '{F07B3878-CD6F-4B96-B52F-95C4D23077E0}'
245
        id = get_id(userid)
246
247
        self.assertTrue(is_user_active(ACTIVE_USERS_DICT_CHOICES['all'], userid))
248
        self.assertFalse(is_user_active(ACTIVE_USERS_DICT_CHOICES['week'], userid))
249
        self.assertFalse(is_user_active(ACTIVE_USERS_DICT_CHOICES['month'], userid))
250
251
        mark_event('request', id)
252
253
        self.assertTrue(is_user_active(ACTIVE_USERS_DICT_CHOICES['all'], userid))
254
        self.assertTrue(is_user_active(ACTIVE_USERS_DICT_CHOICES['week'], userid))
255
        self.assertTrue(is_user_active(ACTIVE_USERS_DICT_CHOICES['month'], userid))
256
257
    def test_get_kwargs_for_model(self):
258
        os = dict(platform="win",
259
                  version="6.1",
260
                  sp="",
261
                  arch="x64")
262
        kwargs = get_kwargs_for_model(Os, os)
263
        self.assertDictEqual(kwargs, dict(platform="win",
264
                                          version="6.1",
265
                                          sp="",
266
                                          arch="x64",
267
                                          id=None))
268
269
    def test_parse_os(self):
270
        request = parse_request(fixtures.request_event)
271
        os = parse_os(request.os)
272
        self.assertIsInstance(os, Os)
273
        self.assertEqual(os.platform, 'win')
274
        self.assertEqual(os.version, '6.1')
275
        self.assertEqual(os.sp, '')
276
        self.assertEqual(os.arch, 'x64')
277
278
    def test_parse_hw(self):
279
        hw = dict(sse2="1")
280
        hw = parse_hw(hw)
281
        self.assertIsInstance(hw, Hw)
282
        self.assertEqual(hw.sse, None)
283
        self.assertEqual(hw.sse2, 1)
284
        self.assertEqual(hw.sse3, None)
285
        self.assertEqual(hw.ssse3, None)
286
        self.assertEqual(hw.sse41, None)
287
        self.assertEqual(hw.sse42, None)
288
        self.assertEqual(hw.avx, None)
289
        self.assertEqual(hw.physmemory, None)
290
291
    def test_parse_request(self):
292
        request = parse_request(fixtures.request_event)
293
        req = parse_req(request)
294
        self.assertIsInstance(req, Request)
295
        self.assertEqual(req.version, Request._meta.get_field_by_name('version')[0].to_python('1.3.23.0'))
296
        self.assertEqual(req.ismachine, 1)
297
        self.assertEqual(req.sessionid, '{2882CF9B-D9C2-4edb-9AAF-8ED5FCF366F7}')
298
        self.assertEqual(req.userid, '{D0BBD725-742D-44ae-8D46-0231E881D58E}')
299
        self.assertEqual(req.originurl, None)
300
        self.assertEqual(req.testsource, 'ossdev')
301
        self.assertEqual(req.updaterchannel, None)
302
303
    def test_parse_apps(self):
304
        request = parse_request(fixtures.request_event)
305
        req = parse_req(request)
306
        req.os = parse_os(request.os)
307
        req.hw = parse_hw(request.hw) if request.get('hw') else None
308
        req.save()
309
310
        apps = parse_apps(request.findall('app'), req)
311
        self.assertEqual(len(apps), 1)
312
        app = apps[0]
313
        self.assertIsInstance(app, AppRequest)
314
        self.assertEqual(app.version, None)
315
        self.assertEqual(app.nextversion, Request._meta.get_field_by_name('version')[0].to_python('13.0.782.112'))
316
        self.assertEqual(app.lang, 'en')
317
        self.assertEqual(app.tag, 'stable')
318
        self.assertEqual(app.installage, 6)
319
        self.assertEqual(app.appid, '{D0AB2EBC-931B-4013-9FEB-C9C4C2225C8C}')
320
321
    def test_parse_events(self):
322
        request = parse_request(fixtures.request_event)
323
        events = request.findall('app')[0].findall('event')
324
        events = parse_events(events)
325
        self.assertEqual(len(events), 3)
326
        event = events[0]
327
        self.assertIsInstance(event, Event)
328
        self.assertEqual(event.eventtype, 9)
329
        self.assertEqual(event.eventresult, 1)
330
        self.assertEqual(event.errorcode, 0)
331
        self.assertEqual(event.extracode1, 0)
332
        self.assertEqual(event.download_time_ms, None)
333
        self.assertEqual(event.downloaded, None)
334
        self.assertEqual(event.total, None)
335
        self.assertEqual(event.update_check_time_ms, None)
336
        self.assertEqual(event.install_time_ms, None)
337
        self.assertEqual(event.source_url_index, None)
338
        self.assertEqual(event.state_cancelled, None)
339
        self.assertEqual(event.time_since_update_available_ms, None)
340
        self.assertEqual(event.time_since_download_start_ms, None)
341
        self.assertEqual(event.nextversion, None)
342
        self.assertEqual(event.previousversion, None)
343
344
    def test_collect_statistics(self):
345
        request = parse_request(fixtures.request_event)
346
347
        self.assertEqual(Os.objects.all().count(), 0)
348
        self.assertEqual(Hw.objects.all().count(), 0)
349
        self.assertEqual(Request.objects.all().count(), 0)
350
        self.assertEqual(AppRequest.objects.all().count(), 0)
351
        self.assertEqual(Event.objects.all().count(), 0)
352
353
        collect_statistics(request)
354
355
        self.assertEqual(Os.objects.all().count(), 1)
356
        self.assertEqual(Hw.objects.all().count(), 0)
357
        self.assertEqual(Request.objects.all().count(), 1)
358
        self.assertEqual(AppRequest.objects.all().count(), 1)
359
        self.assertEqual(Event.objects.all().count(), 3)
360
361
        os = Os.objects.get()
362
        req = Request.objects.get()
363
        app_req = AppRequest.objects.get()
364
        events = Event.objects.all()
365
366
        self.assertEqual(os.platform, 'win')
367
        self.assertEqual(os.version, '6.1')
368
        self.assertEqual(os.sp, '')
369
        self.assertEqual(os.arch, 'x64')
370
371
        self.assertEqual(req.version, Request._meta.get_field_by_name('version')[0].to_python('1.3.23.0'))
372
        self.assertEqual(req.ismachine, 1)
373
        self.assertEqual(req.sessionid, '{2882CF9B-D9C2-4edb-9AAF-8ED5FCF366F7}')
374
        self.assertEqual(req.userid, '{D0BBD725-742D-44ae-8D46-0231E881D58E}')
375
        self.assertEqual(req.originurl, None)
376
        self.assertEqual(req.testsource, 'ossdev')
377
        self.assertEqual(req.updaterchannel, None)
378
        self.assertEqual(req.os, os)
379
        self.assertEqual(req.hw, None)
380
381
        self.assertEqual(app_req.version, None)
382
        self.assertEqual(app_req.nextversion, Request._meta.get_field_by_name('version')[0].to_python('13.0.782.112'))
383
        self.assertEqual(app_req.lang, 'en')
384
        self.assertEqual(app_req.tag, 'stable')
385
        self.assertEqual(app_req.installage, 6)
386
        self.assertEqual(app_req.appid, '{D0AB2EBC-931B-4013-9FEB-C9C4C2225C8C}')
387
        self.assertEqual(app_req.request, req)
388
389
        event = events[0]
390
391
        self.assertEqual(event.eventtype, 9)
392
        self.assertEqual(event.eventresult, 1)
393
        self.assertEqual(event.errorcode, 0)
394
        self.assertEqual(event.extracode1, 0)
395
        self.assertEqual(event.download_time_ms, None)
396
        self.assertEqual(event.downloaded, None)
397
        self.assertEqual(event.total, None)
398
        self.assertEqual(event.update_check_time_ms, None)
399
        self.assertEqual(event.install_time_ms, None)
400
        self.assertEqual(event.source_url_index, None)
401
        self.assertEqual(event.state_cancelled, None)
402
        self.assertEqual(event.time_since_update_available_ms, None)
403
        self.assertEqual(event.time_since_download_start_ms, None)
404
        self.assertEqual(event.nextversion, None)
405
        self.assertEqual(event.previousversion, None)
406
407
        for e in events:
408
            self.assertIn(e, app_req.events.all())
409
410
    def test_live_statistics_install(self):
411
        request = parse_request(fixtures.request_event_install_success)
412
        apps = request.findall('app')
413
        app = apps[0]
414
        channel = DEFAULT_CHANNEL
415
        now = datetime.utcnow()
416
        userid = 1
417
        platform = 'win'
418
419
        appid = app.get('appid')
420
        version_1 = '0.0.0.1'
421
        version_2 = '0.0.0.2'
422
        events_appid_version = lambda version: HourEvents('request:{}:{}'.format(appid, version), now.year, now.month, now.day, now.hour)
423
        events_appid_platform_version = lambda version: HourEvents('request:{}:{}:{}'.format(appid, platform, version), now.year, now.month, now.day, now.hour)
424
        events_appid_platform_channel_version = lambda version: HourEvents(
425
            'request:{}:{}:{}:{}'.format(appid, platform, channel, version), now.year, now.month, now.day, now.hour)
426
427
        self.assertEqual(len(events_appid_version(version_1)), 0)
428
        self.assertEqual(len(events_appid_platform_version(version_1)), 0)
429
        self.assertEqual(len(events_appid_platform_channel_version(version_1)), 0)
430
        userid_counting(userid, apps, platform)
431
        self.assertEqual(len(events_appid_version(version_1)), 1)
432
        self.assertEqual(len(events_appid_platform_version(version_1)), 1)
433
        self.assertEqual(len(events_appid_platform_channel_version(version_1)), 1)
434
435
        request = parse_request(fixtures.request_event_update_success)
436
        apps = request.findall('app')
437
438
        userid_counting(userid, apps, platform)
439
440
        self.assertEqual(len(events_appid_version(version_1)), 0)
441
        self.assertEqual(len(events_appid_platform_version(version_1)), 0)
442
        self.assertEqual(len(events_appid_platform_channel_version(version_1)), 0)
443
        self.assertEqual(len(events_appid_version(version_2)), 1)
444
        self.assertEqual(len(events_appid_platform_version(version_2)), 1)
445
        self.assertEqual(len(events_appid_platform_channel_version(version_2)), 1)
446
447
        request = parse_request(fixtures.request_event_uninstall_success)
448
        apps = request.findall('app')
449
450
        userid_counting(userid, apps, platform)
451
452
        self.assertEqual(len(events_appid_version(version_2)), 1)
453
        self.assertEqual(len(events_appid_platform_version(version_2)), 1)
454
        self.assertEqual(len(events_appid_platform_channel_version(version_2)), 1)
455
456
    def test_live_statistics_updatecheck(self):
457
        request = parse_request(fixtures.request_update_check)
458
        apps = request.findall('app')
459
        app = apps[0]
460
        channel = DEFAULT_CHANNEL
461
        now = datetime.utcnow()
462
        userid = 1
463
        platform = 'win'
464
465
        appid = app.get('appid')
466
        version = app.get('version')
467
468
        events_appid_version = HourEvents('request:{}:{}'.format(appid, version), now.year, now.month, now.day, now.hour)
469
        events_appid_platform_version = HourEvents('request:{}:{}:{}'.format(appid, platform, version), now.year, now.month, now.day, now.hour)
470
        events_appid_platform_channel_version = HourEvents(
471
            'request:{}:{}:{}:{}'.format(appid, platform, channel, version), now.year, now.month, now.day, now.hour)
472
473
        self.assertEqual(len(events_appid_version), 0)
474
        self.assertEqual(len(events_appid_platform_version), 0)
475
        self.assertEqual(len(events_appid_platform_channel_version), 0)
476
477
        userid_counting(userid, apps, platform)
478
479
        self.assertEqual(len(events_appid_version), 1)
480
        self.assertEqual(len(events_appid_platform_version), 1)
481
        self.assertEqual(len(events_appid_platform_channel_version), 1)
482
483
484
class GetStatisticsTest(TestCase):
485
    maxDiff = None
486
487
    def _generate_fake_statistics(self):
488
        now = datetime.now()
489
        year = now.year
490
        n_users = 12
491
492
        for i in range(1, n_users+1):
493
            date = datetime(year=year, month=i, day=10)
494
            for id in range(1, i + 1):
495
                user_id = UUID(int=id)
496
                userid_counting(user_id, self.install_app_list, self.platform.name, now=date)
497
                user_id = UUID(int=n_users + id)
498
                mac_userid_counting(user_id, self.mac_app, 'mac', now=date)
499
            userid_counting(UUID(int=i), self.uninstall_app_list, self.platform.name, now=date)
500
501
502
    @temporary_media_root()
503
    def setUp(self):
504
        redis.flushdb()
505
        self.app = Application.objects.create(id='app', name='app')
506
        self.channel = Channel.objects.create(name='stable')
507
        self.platform = Platform.objects.create(name='win')
508
        Platform.objects.create(name='mac')
509
        self.version1 = Version.objects.create(
510
            app=self.app,
511
            platform=self.platform,
512
            channel=self.channel,
513
            version='1.0.0.0',
514
            file=SimpleUploadedFile('./chrome_installer.exe', False))
515
        self.version2 = Version.objects.create(
516
            app=self.app,
517
            platform=self.platform,
518
            channel=self.channel,
519
            version='2.0.0.0',
520
            file=SimpleUploadedFile('./chrome_installer.exe', False))
521
        self.mac_version = SparkleVersion.objects.create(
522
            app=self.app,
523
            channel=self.channel,
524
            version='782.112',
525
            short_version='13.0.782.112',
526
            dsa_signature='MCwCFCdoW13VBGJWIfIklKxQVyetgxE7AhQTVuY9uQT0KOV1UEk21epBsGZMPg==',
527
            file=SimpleUploadedFile('./chrome.dmg', b'_' * 23963192),
528
            file_size=23963192)
529
530
        app_kwargs = dict(appid=self.app.id, version=str(self.version1.version))
531
        install_app = create_app_xml(events=[fixtures.event_install_success], **app_kwargs)
532
        uninstall_app = create_app_xml(events=[fixtures.event_uninstall_success], **app_kwargs)
533
        self.install_app_list = [install_app]
534
        self.uninstall_app_list = [uninstall_app]
535
        self.mac_app = dict(appid=self.app.id, version=str(self.mac_version.short_version))
536
537
        self._generate_fake_statistics()
538
        now = datetime.now()
539
        win_updates = [(datetime(now.year, x, 1).strftime("%Y-%m"), x - 1) for x in range(1, 13)]
540
        win_installs = [(datetime(now.year, x, 1).strftime("%Y-%m"), 1) for x in range(1, 13)]
541
        uninstalls = [(datetime(now.year, x, 1).strftime("%Y-%m"), 1) for x in range(1, 13)]
542
        mac_updates = [(datetime(now.year, x, 1).strftime("%Y-%m"), x - 1) for x in range(1, 13)]
543
        mac_installs = [(datetime(now.year, x, 1).strftime("%Y-%m"), 1) for x in range(1, 13)]
544
        total_installs = map(lambda x, y: (x[0], x[1] + y[1]), win_installs, mac_installs)
545
        total_updates = map(lambda x, y: (x[0], x[1] + y[1]), win_updates, mac_updates)
546
        self.users_statistics = dict(new=total_installs, updates=total_updates, uninstalls=uninstalls)
547
        self.win_users_statistics = dict(new=win_installs, updates=win_updates, uninstalls=uninstalls)
548
        self.mac_users_statistics = dict(new=mac_installs, updates=mac_updates)
549
550
551
    def tearDown(self):
552
        redis.flushdb()
553
554
    def test_get_users_statistics_months(self):
555
        self.assertDictEqual(get_users_statistics_months(app_id=self.app.id), self.users_statistics)
556
        self.assertDictEqual(get_users_statistics_months(app_id=self.app.id, platform='win'), self.win_users_statistics)
557
        self.assertDictEqual(get_users_statistics_months(app_id=self.app.id, platform='mac'), self.mac_users_statistics)
558
559
560
    def test_get_chanels_statistics(self):
561
        now = datetime.now()
562
        with freeze_time(datetime(year=now.year, month=now.month, day=10)):
563
            self.assertListEqual(get_channel_statistics(self.app.id), [('stable', now.month*2)])
564
565
    def test_get_users_versions(self):
566
        now = datetime.now()
567
        expected = dict(win={'1.0.0.0': now.month}, mac={'13.0.782.112': now.month})
568
        with freeze_time(datetime(year=now.year, month=now.month, day=10)):
569
            self.assertDictEqual(get_users_versions(self.app.id), expected)
570