1from __future__ import with_statement
2from os import path, makedirs, environ
3import shutil
4
5import _mssql
6
7from .helpers import tmpdir, skip_test
8config_dump_path = path.join(tmpdir, 'freetds-config-dump.txt')
9
10def setup_module():
11    if not path.isdir(tmpdir):
12        makedirs(tmpdir)
13
14class TestConfig(object):
15    def connect(self, **kwargs):
16        environ['TDSDUMPCONFIG'] = config_dump_path
17        try:
18            _mssql.connect(**kwargs)
19            assert False
20        except _mssql.MSSQLDriverException as e:
21            # we get this when the name of the server is not valid
22            if 'Connection to the database failed' not in str(e):
23                raise
24        except _mssql.MSSQLDatabaseException as e:
25            # we get this when the name or IP can be obtained but the connection
26            # can not be made
27            if e.args[0][0] != 20009:
28                raise
29        with open(config_dump_path, 'rU') as fh:
30            return fh.read()
31
32    def test_config_values(self):
33        config_dump = self.connect(
34            server='dontnameyourserverthis',
35            user = 'bob',
36            database = 'tempdb',
37            tds_version='7.1'
38            )
39        assert 'user_name = bob' in config_dump
40        assert 'database = tempdb\n' in config_dump
41        # test default port
42        assert 'port = 1433' in config_dump
43        # not sure why 7.1 version is used instead of 8.0 which is the
44        # default
45        assert 'major_version = 7' in config_dump
46        assert 'minor_version = 1' in config_dump
47
48    def test_tds_protocol_version_42(self):
49        config_dump = self.connect(
50            server='dontnameyourserverthis',
51            tds_version='4.2'
52            )
53        assert 'major_version = 4' in config_dump
54        assert 'minor_version = 2' in config_dump
55
56    def test_tds_protocol_version_70(self):
57        config_dump = self.connect(
58            server='dontnameyourserverthis',
59            tds_version='7.0'
60            )
61        assert 'major_version = 7' in config_dump
62        assert 'minor_version = 0' in config_dump
63
64    def test_tds_protocol_version_71(self):
65        config_dump = self.connect(
66            server='dontnameyourserverthis',
67            tds_version='7.1'
68            )
69        assert 'major_version = 7' in config_dump
70        assert 'minor_version = 1' in config_dump
71
72    def test_tds_protocol_version_80(self):
73        # follow-up: turns out 8.0 was erroneous.  MS named the new protocol
74        # 7.1 instead of 8.0, so FreeTDS will accept 8.0 but shows as 7.1.
75        # got that from the FreeTDS mailling list.  New FreeTDS docs,built from
76        # source, have a page that describes the protocol and that page lists
77        # versions 7.0, 7.1, and 7.2 among others.
78
79        config_dump = self.connect(
80            server='dontnameyourserverthis',
81            tds_version='8.0'
82            )
83        assert 'major_version = 7' in config_dump
84        assert 'minor_version = 1' in config_dump
85
86    def test_tds_protocol_version_72(self):
87        config_dump = self.connect(
88            server='dontnameyourserverthis',
89            tds_version='7.2'
90            )
91        assert 'major_version = 7' in config_dump
92        assert 'minor_version = 2' in config_dump
93
94    def test_tds_protocol_version_invalid(self):
95        try:
96            self.connect(tds_version='1.0')
97            assert False
98        except _mssql.MSSQLException as e:
99            assert 'unrecognized tds version: 1.0' == str(e)
100
101    def test_tds_nonstandard_port_int(self):
102        #it should convert it to a string
103        config_dump = self.connect(port=1435)
104        assert 'port = 1435' in config_dump
105