Completed
Push — develop ( 86b58f...0a86d2 )
by Jace
03:19
created

tests/test_files.py (8 issues)

1
"""Integration tests for file IO."""
2
# pylint: disable=missing-docstring,no-self-use,no-member,misplaced-comparison-constant
0 ignored issues
show
Bad option value 'misplaced-comparison-constant'
Loading history...
Locally disabling missing-docstring (C0111)
Loading history...
Locally disabling no-self-use (R0201)
Loading history...
Locally disabling no-member (E1101)
Loading history...
3
4
import pytest
5
6
import yorm
7
from yorm.types import Integer, String, Float, Boolean, Dictionary, List
8
9
from . import refresh_file_modification_times, log
10
11
12
# CLASSES ######################################################################
13
14
15
class EmptyDictionary(Dictionary):
16
    """Sample dictionary container."""
17
18
19
@yorm.attr(all=Integer)
20
class IntegerList(List):
21
    """Sample list container."""
22
23
24
@yorm.attr(array=IntegerList)
0 ignored issues
show
Too many instance attributes (10/7)
Loading history...
25
@yorm.attr(false=Boolean)
26
@yorm.attr(number_int=Integer)
27 View Code Duplication
@yorm.attr(number_real=Float)
0 ignored issues
show
This code seems to be duplicated in your project.
Loading history...
28
@yorm.attr(object=EmptyDictionary)
29
@yorm.attr(string=String)
30
@yorm.attr(true=Boolean)
31
@yorm.sync("tmp/path/to/{self.category}/{self.name}.yml")
32
class SampleStandardDecorated:
33
    """Sample class using standard attribute types."""
34
35
    def __init__(self, name, category='default'):
36
        self.name = name
37
        self.category = category
38
        # https://docs.python.org/3.4/library/json.html#json.JSONDecoder
39
        self.object = {}
40
        self.array = []
41
        self.string = ""
42
        self.number_int = 0
43
        self.number_real = 0.0
44
        self.true = True
45
        self.false = False
46
        self.null = None
47
48
    def __repr__(self):
49
        return "<decorated {}>".format(id(self))
50
51
52
# TESTS ########################################################################
53
54
55
class TestCreate:
56
    """Integration tests for creating mapped classes."""
57
58
    def test_load_from_existing(self, tmpdir):
59
        """Verify attributes are updated from an existing file."""
60
        tmpdir.chdir()
61
        sample = SampleStandardDecorated('sample')
62
        sample2 = SampleStandardDecorated('sample')
63
        assert sample2.__mapper__.path == sample.__mapper__.path
64
65
        refresh_file_modification_times()
66
67
        log("Changing values in object 1...")
68
        sample.array = [0, 1, 2]
69
        sample.string = "Hello, world!"
70
        sample.number_int = 42
71
        sample.number_real = 4.2
72
        sample.true = True
73
        sample.false = False
74
75
        log("Reading changed values in object 2...")
76
        assert [0, 1, 2] == sample2.array
77
        assert "Hello, world!" == sample2.string
78
        assert 42 == sample2.number_int
79
        assert 4.2 == sample2.number_real
80
        assert True is sample2.true
81
        assert False is sample2.false
82
83
84
class TestDelete:
85
    """Integration tests for deleting files."""
86
87
    def test_read(self, tmpdir):
88
        """Verify a deleted file cannot be read from."""
89
        tmpdir.chdir()
90
        sample = SampleStandardDecorated('sample')
91
        sample.__mapper__.delete()
92
93
        with pytest.raises(FileNotFoundError):
94
            print(sample.string)
95
96
        with pytest.raises(FileNotFoundError):
97
            sample.string = "def456"
98
99
    def test_write(self, tmpdir):
100
        """Verify a deleted file cannot be written to."""
101
        tmpdir.chdir()
102
        sample = SampleStandardDecorated('sample')
103
        sample.__mapper__.delete()
104
105
        with pytest.raises(FileNotFoundError):
106
            sample.string = "def456"
107
108
    def test_multiple(self, tmpdir):
109
        """Verify a deleted file can be deleted again."""
110
        tmpdir.chdir()
111
        sample = SampleStandardDecorated('sample')
112
        sample.__mapper__.delete()
113
        sample.__mapper__.delete()
114
115
116
class TestUpdate:
117
    """Integration tests for updating files/object."""
118
119
    def test_automatic_save_after_first_modification(self, tmpdir):
0 ignored issues
show
Coding Style Naming introduced by
The name test_automatic_save_after_first_modification does not conform to the method naming conventions ([a-z_][a-z0-9_]{2,30}$).

This check looks for invalid names for a range of different identifiers.

You can set regular expressions to which the identifiers must conform if the defaults do not match your requirements.

If your project includes a Pylint configuration file, the settings contained in that file take precedence.

To find out more about Pylint, please refer to their site.

Loading history...
120
        tmpdir.chdir()
121
        sample = SampleStandardDecorated('sample')
122
        assert "number_int: 0\n" in sample.__mapper__.text
123
124
        sample.number_int = 42
125
        assert "number_int: 42\n" in sample.__mapper__.text
126
127
        sample.__mapper__.text = "number_int: true\n"
128
        assert 1 is sample.number_int
129
        assert "number_int: 1\n" in sample.__mapper__.text
130
131
    def test_automatic_save_after_first_modification_on_list(self, tmpdir):
0 ignored issues
show
Coding Style Naming introduced by
The name test_automatic_save_afte...st_modification_on_list does not conform to the method naming conventions ([a-z_][a-z0-9_]{2,30}$).

This check looks for invalid names for a range of different identifiers.

You can set regular expressions to which the identifiers must conform if the defaults do not match your requirements.

If your project includes a Pylint configuration file, the settings contained in that file take precedence.

To find out more about Pylint, please refer to their site.

Loading history...
132
        tmpdir.chdir()
133
        sample = SampleStandardDecorated('sample')
134
        assert "array:\n-\n" in sample.__mapper__.text
135
136
        sample.array.append(42)
137
        assert "array:\n- 42\n" in sample.__mapper__.text
138
139
        sample.__mapper__.text = "array: [true]\n"
140
        iter(sample.array)
141
        assert "array:\n- 1\n" in sample.__mapper__.text
142