7 from StringIO import StringIO
8 from lib.simple_config import SimpleConfig, read_system_config
11 class Test_SimpleConfig(unittest.TestCase):
14 super(Test_SimpleConfig, self).setUp()
15 # make sure "read_user_config" and "user_dir" return a temporary directory.
16 self.electrum_dir = tempfile.mkdtemp()
17 # Do the same for the user dir to avoid overwriting the real configuration
18 # for development machines with electrum installed :)
19 self.user_dir = tempfile.mkdtemp()
21 self.options = {"electrum_path": self.electrum_dir}
22 self._saved_stdout = sys.stdout
23 self._stdout_buffer = StringIO()
24 sys.stdout = self._stdout_buffer
27 super(Test_SimpleConfig, self).tearDown()
28 # Remove the temporary directory after each test (to make sure we don't
29 # pollute /tmp for nothing.
30 shutil.rmtree(self.electrum_dir)
31 shutil.rmtree(self.user_dir)
33 # Restore the "real" stdout
34 sys.stdout = self._saved_stdout
36 def test_simple_config_command_line_overrides_everything(self):
37 """Options passed by command line override all other configuration
39 fake_read_system = lambda : {"electrum_path": "a"}
40 fake_read_user = lambda _: {"electrum_path": "b"}
41 read_user_dir = lambda : self.user_dir
42 config = SimpleConfig(options=self.options,
43 read_system_config_function=fake_read_system,
44 read_user_config_function=fake_read_user,
45 read_user_dir_function=read_user_dir)
46 self.assertEqual(self.options.get("electrum_path"),
47 config.get("electrum_path"))
49 def test_simple_config_system_config_overrides_user_config(self):
50 """Options passed in system config override user config."""
51 fake_read_system = lambda : {"electrum_path": self.electrum_dir}
52 fake_read_user = lambda _: {"electrum_path": "b"}
53 read_user_dir = lambda : self.user_dir
54 config = SimpleConfig(options=None,
55 read_system_config_function=fake_read_system,
56 read_user_config_function=fake_read_user,
57 read_user_dir_function=read_user_dir)
58 self.assertEqual(self.options.get("electrum_path"),
59 config.get("electrum_path"))
61 def test_simple_config_system_config_ignored_if_portable(self):
62 """If electrum is started with the "portable" flag, system
63 configuration is completely ignored."""
64 another_path = tempfile.mkdtemp()
65 fake_read_system = lambda : {"electrum_path": self.electrum_dir}
66 fake_read_user = lambda _: {"electrum_path": another_path}
67 read_user_dir = lambda : self.user_dir
68 config = SimpleConfig(options={"portable": True},
69 read_system_config_function=fake_read_system,
70 read_user_config_function=fake_read_user,
71 read_user_dir_function=read_user_dir)
72 self.assertEqual(another_path, config.get("electrum_path"))
74 def test_simple_config_user_config_is_used_if_others_arent_specified(self):
75 """If no system-wide configuration and no command-line options are
76 specified, the user configuration is used instead."""
77 fake_read_system = lambda : {}
78 fake_read_user = lambda _: {"electrum_path": self.electrum_dir}
79 read_user_dir = lambda : self.user_dir
80 config = SimpleConfig(options=None,
81 read_system_config_function=fake_read_system,
82 read_user_config_function=fake_read_user,
83 read_user_dir_function=read_user_dir)
84 self.assertEqual(self.options.get("electrum_path"),
85 config.get("electrum_path"))
87 def test_cannot_set_options_passed_by_command_line(self):
88 fake_read_system = lambda : {}
89 fake_read_user = lambda _: {"electrum_path": "b"}
90 read_user_dir = lambda : self.user_dir
91 config = SimpleConfig(options=self.options,
92 read_system_config_function=fake_read_system,
93 read_user_config_function=fake_read_user,
94 read_user_dir_function=read_user_dir)
95 config.set_key("electrum_path", "c")
96 self.assertEqual(self.options.get("electrum_path"),
97 config.get("electrum_path"))
99 def test_cannot_set_options_from_system_config(self):
100 fake_read_system = lambda : {"electrum_path": self.electrum_dir}
101 fake_read_user = lambda _: {}
102 read_user_dir = lambda : self.user_dir
103 config = SimpleConfig(options={},
104 read_system_config_function=fake_read_system,
105 read_user_config_function=fake_read_user,
106 read_user_dir_function=read_user_dir)
107 config.set_key("electrum_path", "c")
108 self.assertEqual(self.options.get("electrum_path"),
109 config.get("electrum_path"))
111 def test_can_set_options_set_in_user_config(self):
112 another_path = tempfile.mkdtemp()
113 fake_read_system = lambda : {}
114 fake_read_user = lambda _: {"electrum_path": self.electrum_dir}
115 read_user_dir = lambda : self.user_dir
116 config = SimpleConfig(options={},
117 read_system_config_function=fake_read_system,
118 read_user_config_function=fake_read_user,
119 read_user_dir_function=read_user_dir)
120 config.set_key("electrum_path", another_path)
121 self.assertEqual(another_path, config.get("electrum_path"))
123 def test_can_set_options_from_system_config_if_portable(self):
124 """If the "portable" flag is set, the user can overwrite system
125 configuration options."""
126 another_path = tempfile.mkdtemp()
127 fake_read_system = lambda : {"electrum_path": self.electrum_dir}
128 fake_read_user = lambda _: {}
129 read_user_dir = lambda : self.user_dir
130 config = SimpleConfig(options={"portable": True},
131 read_system_config_function=fake_read_system,
132 read_user_config_function=fake_read_user,
133 read_user_dir_function=read_user_dir)
134 config.set_key("electrum_path", another_path)
135 self.assertEqual(another_path, config.get("electrum_path"))
138 class TestSystemConfig(unittest.TestCase):
149 super(TestSystemConfig, self).setUp()
150 self.thefile = tempfile.mkstemp(suffix=".electrum.test.conf")[1]
153 os.remove(self.thefile)
155 def test_read_system_config_file_does_not_exist(self):
156 somefile = "/foo/I/do/not/exist/electrum.conf"
157 result = read_system_config(somefile)
158 self.assertEqual({}, result)
160 def test_read_system_config_file_returns_file_options(self):
161 with open(self.thefile, "w") as f:
162 f.write(self.sample_conf)
164 result = read_system_config(self.thefile)
165 self.assertEqual({"gap_limit": "5"}, result)
167 def test_read_system_config_file_no_sections(self):
169 with open(self.thefile, "w") as f:
170 f.write("gap_limit = 5") # The file has no sections at all
172 result = read_system_config(self.thefile)
173 self.assertEqual({}, result)