Completed
Push — master ( 646ecf...07a97f )
by
unknown
48s
created

FeedbackS3Test

Complexity

Total Complexity 0

Size/Duplication

Total Lines 5
Duplicated Lines 0 %

Importance

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