139 lines
4.2 KiB
Python
139 lines
4.2 KiB
Python
import os
|
|
import textwrap
|
|
|
|
import pytest
|
|
from src.writer.file_writer import CsvWriter, FileWriter, JsonWriter
|
|
|
|
|
|
class ConcreteFileWriter(FileWriter):
|
|
def write(self) -> str:
|
|
return super().write()
|
|
|
|
|
|
class ConcreteFileWriterAbstractMethodNotImplemented(FileWriter):
|
|
pass
|
|
|
|
|
|
class TestFileWriter:
|
|
|
|
def test_concrete_file_writer_instance_create(self):
|
|
concrete_file_writer = ConcreteFileWriter('', '')
|
|
assert isinstance(concrete_file_writer, FileWriter)
|
|
|
|
def test_concrete_file_writer_call_write_method(self):
|
|
concrete_file_writer = ConcreteFileWriter('', '')
|
|
concrete_file_writer.write()
|
|
|
|
def test_raise_abstract_class_do_not_create_instance(self):
|
|
with pytest.raises(TypeError):
|
|
FileWriter('', '')
|
|
|
|
def test_raise_concrete_file_writer_not_implemented_abstract_method(self):
|
|
with pytest.raises(TypeError):
|
|
ConcreteFileWriterAbstractMethodNotImplemented('', '')
|
|
|
|
|
|
class TestJsonFileWriter:
|
|
|
|
def test_write(self, tmpdir):
|
|
"""
|
|
Cases:
|
|
JSONファイルが書き込めること
|
|
Arranges:
|
|
|
|
Expects:
|
|
JSONファイルが正しく書き込まれている
|
|
"""
|
|
# Arrange
|
|
file_name = 'test.json'
|
|
file_path = os.path.join(tmpdir, file_name)
|
|
content = {'test': 'テスト'}
|
|
|
|
# Act
|
|
sut = JsonWriter(file_path, content)
|
|
sut.write()
|
|
|
|
# Assert
|
|
with open(file_path) as f:
|
|
actual = f.read()
|
|
|
|
assert actual == '{"test": "テスト"}'
|
|
|
|
def test_raise_write_cause_file_path_not_exists(self):
|
|
"""
|
|
Cases:
|
|
書き込み先が存在しない場合エラーとなること
|
|
Arranges:
|
|
|
|
Expects:
|
|
エラーが発生する
|
|
"""
|
|
# Arrange
|
|
file_name = 'test.json'
|
|
file_path = os.path.join('invalid', file_name)
|
|
content = {'test': 'テスト'}
|
|
|
|
# Act
|
|
sut = JsonWriter(file_path, content)
|
|
with pytest.raises(Exception):
|
|
sut.write()
|
|
|
|
|
|
class TestCsvFileWriter:
|
|
|
|
def test_write(self, tmpdir):
|
|
"""
|
|
Cases:
|
|
CSVファイルが書き込めること
|
|
Arranges:
|
|
|
|
Expects:
|
|
CSVファイルが正しく書き込まれている
|
|
"""
|
|
# Arrange
|
|
file_name = 'test.csv'
|
|
file_path = os.path.join(tmpdir, file_name)
|
|
content = [
|
|
["Id", "AccountId", "UserOrGroupId", "AccountAccessLevel", "OpportunityAccessLevel", "CaseAccessLevel",
|
|
"ContactAccessLevel", "RowCause", "LastModifiedDate", "LastModifiedById", "IsDeleted"],
|
|
["TEST001", "test001", "", 1, 2, 3, 4, "テストのため1", "2022-06-01 09:00:00", 1234567.0, 0],
|
|
["TEST002", "test002", "", 5, 6, 7, 8, "テストのため2", "2022-06-03 01:30:30", 2.23, 1],
|
|
["TEST003", "test003", "", 9, 10, 11, 12, "テストのため3", "2022-06-04 08:50:50", 3.234567, 0]
|
|
]
|
|
|
|
# Act
|
|
sut = CsvWriter(file_path, content)
|
|
sut.write()
|
|
|
|
# Assert
|
|
with open(file_path, newline='') as f:
|
|
actual = f.read()
|
|
|
|
expect = """\
|
|
"Id","AccountId","UserOrGroupId","AccountAccessLevel","OpportunityAccessLevel","CaseAccessLevel","ContactAccessLevel","RowCause","LastModifiedDate","LastModifiedById","IsDeleted"\r\n\
|
|
"TEST001","test001","","1","2","3","4","テストのため1","2022-06-01 09:00:00","1234567.0","0"\r\n\
|
|
"TEST002","test002","","5","6","7","8","テストのため2","2022-06-03 01:30:30","2.23","1"\r\n\
|
|
"TEST003","test003","","9","10","11","12","テストのため3","2022-06-04 08:50:50","3.234567","0"\r\n\
|
|
"""
|
|
|
|
assert actual == textwrap.dedent(expect)
|
|
|
|
def test_raise_write_cause_file_path_not_exists(self):
|
|
"""
|
|
Cases:
|
|
書き込み先が存在しない場合エラーとなること
|
|
Arranges:
|
|
|
|
Expects:
|
|
エラーが発生する
|
|
"""
|
|
# Arrange
|
|
file_name = 'test.csv'
|
|
file_path = os.path.join('invalid', file_name)
|
|
content = {'test': 'テスト'}
|
|
|
|
# Act
|
|
sut = CsvWriter(file_path, content)
|
|
with pytest.raises(Exception):
|
|
sut.write()
|