179 lines
6.1 KiB
Python
179 lines
6.1 KiB
Python
import unittest
|
|
import decimal
|
|
import pyaccuwage
|
|
from pyaccuwage.fields import BlankField
|
|
from pyaccuwage.fields import IntegerField
|
|
from pyaccuwage.fields import MoneyField
|
|
from pyaccuwage.fields import StateField
|
|
from pyaccuwage.fields import TextField
|
|
from pyaccuwage.fields import ZeroField
|
|
from pyaccuwage.fields import StaticField
|
|
from pyaccuwage.fields import ValidationError
|
|
from pyaccuwage.model import Model
|
|
|
|
class TestModelOutput(unittest.TestCase):
|
|
class TestModel(Model):
|
|
record_length = 128
|
|
record_identifier = 'TEST' # 4 bytes
|
|
field1 = TextField(max_length=16)
|
|
field2 = IntegerField(max_length=16)
|
|
blank1 = BlankField(max_length=16)
|
|
zero1 = ZeroField(max_length=16)
|
|
money = MoneyField(max_length=32)
|
|
state_txt = StateField()
|
|
state_num = StateField(use_numeric=True)
|
|
blank2 = BlankField(max_length=12)
|
|
static1 = StaticField(value='hey mister!!')
|
|
|
|
def setUp(self):
|
|
self.model = TestModelOutput.TestModel()
|
|
|
|
def testModelBinaryOutput(self):
|
|
model = self.model
|
|
model.field1.value = 'Hello, sir!'
|
|
model.field2.value = 12345
|
|
model.money.value = decimal.Decimal('3133.77')
|
|
model.state_txt.value = 'IA'
|
|
model.state_num.value = 'IA'
|
|
|
|
expected = b''.join([
|
|
b'TEST',
|
|
b'HELLO, SIR!'.ljust(16),
|
|
b'12345'.zfill(16),
|
|
b' ' * 16,
|
|
b'0' * 16,
|
|
b'313377'.zfill(32),
|
|
b'IA',
|
|
b'19',
|
|
b' ' * 12,
|
|
b'hey mister!!',
|
|
])
|
|
|
|
output = model.output()
|
|
self.assertEqual(len(output), TestModelOutput.TestModel.record_length)
|
|
self.assertEqual(output, expected)
|
|
|
|
def testModelTextOutput(self):
|
|
model = self.model
|
|
model.field1.value = 'Hello, sir!'
|
|
model.field2.value = 12345
|
|
model.money.value = decimal.Decimal('3133.77')
|
|
model.state_txt.value = 'IA'
|
|
model.state_num.value = 'IA'
|
|
output = model.output(format='text')
|
|
|
|
self.assertEqual(output, '''---TestModel
|
|
field1: Hello, sir!
|
|
field2: 12345
|
|
money: 3133.77
|
|
state_txt: IA
|
|
state_num: IA
|
|
static1: hey mister!!
|
|
|
|
''')
|
|
|
|
|
|
class TestFileFormats(unittest.TestCase):
|
|
class TestModelA(pyaccuwage.model.Model):
|
|
record_length = 128
|
|
record_identifier = 'A' # 1 byte
|
|
field1 = TextField(max_length=16)
|
|
field2 = IntegerField(max_length=16)
|
|
blank1 = BlankField(max_length=16)
|
|
zero1 = ZeroField(max_length=16)
|
|
money = MoneyField(max_length=32)
|
|
state_txt = StateField()
|
|
state_num = StateField(use_numeric=True)
|
|
blank2 = BlankField(max_length=27)
|
|
|
|
class TestModelB(pyaccuwage.model.Model):
|
|
record_length = 128
|
|
record_identifier = 'B' # 1 byte
|
|
zero1 = ZeroField(max_length=32)
|
|
text1 = TextField(max_length=71)
|
|
text2 = TextField(max_length=20, required=False)
|
|
blank2 = BlankField(max_length=4)
|
|
|
|
record_types = [TestModelA, TestModelB]
|
|
|
|
def createExampleRecords(self):
|
|
model_a = TestFileFormats.TestModelA()
|
|
model_a.field1.value = 'I am model a'
|
|
model_a.field2.value = 5522
|
|
model_a.money.value = decimal.Decimal('23.00')
|
|
model_a.state_txt.value = 'IA'
|
|
model_a.state_num.value = 'IA'
|
|
|
|
model_b = TestFileFormats.TestModelB()
|
|
model_b.text1.value = 'hey I am model b and I have a big text field'
|
|
|
|
return [
|
|
model_a,
|
|
model_b,
|
|
]
|
|
|
|
def testJSONSerialization(self):
|
|
records = self.createExampleRecords()
|
|
record_types = self.record_types
|
|
json_data = pyaccuwage.json_dumps(records)
|
|
records_loaded = pyaccuwage.json_loads(json_data, record_types)
|
|
|
|
original_bytes = pyaccuwage.dumps(records)
|
|
reloaded_bytes = pyaccuwage.dumps(records_loaded)
|
|
self.assertEqual(original_bytes, reloaded_bytes)
|
|
|
|
def testTxtSerialization(self):
|
|
records = self.createExampleRecords()
|
|
record_types = self.record_types
|
|
text_data = pyaccuwage.text_dumps(records)
|
|
records_loaded = pyaccuwage.text_loads(text_data, record_types)
|
|
|
|
original_bytes = pyaccuwage.dumps(records)
|
|
reloaded_bytes = pyaccuwage.dumps(records_loaded)
|
|
self.assertEqual(original_bytes, reloaded_bytes)
|
|
|
|
|
|
class TestRequiredFields(unittest.TestCase):
|
|
def createTestRecord(self, required=False, blank=False):
|
|
class Record(pyaccuwage.model.Model):
|
|
record_length = 16
|
|
record_identifier = ''
|
|
test_field = TextField(max_length=16, required=required, blank=blank)
|
|
record = Record()
|
|
def dump():
|
|
return pyaccuwage.dumps([record])
|
|
return (record, dump)
|
|
|
|
def testRequiredBlankField(self):
|
|
(record, dump) = self.createTestRecord(required=True, blank=True)
|
|
record.test_field.value # if nothing is ever assigned, raise error
|
|
self.assertRaises(ValidationError, dump)
|
|
record.test_field.value = '' # value may be empty string
|
|
dump()
|
|
|
|
def testRequiredNonblankField(self):
|
|
(record, dump) = self.createTestRecord(required=True, blank=False)
|
|
record.test_field.value # if nothing is ever assigned, raise error
|
|
self.assertRaises(ValidationError, dump)
|
|
record.test_field.value = '' # value must not be empty string
|
|
self.assertRaises(ValidationError, dump)
|
|
record.test_field.value = 'hello'
|
|
dump()
|
|
|
|
def testOptionalBlankField(self):
|
|
(record, dump) = self.createTestRecord(required=False, blank=True)
|
|
record.test_field.value # OK if nothing is ever assigned
|
|
dump()
|
|
record.test_field.value = '' # OK if empty string is assigned
|
|
dump()
|
|
record.test_field.value = 'hello'
|
|
dump()
|
|
|
|
def testOptionalNonBlankField(self):
|
|
(record, dump) = self.createTestRecord(required=False, blank=False)
|
|
record.test_field.value # OK if nothing is ever assigned
|
|
dump()
|
|
record.test_field.value = '' # OK if empty string is assigned
|
|
dump()
|
|
record.test_field.value = 'hello'
|
|
dump()
|