models.main: Fix the tests for {stage,unstage,revert}_paths()
[git-cola.git] / test / test_cola_models_classic.py
blobf6d48e107a97507612873b3dfc084b3a7112e08a
1 """Covers interfaces used by the classic view."""
2 import os
4 import helper
5 from cola.models.main import MainModel
7 class MainModelObserver(object):
8 """Helper class for observing changes to the model."""
9 def __init__(self, model):
10 self.paths = None
11 model.add_message_observer(model.message_paths_staged,
12 self.observe_paths)
13 model.add_message_observer(model.message_paths_unstaged,
14 self.observe_paths)
15 model.add_message_observer(model.message_paths_reverted,
16 self.observe_paths)
18 def observe_paths(self, paths=None):
19 """React to the 'paths_staged' message."""
20 self.paths = paths
23 class ClassicModelTestCase(helper.TestCase):
24 """Tests interfaces used by the classic view."""
26 def setup_baseline_repo(self, commit=True):
27 """Create a baseline repo for testing."""
28 self.shell("""
29 git init >/dev/null &&
30 touch the-file &&
31 git add the-file
32 """)
33 if commit:
34 self.shell("git commit -s -m'Initial commit' >/dev/null")
36 def test_everything(self):
37 """Test the MainModel.everything() method."""
38 self.setup_baseline_repo()
39 self.shell('touch other-file')
41 model = MainModel(cwd=os.getcwd())
42 model.update_status()
44 everything = model.everything()
45 self.assertTrue('the-file' in everything)
46 self.assertTrue('other-file' in everything)
48 def test_stage_paths(self):
49 """Test a simple usage of stage_paths()."""
50 self.setup_baseline_repo()
51 self.shell('echo change > the-file')
53 model = MainModel(cwd=os.getcwd())
54 observer = MainModelObserver(model)
55 model.stage_paths(['the-file'])
57 self.assertTrue('the-file' in observer.paths)
59 def test_stage_paths_subdir(self):
60 """Test stage_paths() in a subdirectory."""
61 self.setup_baseline_repo()
62 self.shell("""
63 mkdir -p foo/bar &&
64 touch foo/bar/baz &&
65 git add foo/bar/baz &&
66 echo change > foo/bar/baz
67 """)
69 model = MainModel(cwd=os.getcwd())
70 observer = MainModelObserver(model)
72 model.stage_paths(['foo'])
74 self.assertTrue('foo' in observer.paths)
75 self.assertTrue('foo/bar' in observer.paths)
76 self.assertTrue('foo/bar/baz' in observer.paths)
78 self.shell('echo change >> foo/bar/baz')
80 model.stage_paths(['foo/bar/baz'])
82 self.assertTrue('foo/bar/baz' in observer.paths)
83 self.assertTrue('foo/bar' in observer.paths)
84 self.assertTrue('foo' in observer.paths)
86 def test_stage_paths_untracked(self):
87 """Test stage_paths() with an untracked file."""
88 self.setup_baseline_repo()
89 self.shell("""
90 mkdir -p foo/bar &&
91 touch foo/bar/baz
92 """)
94 model = MainModel(cwd=os.getcwd())
95 observer = MainModelObserver(model)
97 model.stage_paths(['foo'])
99 self.assertTrue('foo' in observer.paths)
100 self.assertTrue('foo/bar' in observer.paths)
101 self.assertTrue('foo/bar/baz' in observer.paths)
102 self.assertTrue('foo/bar/baz' in model.staged)
103 self.assertTrue('foo/bar/baz' not in model.modified)
104 self.assertTrue('foo/bar/baz' not in model.untracked)
106 def test_unstage_paths(self):
107 """Test a simple usage of unstage_paths()."""
108 self.setup_baseline_repo()
109 self.shell("""
110 echo change > the-file &&
111 git add the-file
112 """)
114 model = MainModel(cwd=os.getcwd())
115 observer = MainModelObserver(model)
116 model.unstage_paths(['the-file'])
118 self.assertTrue('the-file' in observer.paths)
119 self.assertTrue('the-file' not in model.staged)
120 self.assertTrue('the-file' in model.modified)
122 def test_unstage_paths_init(self):
123 """Test unstage_paths() on the root commit."""
124 self.setup_baseline_repo(commit=False)
126 model = MainModel(cwd=os.getcwd())
127 observer = MainModelObserver(model)
129 model.unstage_paths(['the-file'])
131 self.assertTrue('the-file' in observer.paths)
132 self.assertTrue('the-file' not in model.staged)
133 self.assertTrue('the-file' in model.untracked)
135 def test_unstage_paths_subdir(self):
136 """Test unstage_paths() in a subdirectory."""
137 self.setup_baseline_repo()
138 self.shell("""
139 mkdir -p foo/bar &&
140 touch foo/bar/baz &&
141 git add foo/bar/baz
142 """)
144 model = MainModel(os.getcwd())
145 observer = MainModelObserver(model)
147 model.unstage_paths(['foo'])
149 self.assertTrue('foo' in observer.paths)
150 self.assertTrue('foo/bar' in observer.paths)
151 self.assertTrue('foo/bar/baz' in observer.paths)
152 self.assertTrue('foo/bar/baz' in model.untracked)
153 self.assertTrue('foo/bar/baz' not in model.staged)
155 def test_revert_paths(self):
156 """Test a simple use of 'revert_paths'."""
157 self.setup_baseline_repo()
158 self.shell('echo change > the-file')
160 model = MainModel(cwd=os.getcwd())
161 observer = MainModelObserver(model)
162 model.revert_paths(['the-file'])
164 self.assertTrue('the-file' in observer.paths)
165 self.assertTrue('the-file' not in model.staged)
166 self.assertTrue('the-file' not in model.modified)
168 def test_revert_paths_subdir(self):
169 self.setup_baseline_repo()
170 self.shell("""
171 mkdir -p foo/bar &&
172 touch foo/bar/baz &&
173 git add foo/bar/baz &&
174 git commit -m'Changed foo/bar/baz' >/dev/null &&
175 echo change > foo/bar/baz
176 """)
178 model = MainModel(cwd=os.getcwd())
179 observer = MainModelObserver(model)
180 model.revert_paths(['foo'])
182 self.assertTrue('foo' in observer.paths)
183 self.assertTrue('foo/bar' in observer.paths)
184 self.assertTrue('foo/bar/baz' in observer.paths)
185 self.assertTrue('foo/bar/baz' not in model.modified)
186 self.assertTrue('foo/bar/baz' not in model.staged)