Пример #1
0
    def setup(self):
        self.exporter = Exporter('csv', None, ('id', 'parent__id', 'value'), True)

        self.modeladmin = admin.ModelAdmin(RelatedMockModel, admin.site)

        parent = MockModel.objects.create()
        for i in range(0, 3):
            RelatedMockModel.objects.create(parent=parent, value=u'汉')
        self.objects = RelatedMockModel.objects.all().order_by('pk')
Пример #2
0
class TestExporter:
    def setup(self):
        self.exporter = Exporter('csv', None, ('id', 'parent__id', 'value'), True)

        self.modeladmin = admin.ModelAdmin(RelatedMockModel, admin.site)

        parent = MockModel.objects.create()
        for i in range(0, 3):
            RelatedMockModel.objects.create(parent=parent, value=u'汉')
        self.objects = RelatedMockModel.objects.all().order_by('pk')

    def test_get_filename(self):
        expected = 'mockapp_relatedmockmodel_%s.csv' % date.today().strftime('%Y-%m-%d')
        assert self.exporter.get_filename(self.modeladmin) == expected

        self.exporter.export_type = 'xlsx'
        expected = 'mockapp_relatedmockmodel_%s.xlsx' % date.today().strftime('%Y-%m-%d')
        assert self.exporter.get_filename(self.modeladmin) == expected

    def test_get_header(self):
        assert self.exporter.get_header(self.objects) == [
            'ID',
            'ID',  # Parent id
            'value'
        ]

    def test_get_header_unknown_field(self):
        self.exporter.fields += ('unknown_field',)
        assert self.exporter.get_header(self.objects) == [
            'ID',
            'ID',  # Parent id
            'value',
            'unknown_field'
        ]

    def test_get_data(self):
        data = self.exporter.get_data(self.objects)
        assert data[0] == self.exporter.fields
        assert len(data[1]) == len(self.objects)

    def test_export_csv(self, rf):
        response = self.exporter.export_as_csv(self.modeladmin, rf.get('/'), self.objects)
        assert response['Content-type'] == 'text/csv'

        lines = force_text(response.content).split('\n')

        # Test header
        assert 'ID' in lines[0]

        # Test data
        for i, obj in enumerate(self.objects, start=1):
            assert lines[i].startswith(str(obj.pk))

    def test_export_xlsx(self, rf):
        response = self.exporter.export_as_xlsx(self.modeladmin, rf.get('/'), self.objects)
        exp = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
        assert response['Content-type'] == exp

    def test_export_xlsx_no_header(self, rf):
        self.exporter.header = False
        response = self.exporter.export_as_xlsx(self.modeladmin, rf.get('/'), self.objects)
        exp = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
        assert response['Content-type'] == exp

    def test_export_csv_no_header(self, rf):
        self.exporter.header = False
        response = self.exporter.export_as_csv(self.modeladmin, rf.get('/'), self.objects)
        assert response['Content-type'] == 'text/csv'

        lines = force_text(response.content).split('\n')
        assert 'ID' not in lines[0]

    def test_export_csv_unicode(self, rf):
        response = self.exporter.export_as_csv(self.modeladmin, rf.get('/'), self.objects)
        assert response['Content-type'] == 'text/csv'

        lines = force_text(response.content).split('\n')
        assert lines == [
            u'ID,ID,value\r',
            u'1,1,\u6c49\r',
            u'2,1,\u6c49\r',
            u'3,1,\u6c49\r',
            u''
        ]

    def test_factory(self):
        func = action_export_factory('csv')
        assert func.__name__ == 'export_csv_func'

        func = action_export_factory('xlsx')
        assert func.__name__ == 'export_xlsx_func'

        with pytest.raises(ImproperlyConfigured):
            action_export_factory('test')

    @mock.patch('barbeque.exporter.Exporter.export_as_xlsx')
    @mock.patch('barbeque.exporter.Exporter.export_as_csv')
    def test_factory_call_csv(self, func_mock, func_mock2):
        func = action_export_factory('csv')
        func()
        assert func_mock.call_count == 1
        assert func_mock2.call_count == 0

    @mock.patch('barbeque.exporter.Exporter.export_as_xlsx')
    @mock.patch('barbeque.exporter.Exporter.export_as_csv')
    def test_factory_call_xlsx(self, func_mock, func_mock2):
        func = action_export_factory('xlsx')
        func()
        assert func_mock.call_count == 0
        assert func_mock2.call_count == 1

    def test_get_value_override(self, rf):
        class SubExporter(Exporter):
            def get_value(self, field, value):
                if field == 'parent__id':
                    return 'prefixed{0}'.format(value)
                return super(SubExporter, self).get_value(field, value)

        exporter = SubExporter('csv', None, ('id', 'parent__id'), True)
        response = exporter.export_as_csv(self.modeladmin, rf.get('/'), self.objects)
        assert response['Content-type'] == 'text/csv'
        lines = force_text(response.content).splitlines()
        assert lines == [
            u'ID,ID',
            u'1,prefixed1',
            u'2,prefixed1',
            u'3,prefixed1',
        ]