def test_parse_valid_csv_file(self): csv_data = [ 'Num Shares,Symbol,Description,Buy Date,Adjusted Buy Date,Basis,' 'Adjusted Basis,Sell Date,Proceeds,Adjustment Code,Adjustment,' 'Form Position,Buy Lot,Replacement For,Is Replacement,' 'Loss Processed', '10,ABC,A,9/15/2014,9/14/2014,2000,2100,10/5/2014,1800,W,200,form1,' 'lot1,lot3|lot4,true,true', '10,ABC,A,9/15/2014,,2000,,10/5/2014,1800,W,200,form2,lot2,,false,', '20,ABC,A,9/25/2014,,3000,,11/5/2014,1800,,,,,,' ] lots = lots_lib.Lots.create_from_csv_data(csv_data) expected_lots_rows = [] expected_lots_rows.append( lots_lib.Lot(10, 'ABC', 'A', datetime.date(2014, 9, 15), datetime.date(2014, 9, 14), 2000, 2100, datetime.date(2014, 10, 5), 1800, 'W', 200, 'form1', 'lot1', ['lot3', 'lot4'], True, True)) expected_lots_rows.append( lots_lib.Lot(10, 'ABC', 'A', datetime.date(2014, 9, 15), datetime.date(2014, 9, 15), 2000, 2000, datetime.date(2014, 10, 5), 1800, 'W', 200, 'form2', 'lot2', [], False, False)) expected_lots_rows.append( lots_lib.Lot(20, 'ABC', 'A', datetime.date(2014, 9, 25), datetime.date(2014, 9, 25), 3000, 3000, datetime.date(2014, 11, 5), 1800, '', 0, '', '', [], False, False)) expected_lots = lots_lib.Lots(expected_lots_rows) self.assertSameLots(lots, expected_lots)
def test_is_loss(self): loss_lot = lots_lib.Lot( 10, "ABC", "A", datetime.date(2014, 9, 15), datetime.date(2014, 9, 15), 2000, 2000, datetime.date(2014, 10, 5), 1800, "", 0, "form1", "lot1", [], True, False, ) self.assertTrue(loss_lot.is_loss()) gain_lot = lots_lib.Lot( 10, "ABC", "A", datetime.date(2014, 9, 15), datetime.date(2014, 9, 15), 1000, 1000, datetime.date(2014, 10, 5), 1800, "", 0, "form1", "lot1", [], True, False, ) self.assertFalse(gain_lot.is_loss()) unsold_lot = lots_lib.Lot( 10, "ABC", "A", datetime.date(2014, 9, 15), datetime.date(2014, 9, 15), 2000, 2000, None, 0, "", 0, "form1", "lot1", [], True, False, ) self.assertFalse(unsold_lot.is_loss())
def test_write_csv_data(self): lots_rows = [] lots_rows.append(lots_lib.Lot( 10, 'ABC', 'A', datetime.date(2014, 9, 15), datetime.date( 2014, 9, 14), 2000, 2100, datetime.date(2014, 10, 5), 1800, 'W', 200, 'form1', 'lot1', ['lot3', 'lot4'], True, True)) lots_rows.append(lots_lib.Lot(10, 'ABC', 'A', datetime.date( 2014, 9, 15), datetime.date(2014, 9, 15), 2000, 2000, datetime.date(2014, 10, 5), 1800, 'W', 200, 'form2', 'lot2', [], False, False)) lots_rows.append(lots_lib.Lot(20, 'ABC', 'A', datetime.date( 2014, 9, 25), datetime.date(2014, 9, 25), 3000, 3000, datetime.date(2014, 11, 5), 1800, '', 0, '', '', [], False, False)) lots = lots_lib.Lots(lots_rows) actual_output = StringIO.StringIO() lots.write_csv_data(actual_output) expected_csv_data = [ 'Num Shares,Symbol,Description,Buy Date,Adjusted Buy Date,Basis,' 'Adjusted Basis,Sell Date,Proceeds,Adjustment Code,Adjustment,' 'Form Position,Buy Lot,Replacement For,Is Replacement,' 'Loss Processed', '10,ABC,A,09/15/2014,09/14/2014,2000,2100,10/05/2014,1800,W,200,' 'form1,lot1,lot3|lot4,True,True', '10,ABC,A,09/15/2014,,2000,,10/05/2014,1800,W,200,form2,lot2,,,', '20,ABC,A,09/25/2014,,3000,,11/05/2014,1800,,,,_1,,,' ] actual_output.seek(0) self.assertSequenceEqual( [line.rstrip() for line in actual_output.readlines()], expected_csv_data)
def test_contents_not_equal(self): lots = lots_lib.Lots([]) lots.add(lots_lib.Lot(1, '', '', datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, datetime.date(2014, 11, 5), 0, '', 0, 'form2', '', [], False, False)) lots.add(lots_lib.Lot(5, '', '', datetime.date(2014, 9, 1), datetime.date(2014, 9, 1), 0, 0, datetime.date(2014, 10, 5), 0, '', 0, 'form1', '', [], False, False)) lots.add(lots_lib.Lot(3, '', '', datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, datetime.date(2014, 11, 5), 0, '', 0, 'form1', '', [], False, False)) other_lots = copy.deepcopy(lots) other_lots.lots()[0].num_shares = 2 self.assertFalse(lots.contents_equal(other_lots))
def create_lot( num_shares, buy_year, buy_month, buy_day, basis, sell_year=0, sell_month=0, sell_day=0, proceeds=0, ): buy_date = datetime.date(buy_year, buy_month, buy_day) adjusted_buy_date = datetime.date(buy_year, buy_month, buy_day) sell_date = None if sell_year: sell_date = datetime.date(sell_year, sell_month, sell_day) return lots_lib.Lot( num_shares, "ABC", "A", buy_date, adjusted_buy_date, basis, basis, sell_date, proceeds, "", 0, "", "", [], False, False, )
def test_is_loss(self): loss_lot = lots_lib.Lot(10, 'ABC', 'A', datetime.date(2014, 9, 15), datetime.date(2014, 9, 15), 2000, 2000, datetime.date(2014, 10, 5), 1800, '', 0, 'form1', 'lot1', [], True, False) self.assertTrue(loss_lot.is_loss()) gain_lot = lots_lib.Lot(10, 'ABC', 'A', datetime.date(2014, 9, 15), datetime.date(2014, 9, 15), 1000, 1000, datetime.date(2014, 10, 5), 1800, '', 0, 'form1', 'lot1', [], True, False) self.assertFalse(gain_lot.is_loss()) unsold_lot = lots_lib.Lot(10, 'ABC', 'A', datetime.date(2014, 9, 15), datetime.date(2014, 9, 15), 2000, 2000, None, 0, '', 0, 'form1', 'lot1', [], True, False) self.assertFalse(unsold_lot.is_loss())
def test_write_csv_data_dollars(self): lots_rows = [] lots_rows.append( lots_lib.Lot( 20, "ABC", "A", datetime.date(2014, 9, 25), datetime.date(2014, 9, 25), 3010, 3010, datetime.date(2014, 11, 5), 1850, "", 0, "", "", [], False, False, )) lots = lots_lib.Lots(lots_rows) actual_output = StringIO() lots.write_csv_data(actual_output, True) expected_csv_data = [ "Num Shares,Symbol,Description,Buy Date,Adjusted Buy Date,Basis," "Adjusted Basis,Sell Date,Proceeds,Adjustment Code,Adjustment," "Form Position,Buy Lot,Replacement For,Is Replacement," "Loss Processed", "20,ABC,A,09/25/2014,,$30,,11/05/2014,$19,,,,_1,,,", ] actual_output.seek(0) self.assertSequenceEqual( [line.rstrip() for line in actual_output.readlines()], expected_csv_data, )
def test_compare_by_sell_date(self): lots = [] lots.append( lots_lib.Lot( 1, "", "", datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, datetime.date(2014, 11, 5), 0, "", 0, "form2", "", [], False, False, )) lots.append( lots_lib.Lot( 1, "", "", datetime.date(2014, 9, 1), datetime.date(2014, 9, 1), 0, 0, datetime.date(2014, 10, 5), 0, "", 0, "form1", "", [], False, False, )) lots.append( lots_lib.Lot( 1, "", "", datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, datetime.date(2014, 11, 5), 0, "", 0, "form1", "", [], False, False, )) lots.append( lots_lib.Lot( 2, "", "", datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, datetime.date(2014, 11, 5), 0, "", 0, "form1", "", [], False, False, )) lots.append( lots_lib.Lot( 1, "", "", datetime.date(2014, 9, 3), datetime.date(2014, 9, 3), 0, 0, datetime.date(2014, 10, 5), 0, "", 0, "form1", "", [], False, False, )) lots.append( lots_lib.Lot( 1, "", "", datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, None, 0, "", 0, "form1", "", [], False, False, )) lots.append( lots_lib.Lot( 1, "", "", datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, datetime.date(2014, 10, 5), 0, "", 0, "form1", "", [], False, False, )) lots.append( lots_lib.Lot( 1, "", "", datetime.date(2014, 9, 3), datetime.date(2014, 9, 3), 0, 0, datetime.date(2014, 10, 6), 0, "", 0, "form1", "", [], False, False, )) expected = [] expected.append( lots_lib.Lot( 1, "", "", datetime.date(2014, 9, 1), datetime.date(2014, 9, 1), 0, 0, datetime.date(2014, 10, 5), 0, "", 0, "form1", "", [], False, False, )) expected.append( lots_lib.Lot( 1, "", "", datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, datetime.date(2014, 10, 5), 0, "", 0, "form1", "", [], False, False, )) expected.append( lots_lib.Lot( 1, "", "", datetime.date(2014, 9, 3), datetime.date(2014, 9, 3), 0, 0, datetime.date(2014, 10, 5), 0, "", 0, "form1", "", [], False, False, )) expected.append( lots_lib.Lot( 1, "", "", datetime.date(2014, 9, 3), datetime.date(2014, 9, 3), 0, 0, datetime.date(2014, 10, 6), 0, "", 0, "form1", "", [], False, False, )) expected.append( lots_lib.Lot( 1, "", "", datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, datetime.date(2014, 11, 5), 0, "", 0, "form1", "", [], False, False, )) expected.append( lots_lib.Lot( 2, "", "", datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, datetime.date(2014, 11, 5), 0, "", 0, "form1", "", [], False, False, )) expected.append( lots_lib.Lot( 1, "", "", datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, datetime.date(2014, 11, 5), 0, "", 0, "form2", "", [], False, False, )) expected.append( lots_lib.Lot( 1, "", "", datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, None, 0, "", 0, "form1", "", [], False, False, )) lots.sort(key=cmp_to_key(lots_lib.Lot.cmp_by_sell_date)) self.assertTrue(lots == expected)
def test_parse_valid_csv_file(self): csv_data = [ "Num Shares,Symbol,Description,Buy Date,Adjusted Buy Date,Basis," "Adjusted Basis,Sell Date,Proceeds,Adjustment Code,Adjustment," "Form Position,Buy Lot,Replacement For,Is Replacement," "Loss Processed", "10,ABC,A,9/15/2014,9/14/2014,2000,2100,10/5/2014,1800,W,200,form1," "lot1,lot3|lot4,true,true", "10,ABC,A,9/15/2014,,2000,,10/5/2014,1800,W,200,form2,lot2,,false,", "20,ABC,A,9/25/2014,,3000,,11/5/2014,1800,,,,,,", ] lots = lots_lib.Lots.create_from_csv_data(csv_data) expected_lots_rows = [] expected_lots_rows.append( lots_lib.Lot( 10, "ABC", "A", datetime.date(2014, 9, 15), datetime.date(2014, 9, 14), 2000, 2100, datetime.date(2014, 10, 5), 1800, "W", 200, "form1", "lot1", ["lot3", "lot4"], True, True, )) expected_lots_rows.append( lots_lib.Lot( 10, "ABC", "A", datetime.date(2014, 9, 15), datetime.date(2014, 9, 15), 2000, 2000, datetime.date(2014, 10, 5), 1800, "W", 200, "form2", "lot2", [], False, False, )) expected_lots_rows.append( lots_lib.Lot( 20, "ABC", "A", datetime.date(2014, 9, 25), datetime.date(2014, 9, 25), 3000, 3000, datetime.date(2014, 11, 5), 1800, "", 0, "", "", [], False, False, )) expected_lots = lots_lib.Lots(expected_lots_rows) self.assertSameLots(lots, expected_lots)
def test_contents_equal(self): lots = lots_lib.Lots([]) lots.add( lots_lib.Lot( 1, "", "", datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, datetime.date(2014, 11, 5), 0, "", 0, "form2", "", [], False, False, )) lots.add( lots_lib.Lot( 5, "", "", datetime.date(2014, 9, 1), datetime.date(2014, 9, 1), 0, 0, datetime.date(2014, 10, 5), 0, "", 0, "form1", "", [], False, False, )) lots.add( lots_lib.Lot( 3, "", "", datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, datetime.date(2014, 11, 5), 0, "", 0, "form1", "", [], False, False, )) self.assertTrue(lots.contents_equal(lots)) other_lots = copy.deepcopy(lots) self.assertTrue(lots.contents_equal(other_lots))
def test_write_csv_data(self): lots_rows = [] lots_rows.append( lots_lib.Lot( 10, "ABC", "A", datetime.date(2014, 9, 15), datetime.date(2014, 9, 14), 2000, 2100, datetime.date(2014, 10, 5), 1800, "W", 200, "form1", "lot1", ["lot3", "lot4"], True, True, )) lots_rows.append( lots_lib.Lot( 10, "ABC", "A", datetime.date(2014, 9, 15), datetime.date(2014, 9, 15), 2000, 2000, datetime.date(2014, 10, 5), 1800, "W", 200, "form2", "lot2", [], False, False, )) lots_rows.append( lots_lib.Lot( 20, "ABC", "A", datetime.date(2014, 9, 25), datetime.date(2014, 9, 25), 3000, 3000, datetime.date(2014, 11, 5), 1800, "", 0, "", "", [], False, False, )) lots = lots_lib.Lots(lots_rows) actual_output = StringIO() lots.write_csv_data(actual_output, False) expected_csv_data = [ "Num Shares,Symbol,Description,Buy Date,Adjusted Buy Date,Basis," "Adjusted Basis,Sell Date,Proceeds,Adjustment Code,Adjustment," "Form Position,Buy Lot,Replacement For,Is Replacement," "Loss Processed", "10,ABC,A,09/15/2014,09/14/2014,2000,2100,10/05/2014,1800,W,200," "form1,lot1,lot3|lot4,True,True", "10,ABC,A,09/15/2014,,2000,,10/05/2014,1800,W,200,form2,lot2,,,", "20,ABC,A,09/25/2014,,3000,,11/05/2014,1800,,,,_1,,,", ] actual_output.seek(0) self.assertSequenceEqual( [line.rstrip() for line in actual_output.readlines()], expected_csv_data, )
def test_compare_by_original_buy_date(self): lots = [] lots.append( lots_lib.Lot(1, '', '', datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, datetime.date(2014, 11, 5), 0, '', 0, 'form2', '', [], False, False)) lots.append( lots_lib.Lot(1, '', '', datetime.date(2014, 9, 1), datetime.date(2014, 9, 1), 0, 0, datetime.date(2014, 10, 5), 0, '', 0, 'form1', '', [], False, False)) lots.append( lots_lib.Lot(1, '', '', datetime.date(2014, 9, 2), datetime.date(2014, 9, 7), 0, 0, datetime.date(2014, 11, 5), 0, '', 0, 'form1', '', [], False, False)) lots.append( lots_lib.Lot(2, '', '', datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, datetime.date(2014, 11, 5), 0, '', 0, 'form1', '', [], False, False)) lots.append( lots_lib.Lot(1, '', '', datetime.date(2014, 9, 3), datetime.date(2014, 9, 3), 0, 0, datetime.date(2014, 10, 5), 0, '', 0, 'form1', '', [], False, False)) lots.append( lots_lib.Lot(1, '', '', datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, None, 0, '', 0, 'form1', '', [], False, False)) lots.append( lots_lib.Lot(1, '', '', datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, datetime.date(2014, 10, 5), 0, '', 0, 'form1', '', [], False, False)) lots.append( lots_lib.Lot(1, '', '', datetime.date(2014, 9, 3), datetime.date(2014, 9, 3), 0, 0, datetime.date(2014, 10, 6), 0, '', 0, 'form1', '', [], False, False)) expected = [] expected.append( lots_lib.Lot(1, '', '', datetime.date(2014, 9, 1), datetime.date(2014, 9, 1), 0, 0, datetime.date(2014, 10, 5), 0, '', 0, 'form1', '', [], False, False)) expected.append( lots_lib.Lot(1, '', '', datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, datetime.date(2014, 10, 5), 0, '', 0, 'form1', '', [], False, False)) expected.append( lots_lib.Lot(1, '', '', datetime.date(2014, 9, 2), datetime.date(2014, 9, 7), 0, 0, datetime.date(2014, 11, 5), 0, '', 0, 'form1', '', [], False, False)) expected.append( lots_lib.Lot(2, '', '', datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, datetime.date(2014, 11, 5), 0, '', 0, 'form1', '', [], False, False)) expected.append( lots_lib.Lot(1, '', '', datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, datetime.date(2014, 11, 5), 0, '', 0, 'form2', '', [], False, False)) expected.append( lots_lib.Lot(1, '', '', datetime.date(2014, 9, 2), datetime.date(2014, 9, 2), 0, 0, None, 0, '', 0, 'form1', '', [], False, False)) expected.append( lots_lib.Lot(1, '', '', datetime.date(2014, 9, 3), datetime.date(2014, 9, 3), 0, 0, datetime.date(2014, 10, 5), 0, '', 0, 'form1', '', [], False, False)) expected.append( lots_lib.Lot(1, '', '', datetime.date(2014, 9, 3), datetime.date(2014, 9, 3), 0, 0, datetime.date(2014, 10, 6), 0, '', 0, 'form1', '', [], False, False)) lots.sort(key=cmp_to_key(lots_lib.Lot.cmp_by_original_buy_date)) self.assertTrue(lots == expected)