Projet

Général

Profil

0001-agendas-treat-remote-ICS-as-UTF-8-if-it-looks-like-i.patch

Frédéric Péters, 11 janvier 2020 12:12

Télécharger (3,41 ko)

Voir les différences:

Subject: [PATCH] agendas: treat remote ICS as UTF-8 if it looks like it
 (#38510)

 chrono/agendas/models.py |  7 +++++++
 tests/test_agendas.py    | 20 ++++++++++++++++++--
 2 files changed, 25 insertions(+), 2 deletions(-)
chrono/agendas/models.py
578 578

  
579 579
        if source is None:
580 580
            source = TimePeriodExceptionSource(desk=self, ics_url=ics_url)
581
        try:
582
            # override response encoding received in HTTP headers as it may
583
            # often be missing and defaults to iso-8859-15.
584
            response.content.decode('utf-8')
585
            response.encoding = 'utf-8'
586
        except UnicodeDecodeError as e:
587
            pass
581 588
        return self._import_timeperiod_exceptions_from_ics(source=source, data=response.text)
582 589

  
583 590
    def import_timeperiod_exceptions_from_ics_file(self, ics_file, source=None):
tests/test_agendas.py
30 30
DTSTART:20170831T170800Z
31 31
DTEND:20170831T203400Z
32 32
SEQUENCE:1
33
SUMMARY:Event 1
33
SUMMARY:Événement 1
34 34
END:VEVENT
35 35
BEGIN:VEVENT
36 36
DTSTAMP:20170824T092855Z
......
211 211
    ics_sample = ContentFile("\n".join(lines), name='sample.ics')
212 212
    with pytest.raises(ICSError) as e:
213 213
        desk.import_timeperiod_exceptions_from_ics_file(ics_sample)
214
    assert 'Event "Event 1" has no start date.' == str(e.value)
214
    assert 'Event "Événement 1" has no start date.' == str(e.value)
215 215

  
216 216

  
217 217
def test_timeperiodexception_creation_from_ics_without_enddt():
......
299 299
    mocked_get.return_value = mocked_response
300 300
    exceptions_count = desk.import_timeperiod_exceptions_from_remote_ics('http://example.com/sample.ics')
301 301
    assert exceptions_count == 2
302
    assert 'Événement 1' in [x.label for x in desk.timeperiodexception_set.all()]
302 303

  
303 304
    mocked_response.text = ICS_SAMPLE_WITH_NO_EVENTS
304 305
    mocked_get.return_value = mocked_response
......
307 308
    assert str(e.value) == "The file doesn't contain any events."
308 309

  
309 310

  
311
@mock.patch('chrono.agendas.models.requests.get')
312
def test_timeperiodexception_remote_ics_encoding(mocked_get):
313
    agenda = Agenda(label=u'Test 8 agenda')
314
    agenda.save()
315
    desk = Desk(label='Test 8 desk', agenda=agenda)
316
    desk.save()
317
    mocked_response = mock.Mock()
318
    mocked_response.content = ICS_SAMPLE.encode('iso-8859-15')
319
    mocked_response.text = ICS_SAMPLE
320
    mocked_get.return_value = mocked_response
321
    exceptions_count = desk.import_timeperiod_exceptions_from_remote_ics('http://example.com/sample.ics')
322
    assert exceptions_count == 2
323
    assert 'Événement 1' in [x.label for x in desk.timeperiodexception_set.all()]
324

  
325

  
310 326
@mock.patch('chrono.agendas.models.requests.get')
311 327
def test_timeperiodexception_creation_from_unreachable_remote_ics(mocked_get):
312 328
    agenda = Agenda(label=u'Test 9 agenda')
313
-