def test_get_boolean_data(self):
     boolean_field = DataField("boolean",
                               "BOOL_HEADER",
                               options="Not Bool, Other Thing, True")
     boolean_data = boolean_field.get_data()
     assert isinstance(boolean_data, str)
     assert boolean_data == "TRUE" or boolean_data == "FALSE"
 def test_get_integer_data(self):
     integer_field = DataField("integer",
                               "INT_HEADER",
                               min_length=3,
                               max_length=20)
     integer_data = integer_field.get_data()
     assert isinstance(int(integer_data), int)
     assert 3 <= len(integer_data) <= 20
 def test_get_str_starts_with(self):
     str_field = DataField("STRING",
                           "STRING_HEADER",
                           starts_with="Michael",
                           min_length=10,
                           max_length=12)
     str_data = str_field.get_data()
     assert isinstance(str_data, str)
     assert 10 <= len(str_data) <= 12
     assert str_data.index("Michael") == 0
 def test_get_int_starts_with(self):
     int_field = DataField("INTEGER",
                           "INT_HEADER",
                           starts_with=3000,
                           min_length=15,
                           max_length=15)
     int_data = int_field.get_data()
     assert isinstance(int(int_data), int)
     assert len(int_data) == 15
     assert int_data[:4] == "3000"
 def test_get_string_data_with_characters(self):
     string_field = DataField("STRING",
                              "STRING_HEADER",
                              min_length=10,
                              max_length=50,
                              characters="letters")
     string_data = string_field.get_data()
     assert 10 <= len(string_data) <= 50
     for char in string_data:
         assert char in string.ascii_letters
 def test_get_regexp_data(self):
     regexp_field = DataField("STRING",
                              "REGEXP_HEADER",
                              regexp="\\d{1,2}/\\d{1,2}/\\d{4}")
     regexp_data = regexp_field.get_data()
     pattern = re.compile(regexp_field.regexp)
     match_object = re.match(pattern, regexp_data)
     try:
         match_object.group()
     except AttributeError:
         pytest.fail(
             "Generated data did not match regular expression pattern: {}".
             format(regexp_data))
 def test_invalid_regexp(self):
     with pytest.raises(AssertionError) as e:
         f = DataField("string",
                       "test_field_name",
                       regexp="[]",
                       characters="urlsafe")
     assert "Invalid regular expression syntax `[]`: " in str(e)
    def test_get_options_data(self):
        int_options_field = DataField("INTEGER",
                                      "OPTIONS_HEADER",
                                      options="1, 2, 3, 4, 5, 6, 7, 8, 9, 0",
                                      regexp="\\d{1,2}/\\d{1,2}/\\d{4}")
        int_options_data = int_options_field.get_data()
        assert int_options_data in string.digits
        assert isinstance(int(int_options_data), int)

        string_options_field = DataField(
            "STRING",
            "OPTIONS_HEADER",
            options="1, 2, 3, 4, 5, 6, 7, 8, 9, 0",
            regexp="\\d{1,2}/\\d{1,2}/\\d{4}")
        string_options_data = string_options_field.get_data()
        assert string_options_data in string.digits
        assert isinstance(string_options_data, str)
class TestDataRow:
    # Create a test field for each major type of data for testing.
    integer_field = DataField("integer",
                              "INT_HEADER",
                              min_length=3,
                              max_length=20)
    boolean_field = DataField("Boolean",
                              "BOOL_HEADER",
                              options="Not Bool, Other Thing, True")
    string_field = DataField("STRING",
                             "STRING_HEADER",
                             min_length=10,
                             max_length=50,
                             characters="letters")
    options_field = DataField("string",
                              "OPTIONS_HEADER",
                              options="Not Bool, Other Thing, True")
    regexp_field = DataField("STRING",
                             "REGEXP_HEADER",
                             regexp="\\d{1,2}/\\d{1,2}/\\d{4}")
    test_fields = [
        integer_field, boolean_field, string_field, options_field, regexp_field
    ]
    not_data_field = "Michael test"

    def test_add_data_field(self):
        row = DataRow()
        for field in self.test_fields:
            row.add_data_field(field)
        assert row.field_count == 5
        assert len(row.fields) == 5

    def test_add_not_data_field_fails(self):
        row = DataRow()
        with pytest.raises(AssertionError) as e:
            row.add_data_field(self.not_data_field)
        assert "Only objects of type SnowLibrary.keywords.file_creator.DataField can be added. Instead got: <class 'str'>" in str(
            e)

    def test_create_header_row(self):
        row = DataRow()
        for field in self.test_fields:
            row.add_data_field(field)
        header_row = row.create_header_row()
        for f in row.fields:
            assert f.header in header_row
        assert isinstance(header_row, list)

    def test_create_detail_row(self):
        row = DataRow()
        for field in self.test_fields:
            row.add_data_field(field)
        detail_row = row.create_detail_row()
        for f in row.fields:
            assert f.header not in detail_row
        assert isinstance(detail_row, list)

    def test_data_row_has_no_fields(self):
        """Don't create a row if no fields have been specified. Raise an AssertionError."""
        row = DataRow()
        with pytest.raises(AssertionError) as e:
            h = row.create_header_row()
        assert "No data fields have been added to the data row. Header row would be empty." in str(
            e)
        with pytest.raises(AssertionError) as e:
            h = row.create_detail_row()
        assert "No data fields have been added to the data row. Detail row would be empty." in str(
            e)
 def test_get_string_data_no_characters(self):
     string_field = DataField("STRING", "STRING_HEADER")
     string_data = string_field.get_data()
     assert 1 <= len(string_data) <= 1000
     for char in string_data:
         assert char in string.printable
 def test_invalid_characters(self):
     with pytest.raises(AssertionError) as e:
         f = DataField("string", "test_field_name", characters="junk")
     assert "Invalid character type specified: `junk`." in str(e)
 def test_invalid_data_type(self):
     with pytest.raises(AssertionError) as e:
         f = DataField("test_no_data", "test_field_name")
     assert "Invalid data type specified.  Expected either integer, string, or boolean, but `test_no_data` was " \
            "provided." in str(e)