Projet

Général

Profil

0004-matomo-do-not-abort-if-simulated-first-tracking-visi.patch

Nicolas Roche, 06 mai 2019 21:00

Télécharger (7,77 ko)

Voir les différences:

Subject: [PATCH 4/4] matomo: do not abort if simulated first tracking visit
 fails (#32796)

 hobo/matomo/utils.py       | 13 ++++++++++---
 hobo/matomo/views.py       |  5 ++++-
 tests/test_matomo_utils.py | 40 +++++++++++++++++++++++++-------------
 tests/test_matomo_views.py | 37 ++++++++++++++++++++++++++++++-----
 4 files changed, 72 insertions(+), 23 deletions(-)
hobo/matomo/utils.py
307 307
    return 'success'
308 308

  
309 309
def auto_configure_matomo():
310
    """main function"""
310
    """main function
311
    may returns MatomoException raised by ping"""
312
    warning = None
311 313
    tenant_name, site_urls = get_tenant_name_and_public_urls()
312 314
    if tenant_name is None:
313 315
        raise MatomoException("no portal-user's url available")
......
317 319
    id_site = upgrade_site(matomo, tenant_name, site_urls)
318 320
    logme_url = upgrade_user(matomo, tenant_name, id_site)
319 321
    tracking_js = upgrade_javascript_tag(matomo, id_site)
320
    matomo.ping(id_site)
322

  
323
    # simulate a first tracking visit (no matter if it fails)
324
    try:
325
        matomo.ping(id_site)
326
    except MatomoException as exc:
327
        warning = exc
321 328

  
322 329
    # save matomo's variables
323 330
    logme_url_var = get_variable('matomo_logme_url')
324 331
    logme_url_var.value = logme_url
325 332
    logme_url_var.save()
326 333
    put_tracking_js(tracking_js)
327
    return True
334
    return warning
hobo/matomo/views.py
92 92
    success_url = reverse_lazy('matomo-home')
93 93

  
94 94
    def form_valid(self, form):
95
        warning = None
95 96
        try:
96
            auto_configure_matomo()
97
            warning = auto_configure_matomo()
97 98
        except MatomoException as exc:
98 99
            messages.error(self.request, str(exc))
100
        if warning:
101
            messages.warning(self.request, str(warning))
99 102
        return super(EnableAutoView, self).form_valid(form)
100 103

  
101 104
enable_auto = EnableAutoView.as_view()
tests/test_matomo_utils.py
175 175

  
176 176
        # response may be XML or JSON
177 177
        if content[0] == '{':
178
            response.json = mock.MagicMock(return_value = json.loads(content))
179
        else:
180
            response._content = content
178
            response.json = mock.MagicMock(return_value=json.loads(content))
179
        response._content = content
181 180

  
182 181
        response.status_code = 200
183 182
        responses.append(response)
......
662 661
                    DEL_UNKNOWN_USER, MATOMO_SUCCESS,
663 662
                    JAVASCRIPT_TAG, PING_SUCCESS]
664 663
        mocked_post.side_effect = requests_post_mocked_replies(contents)
665
        assert auto_configure_matomo() is True
664
        assert auto_configure_matomo() is None
665
        logme_url_var = get_variable('matomo_logme_url')
666
        assert logme_url_var.value != ''
667
        tracking_js_var = get_variable('visits_tracking_js')
668
        assert tracking_js_var.value == ''
669
        tracking_js2_var = get_variable('cnil_compliant_visits_tracking_js')
670
        assert tracking_js2_var.value != ''
671

  
672
@mock.patch('requests.post')
673
def test_auto_configure_matomo_warning(mocked_post):
674
    tracking_js_var = get_variable('visits_tracking_js', 'js_code')
675

  
676
    Combo.objects.create(base_url='https://combo.dev.publik.love',
677
                         template_name='portal-user')
678
    Wcs.objects.create(base_url='https://wcs.dev.publik.love')
679
    Fargo.objects.create(base_url='https://fargo.dev.publik.love')
680

  
681
    with override_settings(MATOMO_SERVER=CONFIG):
