272
357
self.assertEqual(branch.base, location_config.location)
273
358
self.failUnless(location_config is my_config._get_location_config())
360
def test_get_config(self):
361
"""The Branch.get_config method works properly"""
362
b = BzrDir.create_standalone_workingtree('.').branch
363
my_config = b.get_config()
364
self.assertIs(my_config.get_user_option('wacky'), None)
365
my_config.set_user_option('wacky', 'unlikely')
366
self.assertEqual(my_config.get_user_option('wacky'), 'unlikely')
368
# Ensure we get the same thing if we start again
369
b2 = Branch.open('.')
370
my_config2 = b2.get_config()
371
self.assertEqual(my_config2.get_user_option('wacky'), 'unlikely')
373
def test_has_explicit_nickname(self):
374
b = self.make_branch('.')
375
self.assertFalse(b.get_config().has_explicit_nickname())
377
self.assertTrue(b.get_config().has_explicit_nickname())
379
def test_config_url(self):
380
"""The Branch.get_config will use section that uses a local url"""
381
branch = self.make_branch('branch')
382
self.assertEqual('branch', branch.nick)
384
locations = config.locations_config_filename()
385
config.ensure_config_dir_exists()
386
local_url = urlutils.local_path_to_url('branch')
387
open(locations, 'wb').write('[%s]\nnickname = foobar'
389
self.assertEqual('foobar', branch.nick)
391
def test_config_local_path(self):
392
"""The Branch.get_config will use a local system path"""
393
branch = self.make_branch('branch')
394
self.assertEqual('branch', branch.nick)
396
locations = config.locations_config_filename()
397
config.ensure_config_dir_exists()
398
open(locations, 'wb').write('[%s/branch]\nnickname = barry'
399
% (osutils.getcwd().encode('utf8'),))
400
self.assertEqual('barry', branch.nick)
402
def test_config_creates_local(self):
403
"""Creating a new entry in config uses a local path."""
404
branch = self.make_branch('branch', format='knit')
405
branch.set_push_location('http://foobar')
406
locations = config.locations_config_filename()
407
local_path = osutils.getcwd().encode('utf8')
408
# Surprisingly ConfigObj doesn't create a trailing newline
409
self.check_file_contents(locations,
410
'[%s/branch]\npush_location = http://foobar\npush_location:policy = norecurse' % (local_path,))
412
def test_autonick_urlencoded(self):
413
b = self.make_branch('!repo')
414
self.assertEqual('!repo', b.get_config().get_nickname())
276
417
class TestGlobalConfigItems(TestCase):
278
419
def test_user_id(self):
279
config_file = StringIO(sample_config_text)
420
config_file = StringIO(sample_config_text.encode('utf-8'))
280
421
my_config = config.GlobalConfig()
281
422
my_config._parser = my_config._get_parser(file=config_file)
282
self.assertEqual("Robert Collins <robertc@example.com>",
423
self.assertEqual(u"Erik B\u00e5gfors <erik@bagfors.nu>",
283
424
my_config._get_user_id())
285
426
def test_absent_user_id(self):
366
529
# replace the class that is constructured, to check its parameters
367
530
oldparserclass = config.ConfigObj
368
531
config.ConfigObj = InstrumentedConfigObj
369
my_config = config.LocationConfig('http://www.example.com')
533
my_config = config.LocationConfig('http://www.example.com')
371
534
parser = my_config._get_parser()
373
536
config.ConfigObj = oldparserclass
374
537
self.failUnless(isinstance(parser, InstrumentedConfigObj))
375
538
self.assertEqual(parser._calls,
376
[('__init__', config.branches_config_filename())])
539
[('__init__', config.locations_config_filename(),
541
config.ensure_config_dir_exists()
542
#os.mkdir(config.config_dir())
543
f = file(config.branches_config_filename(), 'wb')
546
oldparserclass = config.ConfigObj
547
config.ConfigObj = InstrumentedConfigObj
549
my_config = config.LocationConfig('http://www.example.com')
550
parser = my_config._get_parser()
552
config.ConfigObj = oldparserclass
378
554
def test_get_global_config(self):
379
my_config = config.LocationConfig('http://example.com')
555
my_config = config.BranchConfig(FakeBranch('http://example.com'))
380
556
global_config = my_config._get_global_config()
381
557
self.failUnless(isinstance(global_config, config.GlobalConfig))
382
558
self.failUnless(global_config is my_config._get_global_config())
384
def test__get_section_no_match(self):
385
self.get_location_config('/')
386
self.assertEqual(None, self.my_config._get_section())
560
def test__get_matching_sections_no_match(self):
561
self.get_branch_config('/')
562
self.assertEqual([], self.my_location_config._get_matching_sections())
388
def test__get_section_exact(self):
389
self.get_location_config('http://www.example.com')
390
self.assertEqual('http://www.example.com',
391
self.my_config._get_section())
564
def test__get_matching_sections_exact(self):
565
self.get_branch_config('http://www.example.com')
566
self.assertEqual([('http://www.example.com', '')],
567
self.my_location_config._get_matching_sections())
393
def test__get_section_suffix_does_not(self):
394
self.get_location_config('http://www.example.com-com')
395
self.assertEqual(None, self.my_config._get_section())
397
def test__get_section_subdir_recursive(self):
398
self.get_location_config('http://www.example.com/com')
399
self.assertEqual('http://www.example.com',
400
self.my_config._get_section())
402
def test__get_section_subdir_matches(self):
403
self.get_location_config('http://www.example.com/useglobal')
404
self.assertEqual('http://www.example.com/useglobal',
405
self.my_config._get_section())
407
def test__get_section_subdir_nonrecursive(self):
408
self.get_location_config(
409
'http://www.example.com/useglobal/childbranch')
410
self.assertEqual('http://www.example.com',
411
self.my_config._get_section())
413
def test__get_section_subdir_trailing_slash(self):
414
self.get_location_config('/b')
415
self.assertEqual('/b/', self.my_config._get_section())
417
def test__get_section_subdir_child(self):
418
self.get_location_config('/a/foo')
419
self.assertEqual('/a/*', self.my_config._get_section())
421
def test__get_section_subdir_child_child(self):
422
self.get_location_config('/a/foo/bar')
423
self.assertEqual('/a/', self.my_config._get_section())
425
def test__get_section_trailing_slash_with_children(self):
426
self.get_location_config('/a/')
427
self.assertEqual('/a/', self.my_config._get_section())
429
def test__get_section_explicit_over_glob(self):
430
self.get_location_config('/a/c')
431
self.assertEqual('/a/c', self.my_config._get_section())
433
def get_location_config(self, location, global_config=None):
434
if global_config is None:
435
global_file = StringIO(sample_config_text)
437
global_file = StringIO(global_config)
438
branches_file = StringIO(sample_branches_text)
439
self.my_config = config.LocationConfig(location)
440
self.my_config._get_parser(branches_file)
441
self.my_config._get_global_config()._get_parser(global_file)
569
def test__get_matching_sections_suffix_does_not(self):
570
self.get_branch_config('http://www.example.com-com')
571
self.assertEqual([], self.my_location_config._get_matching_sections())
573
def test__get_matching_sections_subdir_recursive(self):
574
self.get_branch_config('http://www.example.com/com')
575
self.assertEqual([('http://www.example.com', 'com')],
576
self.my_location_config._get_matching_sections())
578
def test__get_matching_sections_ignoreparent(self):
579
self.get_branch_config('http://www.example.com/ignoreparent')
580
self.assertEqual([('http://www.example.com/ignoreparent', '')],
581
self.my_location_config._get_matching_sections())
583
def test__get_matching_sections_ignoreparent_subdir(self):
584
self.get_branch_config(
585
'http://www.example.com/ignoreparent/childbranch')
586
self.assertEqual([('http://www.example.com/ignoreparent', 'childbranch')],
587
self.my_location_config._get_matching_sections())
589
def test__get_matching_sections_subdir_trailing_slash(self):
590
self.get_branch_config('/b')
591
self.assertEqual([('/b/', '')],
592
self.my_location_config._get_matching_sections())
594
def test__get_matching_sections_subdir_child(self):
595
self.get_branch_config('/a/foo')
596
self.assertEqual([('/a/*', ''), ('/a/', 'foo')],
597
self.my_location_config._get_matching_sections())
599
def test__get_matching_sections_subdir_child_child(self):
600
self.get_branch_config('/a/foo/bar')
601
self.assertEqual([('/a/*', 'bar'), ('/a/', 'foo/bar')],
602
self.my_location_config._get_matching_sections())
604
def test__get_matching_sections_trailing_slash_with_children(self):
605
self.get_branch_config('/a/')
606
self.assertEqual([('/a/', '')],
607
self.my_location_config._get_matching_sections())
609
def test__get_matching_sections_explicit_over_glob(self):
610
# XXX: 2006-09-08 jamesh
611
# This test only passes because ord('c') > ord('*'). If there
612
# was a config section for '/a/?', it would get precedence
614
self.get_branch_config('/a/c')
615
self.assertEqual([('/a/c', ''), ('/a/*', ''), ('/a/', 'c')],
616
self.my_location_config._get_matching_sections())
618
def test__get_option_policy_normal(self):
619
self.get_branch_config('http://www.example.com')
621
self.my_location_config._get_config_policy(
622
'http://www.example.com', 'normal_option'),
625
def test__get_option_policy_norecurse(self):
626
self.get_branch_config('http://www.example.com')
628
self.my_location_config._get_option_policy(
629
'http://www.example.com', 'norecurse_option'),
630
config.POLICY_NORECURSE)
631
# Test old recurse=False setting:
633
self.my_location_config._get_option_policy(
634
'http://www.example.com/norecurse', 'normal_option'),
635
config.POLICY_NORECURSE)
637
def test__get_option_policy_normal(self):
638
self.get_branch_config('http://www.example.com')
640
self.my_location_config._get_option_policy(
641
'http://www.example.com', 'appendpath_option'),
642
config.POLICY_APPENDPATH)
443
644
def test_location_without_username(self):
444
self.get_location_config('http://www.example.com/useglobal')
445
self.assertEqual('Robert Collins <robertc@example.com>',
645
self.get_branch_config('http://www.example.com/ignoreparent')
646
self.assertEqual(u'Erik B\u00e5gfors <erik@bagfors.nu>',
446
647
self.my_config.username())
448
649
def test_location_not_listed(self):
449
self.get_location_config('/home/robertc/sources')
450
self.assertEqual('Robert Collins <robertc@example.com>',
650
"""Test that the global username is used when no location matches"""
651
self.get_branch_config('/home/robertc/sources')
652
self.assertEqual(u'Erik B\u00e5gfors <erik@bagfors.nu>',
451
653
self.my_config.username())
453
655
def test_overriding_location(self):
454
self.get_location_config('http://www.example.com/foo')
656
self.get_branch_config('http://www.example.com/foo')
455
657
self.assertEqual('Robert Collins <robertc@example.org>',
456
658
self.my_config.username())
458
660
def test_signatures_not_set(self):
459
self.get_location_config('http://www.example.com',
661
self.get_branch_config('http://www.example.com',
460
662
global_config=sample_ignore_signatures)
461
self.assertEqual(config.CHECK_NEVER,
663
self.assertEqual(config.CHECK_ALWAYS,
462
664
self.my_config.signature_checking())
665
self.assertEqual(config.SIGN_NEVER,
666
self.my_config.signing_policy())
464
668
def test_signatures_never(self):
465
self.get_location_config('/a/c')
669
self.get_branch_config('/a/c')
466
670
self.assertEqual(config.CHECK_NEVER,
467
671
self.my_config.signature_checking())
469
673
def test_signatures_when_available(self):
470
self.get_location_config('/a/', global_config=sample_ignore_signatures)
674
self.get_branch_config('/a/', global_config=sample_ignore_signatures)
471
675
self.assertEqual(config.CHECK_IF_POSSIBLE,
472
676
self.my_config.signature_checking())
474
678
def test_signatures_always(self):
475
self.get_location_config('/b')
679
self.get_branch_config('/b')
476
680
self.assertEqual(config.CHECK_ALWAYS,
477
681
self.my_config.signature_checking())
479
683
def test_gpg_signing_command(self):
480
self.get_location_config('/b')
684
self.get_branch_config('/b')
481
685
self.assertEqual("gnome-gpg", self.my_config.gpg_signing_command())
483
687
def test_gpg_signing_command_missing(self):
484
self.get_location_config('/a')
688
self.get_branch_config('/a')
485
689
self.assertEqual("false", self.my_config.gpg_signing_command())
487
691
def test_get_user_option_global(self):
488
self.get_location_config('/a')
692
self.get_branch_config('/a')
489
693
self.assertEqual('something',
490
694
self.my_config.get_user_option('user_global_option'))
492
696
def test_get_user_option_local(self):
493
self.get_location_config('/a')
697
self.get_branch_config('/a')
494
698
self.assertEqual('local',
495
699
self.my_config.get_user_option('user_local_option'))
701
def test_get_user_option_appendpath(self):
702
# returned as is for the base path:
703
self.get_branch_config('http://www.example.com')
704
self.assertEqual('append',
705
self.my_config.get_user_option('appendpath_option'))
706
# Extra path components get appended:
707
self.get_branch_config('http://www.example.com/a/b/c')
708
self.assertEqual('append/a/b/c',
709
self.my_config.get_user_option('appendpath_option'))
710
# Overriden for http://www.example.com/dir, where it is a
712
self.get_branch_config('http://www.example.com/dir/a/b/c')
713
self.assertEqual('normal',
714
self.my_config.get_user_option('appendpath_option'))
716
def test_get_user_option_norecurse(self):
717
self.get_branch_config('http://www.example.com')
718
self.assertEqual('norecurse',
719
self.my_config.get_user_option('norecurse_option'))
720
self.get_branch_config('http://www.example.com/dir')
721
self.assertEqual(None,
722
self.my_config.get_user_option('norecurse_option'))
723
# http://www.example.com/norecurse is a recurse=False section
724
# that redefines normal_option. Subdirectories do not pick up
726
self.get_branch_config('http://www.example.com/norecurse')
727
self.assertEqual('norecurse',
728
self.my_config.get_user_option('normal_option'))
729
self.get_branch_config('http://www.example.com/norecurse/subdir')
730
self.assertEqual('normal',
731
self.my_config.get_user_option('normal_option'))
733
def test_set_user_option_norecurse(self):
734
self.get_branch_config('http://www.example.com')
735
self.my_config.set_user_option('foo', 'bar',
736
store=config.STORE_LOCATION_NORECURSE)
738
self.my_location_config._get_option_policy(
739
'http://www.example.com', 'foo'),
740
config.POLICY_NORECURSE)
742
def test_set_user_option_appendpath(self):
743
self.get_branch_config('http://www.example.com')
744
self.my_config.set_user_option('foo', 'bar',
745
store=config.STORE_LOCATION_APPENDPATH)
747
self.my_location_config._get_option_policy(
748
'http://www.example.com', 'foo'),
749
config.POLICY_APPENDPATH)
751
def test_set_user_option_change_policy(self):
752
self.get_branch_config('http://www.example.com')
753
self.my_config.set_user_option('norecurse_option', 'normal',
754
store=config.STORE_LOCATION)
756
self.my_location_config._get_option_policy(
757
'http://www.example.com', 'norecurse_option'),
760
def test_set_user_option_recurse_false_section(self):
761
# The following section has recurse=False set. The test is to
762
# make sure that a normal option can be added to the section,
763
# converting recurse=False to the norecurse policy.
764
self.get_branch_config('http://www.example.com/norecurse')
765
self.callDeprecated(['The recurse option is deprecated as of 0.14. '
766
'The section "http://www.example.com/norecurse" '
767
'has been converted to use policies.'],
768
self.my_config.set_user_option,
769
'foo', 'bar', store=config.STORE_LOCATION)
771
self.my_location_config._get_option_policy(
772
'http://www.example.com/norecurse', 'foo'),
774
# The previously existing option is still norecurse:
776
self.my_location_config._get_option_policy(
777
'http://www.example.com/norecurse', 'normal_option'),
778
config.POLICY_NORECURSE)
497
781
def test_post_commit_default(self):
498
self.get_location_config('/a/c')
782
self.get_branch_config('/a/c')
499
783
self.assertEqual('bzrlib.tests.test_config.post_commit',
500
784
self.my_config.post_commit())
503
class TestLocationConfig(TestCaseInTempDir):
505
def get_location_config(self, location, global_config=None):
786
def get_branch_config(self, location, global_config=None):
506
787
if global_config is None:
507
global_file = StringIO(sample_config_text)
788
global_file = StringIO(sample_config_text.encode('utf-8'))
509
global_file = StringIO(global_config)
510
branches_file = StringIO(sample_branches_text)
511
self.my_config = config.LocationConfig(location)
512
self.my_config._get_parser(branches_file)
790
global_file = StringIO(global_config.encode('utf-8'))
791
branches_file = StringIO(sample_branches_text.encode('utf-8'))
792
self.my_config = config.BranchConfig(FakeBranch(location))
793
# Force location config to use specified file
794
self.my_location_config = self.my_config._get_location_config()
795
self.my_location_config._get_parser(branches_file)
796
# Force global config to use specified file
513
797
self.my_config._get_global_config()._get_parser(global_file)
515
799
def test_set_user_setting_sets_and_saves(self):
516
self.get_location_config('/a/c')
800
self.get_branch_config('/a/c')
517
801
record = InstrumentedConfigObj("foo")
518
self.my_config._parser = record
802
self.my_location_config._parser = record
520
804
real_mkdir = os.mkdir
521
805
self.created = False
536
824
('__setitem__', '/a/c', {}),
537
825
('__getitem__', '/a/c'),
538
826
('__setitem__', 'foo', 'bar'),
827
('__getitem__', '/a/c'),
828
('as_bool', 'recurse'),
829
('__getitem__', '/a/c'),
830
('__delitem__', 'recurse'),
831
('__getitem__', '/a/c'),
833
('__getitem__', '/a/c'),
834
('__contains__', 'foo:policy'),
540
836
record._calls[1:])
543
class TestBranchConfigItems(TestCase):
838
def test_set_user_setting_sets_and_saves2(self):
839
self.get_branch_config('/a/c')
840
self.assertIs(self.my_config.get_user_option('foo'), None)
841
self.my_config.set_user_option('foo', 'bar')
843
self.my_config.branch.control_files.files['branch.conf'],
845
self.assertEqual(self.my_config.get_user_option('foo'), 'bar')
846
self.my_config.set_user_option('foo', 'baz',
847
store=config.STORE_LOCATION)
848
self.assertEqual(self.my_config.get_user_option('foo'), 'baz')
849
self.my_config.set_user_option('foo', 'qux')
850
self.assertEqual(self.my_config.get_user_option('foo'), 'baz')
853
precedence_global = 'option = global'
854
precedence_branch = 'option = branch'
855
precedence_location = """
859
[http://example.com/specific]
864
class TestBranchConfigItems(TestCaseInTempDir):
866
def get_branch_config(self, global_config=None, location=None,
867
location_config=None, branch_data_config=None):
868
my_config = config.BranchConfig(FakeBranch(location))
869
if global_config is not None:
870
global_file = StringIO(global_config.encode('utf-8'))
871
my_config._get_global_config()._get_parser(global_file)
872
self.my_location_config = my_config._get_location_config()
873
if location_config is not None:
874
location_file = StringIO(location_config.encode('utf-8'))
875
self.my_location_config._get_parser(location_file)
876
if branch_data_config is not None:
877
my_config.branch.control_files.files['branch.conf'] = \
545
881
def test_user_id(self):
546
branch = FakeBranch()
882
branch = FakeBranch(user_id='Robert Collins <robertc@example.net>')
547
883
my_config = config.BranchConfig(branch)
548
884
self.assertEqual("Robert Collins <robertc@example.net>",
549
my_config._get_user_id())
885
my_config.username())
550
886
branch.control_files.email = "John"
551
self.assertEqual("John", my_config._get_user_id())
887
my_config.set_user_option('email',
888
"Robert Collins <robertc@example.org>")
889
self.assertEqual("John", my_config.username())
890
branch.control_files.email = None
891
self.assertEqual("Robert Collins <robertc@example.org>",
892
my_config.username())
553
894
def test_not_set_in_branch(self):
554
branch = FakeBranch()
555
my_config = config.BranchConfig(branch)
556
branch.control_files.email = None
557
config_file = StringIO(sample_config_text)
558
(my_config._get_location_config().
559
_get_global_config()._get_parser(config_file))
560
self.assertEqual("Robert Collins <robertc@example.com>",
895
my_config = self.get_branch_config(sample_config_text)
896
my_config.branch.control_files.email = None
897
self.assertEqual(u"Erik B\u00e5gfors <erik@bagfors.nu>",
561
898
my_config._get_user_id())
562
branch.control_files.email = "John"
899
my_config.branch.control_files.email = "John"
563
900
self.assertEqual("John", my_config._get_user_id())
565
def test_BZREMAIL_OVERRIDES(self):
566
os.environ['BZREMAIL'] = "Robert Collins <robertc@example.org>"
902
def test_BZR_EMAIL_OVERRIDES(self):
903
os.environ['BZR_EMAIL'] = "Robert Collins <robertc@example.org>"
567
904
branch = FakeBranch()
568
905
my_config = config.BranchConfig(branch)
569
906
self.assertEqual("Robert Collins <robertc@example.org>",
570
907
my_config.username())
572
909
def test_signatures_forced(self):
573
branch = FakeBranch()
574
my_config = config.BranchConfig(branch)
575
config_file = StringIO(sample_always_signatures)
576
(my_config._get_location_config().
577
_get_global_config()._get_parser(config_file))
578
self.assertEqual(config.CHECK_ALWAYS, my_config.signature_checking())
910
my_config = self.get_branch_config(
911
global_config=sample_always_signatures)
912
self.assertEqual(config.CHECK_NEVER, my_config.signature_checking())
913
self.assertEqual(config.SIGN_ALWAYS, my_config.signing_policy())
914
self.assertTrue(my_config.signature_needed())
916
def test_signatures_forced_branch(self):
917
my_config = self.get_branch_config(
918
global_config=sample_ignore_signatures,
919
branch_data_config=sample_always_signatures)
920
self.assertEqual(config.CHECK_NEVER, my_config.signature_checking())
921
self.assertEqual(config.SIGN_ALWAYS, my_config.signing_policy())
922
self.assertTrue(my_config.signature_needed())
580
924
def test_gpg_signing_command(self):
581
branch = FakeBranch()
582
my_config = config.BranchConfig(branch)
583
config_file = StringIO(sample_config_text)
584
(my_config._get_location_config().
585
_get_global_config()._get_parser(config_file))
925
my_config = self.get_branch_config(
926
# branch data cannot set gpg_signing_command
927
branch_data_config="gpg_signing_command=pgp")
928
config_file = StringIO(sample_config_text.encode('utf-8'))
929
my_config._get_global_config()._get_parser(config_file)
586
930
self.assertEqual('gnome-gpg', my_config.gpg_signing_command())
588
932
def test_get_user_option_global(self):
589
933
branch = FakeBranch()
590
934
my_config = config.BranchConfig(branch)
591
config_file = StringIO(sample_config_text)
592
(my_config._get_location_config().
593
_get_global_config()._get_parser(config_file))
935
config_file = StringIO(sample_config_text.encode('utf-8'))
936
(my_config._get_global_config()._get_parser(config_file))
594
937
self.assertEqual('something',
595
938
my_config.get_user_option('user_global_option'))
597
940
def test_post_commit_default(self):
598
941
branch = FakeBranch()
600
my_config = config.BranchConfig(branch)
601
config_file = StringIO(sample_config_text)
602
(my_config._get_location_config().
603
_get_global_config()._get_parser(config_file))
604
branch_file = StringIO(sample_branches_text)
605
my_config._get_location_config()._get_parser(branch_file)
606
self.assertEqual('bzrlib.tests.test_config.post_commit',
607
my_config.post_commit())
942
my_config = self.get_branch_config(sample_config_text, '/a/c',
943
sample_branches_text)
944
self.assertEqual(my_config.branch.base, '/a/c')
945
self.assertEqual('bzrlib.tests.test_config.post_commit',
946
my_config.post_commit())
947
my_config.set_user_option('post_commit', 'rmtree_root')
948
# post-commit is ignored when bresent in branch data
949
self.assertEqual('bzrlib.tests.test_config.post_commit',
950
my_config.post_commit())
951
my_config.set_user_option('post_commit', 'rmtree_root',
952
store=config.STORE_LOCATION)
953
self.assertEqual('rmtree_root', my_config.post_commit())
955
def test_config_precedence(self):
956
my_config = self.get_branch_config(global_config=precedence_global)
957
self.assertEqual(my_config.get_user_option('option'), 'global')
958
my_config = self.get_branch_config(global_config=precedence_global,
959
branch_data_config=precedence_branch)
960
self.assertEqual(my_config.get_user_option('option'), 'branch')
961
my_config = self.get_branch_config(global_config=precedence_global,
962
branch_data_config=precedence_branch,
963
location_config=precedence_location)
964
self.assertEqual(my_config.get_user_option('option'), 'recurse')
965
my_config = self.get_branch_config(global_config=precedence_global,
966
branch_data_config=precedence_branch,
967
location_config=precedence_location,
968
location='http://example.com/specific')
969
self.assertEqual(my_config.get_user_option('option'), 'exact')
610
972
class TestMailAddressExtraction(TestCase):