~fabricematrat/charmworld/redirect-charm

« back to all changes in this revision

Viewing changes to charmworld/scripts/tests/test_remove_charm.py

  • Committer: Benji York
  • Date: 2013-11-18 20:38:47 UTC
  • mto: This revision was merged to the branch mainline in revision 465.
  • Revision ID: benji@benjiyork.com-20131118203847-2mfs1w7b8aqy64mr
checkpoint

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# Copyright 2012, 2013, Canonical Ltd.  This software is licensed under the
 
2
# GNU Affero General Public License version 3 (see the file LICENSE.txt).
 
3
 
 
4
from cStringIO import StringIO
 
5
import os
 
6
 
 
7
from charmworld.models import (
 
8
    Charm,
 
9
    CharmSource,
 
10
    construct_charm_id,
 
11
    FeaturedSource,
 
12
)
 
13
from charmworld.scripts import remove_charm
 
14
from charmworld.testing import MongoTestBase
 
15
from charmworld.testing.factory import make_charm
 
16
from charmworld.utils import project_root
 
17
 
 
18
 
 
19
class RemoveCharmScriptTests(MongoTestBase):
 
20
 
 
21
    def setUp(self):
 
22
        super(RemoveCharmScriptTests, self).setUp()
 
23
        # This is a lot of work just to create a new revision of a charm.
 
24
        older_charm = make_charm(self.db)
 
25
        newer_charm_data = older_charm._representation
 
26
        newer_charm_data['store_data']['revision'] += 1
 
27
        newer_charm_data['_id'] = construct_charm_id(newer_charm_data)
 
28
        self.db.charms.insert(newer_charm_data)
 
29
        self.charm = Charm(newer_charm_data)
 
30
        # As a convienience we will create a stderr stand-in here.
 
31
        self.stderr = StringIO()
 
32
        # Be paranoid about the charm actually existing in the database.
 
33
        assert self.db.charms.find_one({'_id': self.charm._id})
 
34
 
 
35
    def is_indexed(self, id_):
 
36
        return self.index_client.get(id_) is not None
 
37
 
 
38
    def test_entry_point_exists(self):
 
39
        # The entry point is wrapped in a script by setuptools.  We want to be
 
40
        # sure the entrypoint actually exists.
 
41
        self.assertIn(
 
42
            'remove-charm = charmworld.scripts.remove_charm:entry_point\n',
 
43
            open(os.path.join(project_root, 'setup.py')).read())
 
44
 
 
45
    def test_script_chides_you_for_not_providing_an_id(self):
 
46
        # If no charm ID is provided on the command line the script prints a
 
47
        # helpful message.
 
48
        exit_status = remove_charm.main([], self.stderr)
 
49
        self.assertEqual(
 
50
            self.stderr.getvalue(),
 
51
            'Please provide the ID of the charm you wish to remove.\n')
 
52
        # A non-zero exit status is set to indicate the error condition.
 
53
        self.assertGreater(exit_status, 0)
 
54
 
 
55
    def test_script_reports_unkown_charm_ids(self):
 
56
        # The script will generate an error message if the given charm ID does
 
57
        # not exist in the DB.
 
58
        exit_status = remove_charm.main(['', 'not a charm ID'], self.stderr)
 
59
        self.assertEqual(
 
60
            self.stderr.getvalue(),
 
61
            "Unknown charm ID: 'not a charm ID'\n")
 
62
        # A non-zero exit status is set to indicate the error condition.
 
63
        self.assertGreater(exit_status, 0)
 
64
 
 
65
    def test_script_removes_charm_from_mongodb(self):
 
66
        # The script removes the charm with the provided ID from the database.
 
67
        # ...we can invoke the script to delete it.
 
68
        exit_status = remove_charm.main(['', self.charm._id], self.stderr)
 
69
        # Lo and behold, the charm is actually gone.
 
70
        self.assertFalse(self.db.charms.find_one({'_id': self.charm._id}))
 
71
        # Silence is a virtue for sucessfully executing programs.
 
72
        self.assertEqual(self.stderr.getvalue(), '')
 
73
        # The exit status signals success.
 
74
        self.assertEqual(exit_status, 0)
 
75
 
 
76
    def test_script_removes_charm_from_featuerd(self):
 
77
        # If a charm is featured, its featured status is revoked by the script.
 
78
        source = FeaturedSource.from_db(self.db)
 
79
        charm_data = self.charm._representation
 
80
        source.set_featured(charm_data, 'charm')
 
81
        exit_status = remove_charm.main(['', self.charm._id], self.stderr)
 
82
        self.assertFalse(source.is_featured(charm_data, 'charm'))
 
83
        # The exit status signals success.
 
84
        self.assertEqual(exit_status, 0)
 
85
 
 
86
    def test_script_removes_charm_from_elastic_search(self):
 
87
        # The charm needs to be indexed so the script can remove it.
 
88
        self.use_index_client()
 
89
        charm_data = self.charm._representation
 
90
        self.index_client.index_charm(charm_data)
 
91
        # Ensure the charm actually got indexed.
 
92
        assert self.is_indexed(charm_data['_id'])
 
93
        # Removing a charm should also remove it from the search engine.
 
94
        exit_status = remove_charm.main(
 
95
            ['', self.charm._id], self.stderr, index_client=self.index_client)
 
96
        # The script removed the charm from the index.
 
97
        self.assertFalse(self.is_indexed(charm_data['_id']))
 
98
        # The exit status signals success.
 
99
        self.assertEqual(exit_status, 0)
 
100
 
 
101
    def test_old_revisions_of_the_charm_are_removed_too(self):
 
102
        # Requesting the removal of a charm by giving a revisioned ID results
 
103
        # in all revisions being removed.
 
104
        charm_data = self.charm._representation
 
105
        # This can't be the best way to find all the revisions of a particular
 
106
        # charm.
 
107
        source = CharmSource(self.db, index_client='fake')
 
108
        # There should exist more than one revision of the charm in the
 
109
        # database.
 
110
        assert len(source.find_all_revisions(charm_data)) > 1
 
111
        # Run the script.
 
112
        exit_status = remove_charm.main(['', self.charm._id], self.stderr)
 
113
        # The script removed all the charm revisions from the database.
 
114
        self.assertEqual(len(source.find_all_revisions(charm_data)), 0)
 
115
        # The exit status signals success.
 
116
        self.assertEqual(exit_status, 0)