def test_parse_orders_from_csv_reader_skips_malformed_lines(self):
        batch = EtradeIngestor()

        # the reader is reader in a loop (i.e., for row in reader:)
        reader = [
            '06/12/17,Bought,EQ,NFLX,19,-2924.87,153.6799,4.95,NETFLIX COM INC'.split(','),
            '06/08/17,Bought,EQ,NFLX,39,-2924.46,151.9,4.95,NETFLIX COM INC'.split(','),
            'MALFORMED_DATE,Bought,EQ,NFLX,39,-2924.46,151.9,4.95,NETFLIX COM INC'.split(','),
        ]
        orders = batch.parse_orders_from_csv_reader(reader)
        assert set(orders) == set([
            order_history.Order(
                batch.user_id,
                order_history.BUY_ORDER_TYPE,
                'NFLX',
                datetime.datetime(2017, 6, 12).date(),
                19,
                153.6799
            ),
            order_history.Order(
                batch.user_id,
                order_history.BUY_ORDER_TYPE,
                'NFLX',
                datetime.datetime(2017, 6, 8).date(),
                39, 151.9
            ),
        ])
    def test_parse_orders_from_csv(self):
        csv_path = '/path/to/csv'
        mock_reader = mock.Mock()
        mock_orders = mock.Mock()
        batch = EtradeIngestor()
        with \
                mock.patch('builtins.open') as patch_open,\
                mock.patch('csv.reader', return_value=mock_reader) as patch_reader,\
                mock.patch.object(
                    batch, 'parse_orders_from_csv_reader', return_value=mock_orders
                ) as patch_parse_orders:

            orders = batch.parse_orders_from_csv(csv_path)
            assert patch_open.call_args_list == [mock.call(csv_path)]
            assert patch_reader.called
            assert patch_parse_orders.call_args_list == [mock.call(mock_reader)]
            assert orders == mock_orders
    def test_run(self):
        batch = EtradeIngestor()
        csv_path = './path/to/data.csv'
        mock_args = mock.Mock()
        mock_args.csv_path = csv_path
        mock_parsed_orders = mock.Mock()
        with \
                mock.patch.object(
                    batch.arg_parser, 'parse_args', return_value=mock_args
                ) as patch_parse_args, \
                mock.patch.object(
                    batch, 'parse_orders_from_csv', return_value=mock_parsed_orders
                ) as patch_parse_orders, \
                mock.patch.object(batch.order_logic, 'add_orders') as patch_add_orders:

            batch.run()
            assert patch_parse_args.called
            assert patch_parse_orders.call_args_list == [mock.call(csv_path)]
            assert patch_add_orders.call_args_list == [mock.call(mock_parsed_orders)]
    def test_extract_order_from_row_ignores_non_bought_txn_type(self):
        batch = EtradeIngestor()
        row = '06/12/17,UKNOWN_TXN_TYPE,EQ,NFLX,39,-2924.46,151.9,4.95,NETFLIX COM INC'.split(',')

        order = batch.extract_order_from_row(row)
        assert order is None
    def test_extract_order_from_row_skips_malformed_row(self):
        batch = EtradeIngestor()
        row = 'MALFORMED_DATE,Bought,EQ,NFLX,39,-2924.46,151.9,4.95,NETFLIX COM INC'.split(',')

        with pytest.raises(RowParserException):
            batch.extract_order_from_row(row)
 def test_init(self):
     batch = EtradeIngestor()
     args = batch.arg_parser.parse_args(['--csv-path', './path/to/data.csv'])
     assert args == argparse.Namespace(csv_path='./path/to/data.csv')
     assert type(batch.order_logic) == order_history.OrderHistoryLogic