From daeee61f323dc4bd61f8ad40c1416cfd4048fe72 Mon Sep 17 00:00:00 2001
From: shadeofblue <blue@golem.network>
Date: Wed, 12 Jun 2019 09:59:30 +0200
Subject: [PATCH] fix issue when nodekeeper doesn't have information about a
 payer node in the Income list

---
 golem/ethereum/transactionsystem.py           |  6 ++---
 tests/factories/model.py                      |  3 ++-
 .../golem/ethereum/test_transactionsystem.py  | 22 +++++++++++++++++++
 3 files changed, 26 insertions(+), 5 deletions(-)

diff --git a/golem/ethereum/transactionsystem.py b/golem/ethereum/transactionsystem.py
index 0080d9a497..bdc237c8ed 100644
--- a/golem/ethereum/transactionsystem.py
+++ b/golem/ethereum/transactionsystem.py
@@ -399,6 +399,7 @@ def get_incomes_list(self) -> List[Dict[str, Any]]:
         lru_node = functools.lru_cache()(nodeskeeper.get)
 
         def item(o):
+            node = lru_node(o.sender_node) if o.sender_node else None
             return {
                 "subtask": common.to_unicode(o.subtask),
                 "payer": common.to_unicode(o.sender_node),
@@ -407,11 +408,8 @@ def item(o):
                 "transaction": common.to_unicode(o.transaction),
                 "created": common.datetime_to_timestamp_utc(o.created_date),
                 "modified": common.datetime_to_timestamp_utc(o.modified_date),
-                "node":
-                    lru_node(o.sender_node).to_dict()
-                    if o.sender_node else None,
+                "node": node.to_dict() if node else None,
             }
-
         return [item(income) for income in incomes]
 
     def get_available_eth(self) -> int:
diff --git a/tests/factories/model.py b/tests/factories/model.py
index 5fb9d7e238..f9408e96c8 100644
--- a/tests/factories/model.py
+++ b/tests/factories/model.py
@@ -1,6 +1,7 @@
 import factory
 
 from golem_messages.factories.datastructures import p2p
+from golem_messages.factories.helpers import random_eth_pub_key
 from golem import model
 
 
@@ -8,7 +9,7 @@ class Income(factory.Factory):
     class Meta:
         model = model.Income
 
-    sender_node = '00adbeef' + 'deadbeef' * 15
+    sender_node = factory.LazyFunction(lambda: random_eth_pub_key())
     payer_address = '0x' + 40 * '3'
     subtask = factory.Faker('uuid4')
     value = factory.Faker('random_int', min=1, max=10 << 20)
diff --git a/tests/golem/ethereum/test_transactionsystem.py b/tests/golem/ethereum/test_transactionsystem.py
index 6c78943a89..a903aaf9d5 100644
--- a/tests/golem/ethereum/test_transactionsystem.py
+++ b/tests/golem/ethereum/test_transactionsystem.py
@@ -792,3 +792,25 @@ def test_one(self):
             ],
             self.ets.get_incomes_list(),
         )
+
+    def test_nodeskeeper_record_not_present(self):
+        income = model_factory.Income()
+        self.assertEqual(
+            income.save(force_insert=True),
+            1,
+        )
+        self.assertEqual(
+            [
+                {
+                    'created': ANY,
+                    'modified': ANY,
+                    'node': None,
+                    'payer': income.sender_node,
+                    'status': 'awaiting',
+                    'subtask': income.subtask,
+                    'transaction': None,
+                    'value': str(income.value),
+                },
+            ],
+            self.ets.get_incomes_list(),
+        )