682
        contents = [GET_NO_SITE_FROM_URL, ADD_SITE_SUCCESS,
683
                    DEL_UNKNOWN_USER, MATOMO_SUCCESS,
684
                    JAVASCRIPT_TAG, PING_ERROR]
685
        mocked_post.side_effect = requests_post_mocked_replies(contents)
686
        warning = auto_configure_matomo()
687
        assert 'ping fails' in str(warning)
666 688
        logme_url_var = get_variable('matomo_logme_url')
667 689
        assert logme_url_var.value != ''
668 690
        tracking_js_var = get_variable('visits_tracking_js')
......
697 719
            auto_configure_matomo()
698 720
        tracking_js_var = get_variable('visits_tracking_js')
699 721
        assert tracking_js_var.value == 'js_code'
700

  
701
    with override_settings(MATOMO_SERVER=CONFIG):
702
        contents = [GET_NO_SITE_FROM_URL, ADD_SITE_SUCCESS,
703
                    DEL_UNKNOWN_USER, MATOMO_SUCCESS,
704
                    JAVASCRIPT_TAG, PING_ERROR]
705
        mocked_post.side_effect = requests_post_mocked_replies(contents)
706
        with pytest.raises(MatomoError, match='ping fails'):
707
            auto_configure_matomo()
708
        tracking_js_var = get_variable('visits_tracking_js')
709
        assert tracking_js_var.value == 'js_code'
tests/test_matomo_views.py
64 64
"""
65 65

  
66 66
PING_SUCCESS = '{"status":"success","tracked":1,"invalid":0}'
67
PING_ERROR = 'somethings else'
67
PING_ERROR = '{"status":"not success"}'
68 68

  
69 69
def requests_post_mocked_replies(contents):
70 70
    """buid an iterator for mock's side_effect parameter"""
......
74 74

  
75 75
        # response may be XML or JSON
76 76
        if content[0] == '{':
77
            response.json = mock.MagicMock(return_value = json.loads(content))
78
        else:
79
            response._content = content
77
            response.json = mock.MagicMock(return_value=json.loads(content))
78
        response._content = content
80 79

  
81 80
        response.status_code = 200
82 81
        responses.append(response)
......
180 179
        assert resp3.body.find('Excellent respect of user rights') != -1
181 180

  
182 181
@mock.patch('requests.post')
183
def test_enable_auto_failure(mocked_post, admin_user):
182
def test_enable_auto_warning(mocked_post, admin_user):
183
    """succesfull automatic scenario having final ping failure"""
184
    Combo.objects.create(base_url='https://combo.dev.publik.love',
185
                         template_name='portal-user')
186
    Wcs.objects.create(base_url='https://wcs.dev.publik.love')
187
    Fargo.objects.create(base_url='https://fargo.dev.publik.love')
188

  
189
    contents = [GET_NO_SITE_FROM_URL, ADD_SITE_SUCCESS,
190
                DEL_UNKNOWN_USER, MATOMO_SUCCESS,
191
                JAVASCRIPT_TAG, PING_ERROR]
192

  
193
    mocked_post.side_effect = requests_post_mocked_replies(contents)
194
    with override_settings(MATOMO_SERVER=CONFIG):
195
        app = login(TestApp(application))
196
        resp1 = app.get('/matomo/enable-auto', status=200)
197
        resp2 = resp1.form.submit()
198

  
199
        # call utils.py::auto_configure_matomo()
200
        resp3 = resp2.follow()
201
        print resp3.body
202

  
203
        # expect 'ping fails' warning
204
        assert resp3.body.find('class="warning">ping fails') != -1
205

  
206
        # expect the CNIL compliance message is displayed
207
        assert resp3.body.find('Excellent respect of user rights') != -1
208

  
209
@mock.patch('requests.post')
210
def test_enable_auto_error(mocked_post, admin_user):
184 211
    """error on automatic scenario"""
185 212
    Combo.objects.create(base_url='https://combo.dev.publik.love',
186 213
                         template_name='portal-user')
187
-