Completed
Push — master ( 8d80e2...82fff3 )
by
unknown
45s
created

CrashS3Test.tearDown()   A

Complexity

Conditions 1

Size

Total Lines 3

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 3
rs 10
1
from django.test import TestCase, override_settings
2
3
import moto
4
import boto
5
import mock
6
7
from crash.factories import CrashFactoryWithFiles, SymbolsFactory
8
from feedback.factories import FeedbackFactory
9
from omaha.factories import VersionFactory
10
from sparkle.factories import SparkleVersionFactory
11
12
from crash.models import Crash, Symbols
13
from feedback.models import Feedback
14
from omaha.models import Version
15
from sparkle.models import SparkleVersion
16
from omaha_server.utils import storage_with_spaces_instance
17
from omaha.limitation import bulk_delete
18
from storages.backends.s3boto import S3BotoStorage
19
20
21
class BaseS3Test(object):
22
    model = None
23
    factory = None
24 View Code Duplication
    file_fields = None
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
25
26
    @moto.mock_s3
27
    def test_model_delete(self):
28
        conn = boto.connect_s3()
29
        conn.create_bucket('test')
30
        obj = self.factory()
31
32
        keys = conn.get_bucket('test').get_all_keys()
33
        keys = [key.name for key in keys]
34
        for field in self.file_fields:
35
            self.assertIn(getattr(obj, field).name, keys)
36
37
        obj.delete()
38
        keys = conn.get_bucket('test').get_all_keys()
39 View Code Duplication
        self.assertFalse(keys)
0 ignored issues
show
Duplication introduced by
This code seems to be duplicated in your project.
Loading history...
40
41
    @moto.mock_s3
42
    def test_model_update(self):
43
        conn = boto.connect_s3()
44
        conn.create_bucket('test')
45
        obj = self.factory()
46
        new_obj = self.factory()
47
48
        old_keys = conn.get_bucket('test').get_all_keys()
49
        old_keys = [key.name for key in old_keys]
50
51
        for field in self.file_fields:
52
            self.assertIn(getattr(obj, field).name, old_keys)
53
            setattr(obj, field, getattr(new_obj, field))
54
            obj.save()
55
56
        new_keys = conn.get_bucket('test').get_all_keys()
57
        self.assertFalse(set(old_keys) & set(new_keys))
58
59
    @moto.mock_s3
60
    def test_bulk_delete(self):
61
        conn = boto.connect_s3()
62
        conn.create_bucket('test')
63
        self.factory.create_batch(10)
64
        qs = self.model.objects.all()
65
        self.assertEqual(qs.count(), 10)
66
        keys = conn.get_bucket('test').get_all_keys()
67
        self.assertEqual(len(keys), len(self.file_fields) * 10)
68
        with mock.patch('boto.__init__') as my_mock:
69
            my_mock.connect_s3.return_value = conn
70
            try:                                    # When we try to delete nonexistent key from s3 in pre_delete signal
71
                bulk_delete(self.model, qs)         # original boto doesn't raise S3ResponseError: 404 Not Found
72
            except boto.exception.S3ResponseError:  # but mocked boto does
73
                pass
74
75
        keys = conn.get_bucket('test').get_all_keys()
76
        self.assertFalse(keys)
77
78
79
@override_settings(DEFAULT_FILE_STORAGE='storages.backends.s3boto.S3BotoStorage')
80
class CrashS3Test(BaseS3Test, TestCase):
81
    def setUp(self):
82
        self._file_field = self.model._meta.get_field_by_name('upload_file_minidump')[0]
83
        self._archive_field = self.model._meta.get_field_by_name('archive')[0]
84
        self._default_storage = self._file_field.storage
85
        test_storage = S3BotoStorage()
86
        self._file_field.storage = test_storage
87
        self._archive_field.storage = test_storage
88
89
    def tearDown(self):
90
        self._file_field.storage = self._default_storage
91
        self._archive_field.storage = self._default_storage
92
93
    model = Crash
94
    factory = CrashFactoryWithFiles
95
    file_fields = ['archive', 'upload_file_minidump']
96
97
98
@override_settings(DEFAULT_FILE_STORAGE='storages.backends.s3boto.S3BotoStorage')
99
class FeedbackS3Test(BaseS3Test, TestCase):
100
    model = Feedback
101
    factory = FeedbackFactory
102
    file_fields = ['screenshot', 'blackbox', 'system_logs', 'attached_file']
103
104
@override_settings(DEFAULT_FILE_STORAGE='storages.backends.s3boto.S3BotoStorage')
105
class SymbolsS3Test(BaseS3Test, TestCase):
106
    model = Symbols
107
    factory = SymbolsFactory
108
    file_fields = ['file']
109
110
    def setUp(self):
111
        storage_with_spaces_instance._setup()
112
113
114
115
@override_settings(DEFAULT_FILE_STORAGE='storages.backends.s3boto.S3BotoStorage')
116
class OmahaVersionS3Test(BaseS3Test, TestCase):
117
    model = Version
118
    factory = VersionFactory
119
    file_fields = ['file']
120
121
122
@override_settings(DEFAULT_FILE_STORAGE='storages.backends.s3boto.S3BotoStorage')
123
class SparkleVersionS3Test(BaseS3Test, TestCase):
124
    model = SparkleVersion
125
    factory = SparkleVersionFactory
126
    file_fields = ['file']
127