class OperatingRevenueAssembler():
    def __init__(self):
        self.ifrs_assembler = IfrsOperatingRevenueAssembler()
        self.legacy_assembler = LegacyOperatingRevenueAssembler()

    def assemble(self, content, stock_symbol, date):
        # IFRS are available from 2013 to now
        if date >= datetime.date(2013, 1, 1):
            return self.ifrs_assembler.assemble(content, stock_symbol, date)
        # Otherwise we use legacy data
        else:
            return self.legacy_assembler.assemble(content, stock_symbol, date)
class IfrsOperatingRevenueAssemblerTest(unittest.TestCase):
    def setUp(self):
        self.assembler = IfrsOperatingRevenueAssembler()
        self.file_utils = FileUtils()

    def tearDown(self):
        self.assembler = None
        self.file_utils = None

    def test_assemble_2330(self):
        # online: http://mops.twse.com.tw/mops/web/ajax_t05st10_ifrs?encodeURIComponent=1&run=Y&step=0&colorchg=&TYPEK=sii%20&co_id=2330&off=1&year=103&month=09&firstin=true
        path = "./stockcat/tests/unit/data/ifrs_operating_revenue/2330/2014/09.html"
        param = {"content": self.file_utils.read_file(path), "stock_symbol": "2330", "date": datetime.date(2014, 9, 30)}
        dao = self.assembler.assemble(param)

        self.assertEqual(dao.get_column_name_list(), [u"項目", datetime.date(2014, 9, 30)])
        self.assertEqual(dao.get_stock_symbol(), param["stock_symbol"])
        self.assertEqual(dao.get_date(), param["date"])

        row_list = dao.get_row_list()
        self.assertEqual(row_list[0], [u"本月", 74846313])
        self.assertEqual(row_list[1], [u"去年同期", 55382473])
        self.assertEqual(row_list[2], [u"增減金額", 19463840])
        self.assertEqual(row_list[3], [u"增減百分比", 35.14])
        self.assertEqual(row_list[4], [u"本年累計", 540285390])
        self.assertEqual(row_list[5], [u"去年累計", 451218350])
        self.assertEqual(row_list[6], [u"增減金額", 89067040])
        self.assertEqual(row_list[7], [u"增減百分比", 19.74])

    def test_assemble_1101(self):
        # online: http://mops.twse.com.tw/mops/web/ajax_t05st10_ifrs?encodeURIComponent=1&run=Y&step=0&colorchg=&TYPEK=sii%20&co_id=1101&off=1&year=103&month=09&firstin=true
        path = "./stockcat/tests/unit/data/ifrs_operating_revenue/1101/2014/09.html"
        param = {"content": self.file_utils.read_file(path), "stock_symbol": "1101", "date": datetime.date(2014, 9, 30)}
        dao = self.assembler.assemble(param)

        self.assertEqual(dao.get_column_name_list(), [u"項目", datetime.date(2014, 9, 30)])
        self.assertEqual(dao.get_stock_symbol(), param["stock_symbol"])
        self.assertEqual(dao.get_date(), param["date"])

        # check negative number
        row_list = dao.get_row_list()
        self.assertEqual(row_list[2], [u"增減金額", -244950])
        self.assertEqual(row_list[3], [u"增減百分比", -2.43])
        self.assertEqual(row_list[7], [u"增減百分比", 7.00])

    def test_assemble_raise_over_query_assemble_error(self):
        path = "./stockcat/tests/unit/data/error/too_much_query_error.html"
        param = {"content": self.file_utils.read_file(path), "stock_symbol": "2330", "date": datetime.date(2010, 9, 30)}
        with self.assertRaises(OverQueryAssembleError) as context:
            self.assembler.assemble(param)
        self.assertEqual(context.exception.param["stock_symbol"], param["stock_symbol"])
        self.assertEqual(context.exception.param["date"], param["date"])

    def test_assemble_raise_no_record_assemble_error(self):
        path = "./stockcat/tests/unit/data/error/no_record_error.html"
        param = {"content": self.file_utils.read_file(path), "stock_symbol": "2330", "date": datetime.date(2010, 9, 30)}
        with self.assertRaises(NoRecordAssembleError) as context:
            self.assembler.assemble(param)
        self.assertEqual(context.exception.param["stock_symbol"], param["stock_symbol"])
        self.assertEqual(context.exception.param["date"], param["date"])
 def __init__(self):
     self.ifrs_assembler = IfrsOperatingRevenueAssembler()
     self.legacy_assembler = LegacyOperatingRevenueAssembler()
 def setUp(self):
     self.assembler = IfrsOperatingRevenueAssembler()
     self.file_utils = FileUtils()