class DatastoreTest(unittest.TestCase):
    def setUp(self):
        self.db = Database(filepath="test.db")
        self.test_hash = "87e0555568bf5c7e4debd6645fc3f41e88df6ca8"
        self.test_hash2 = "97e0555568bf5c7e4debd6645fc3f41e88df6ca8"
        self.test_file = "Contents of test.txt"
        self.test_file2 = "Contents of test2.txt"

        self.sp = Profile()
        self.key = Profile().PublicKey()
        self.key.public_key = "Key"
        self.key.signature = "Sig"
        self.sp.name = "Test User"
        self.sp.encryption_key.MergeFrom(self.key)
        self.sp.location = CountryCode.Value('UNITED_STATES')

        self.serialized_listings = Listings()
        self.lm = self.serialized_listings.ListingMetadata()
        self.lm.contract_hash = self.test_hash
        self.lm.title = "TEST CONTRACT TITLE"
        self.lm.price = 0
        self.lm.currency_code = "USD"
        self.lm.nsfw = False
        self.lm.origin = CountryCode.Value('ALL')

        self.u = Following.User()
        self.u.guid = '0000000000000000000000000000000000'
        self.u.signed_pubkey = 'signed_pubkey'

        self.m = Metadata()
        self.m.name = 'Test User'
        self.m.handle = '@TestUser'
        self.m.avatar_hash = ''
        self.m.nsfw = False
        self.u.metadata.MergeFrom(self.m)

        self.f = Followers.Follower()
        self.f.guid = '0000000000000000000000000000000001'
        self.f.following = ''
        self.f.signed_pubkey = ''
        self.f.metadata.MergeFrom(self.m)

        self.hm = self.db.HashMap()
        self.hm.delete_all()

        self.ps = self.db.ProfileStore()
        self.ls = self.db.ListingsStore()
        self.ks = self.db.KeyStore()
        self.fd = self.db.FollowData()
        self.ms = self.db.MessageStore()
        self.ns = self.db.NotificationStore()
        self.vs = self.db.VendorStore()

    def tearDown(self):
        os.remove("test.db")

    def test_hashmapInsert(self):
        self.hm.insert(self.test_hash, self.test_file)
        f = self.hm.get_file(self.test_hash)
        self.assertEqual(f, self.test_file)

    def test_hashmapDelete(self):
        self.hm.insert(self.test_hash, self.test_file)
        f = self.hm.get_file(self.test_hash)
        self.assertEqual(f, self.test_file)
        self.hm.delete(self.test_hash)
        v = self.hm.get_file(self.test_hash)
        self.assertIsNone(v)

    def test_hashmapGetEmpty(self):
        f = self.hm.get_file('87e0555568bf5c7e4debd6645fc3f41e88df6ca9')
        self.assertEqual(f, None)

    def test_hashmapGetAll(self):
        # Get All from empty datastore
        self.hm.delete_all()
        f = self.hm.get_all()
        self.assertEqual(0, len(f))

        # Get All from populated datastore
        self.hm.insert(self.test_hash, self.test_file)
        self.hm.insert(self.test_hash2, self.test_file2)
        f = self.hm.get_all()

        self.assertIn((self.test_hash, self.test_file), f)
        self.assertIn((self.test_hash2, self.test_file2), f)

    def test_setProto(self):
        self.ps.set_proto(self.sp.SerializeToString())
        sp = self.ps.get_proto()
        val = Profile()
        val.ParseFromString(sp)
        self.assertEqual(self.sp, val)

    def test_addListing(self):
        self.ls.delete_all_listings()
        self.ls.add_listing(self.lm)
        l = self.ls.get_proto()
        val = Listings()
        val.ParseFromString(l)
        self.assertEqual(self.lm, val.listing[0])

    def test_deleteListing(self):
        self.ls.delete_all_listings()
        self.ls.add_listing(self.lm)
        self.ls.delete_listing(self.test_hash)
        l = self.ls.get_proto()
        val = Listings()
        val.ParseFromString(l)
        self.assertEqual(0, len(val.listing))

        # Try to delete when table is already empty
        self.ls.delete_all_listings()
        self.assertEqual(None, self.ls.delete_listing(self.test_hash))

    def test_setGUIDKey(self):
        self.ks.set_key("guid", "privkey", "signed_privkey")
        key = self.ks.get_key("guid")
        self.assertEqual(("privkey", "signed_privkey"), key)

    def test_setBitcoinKey(self):
        self.ks.set_key("bitcoin", "privkey", "signed_privkey")
        key = self.ks.get_key("bitcoin")
        self.assertEqual(("privkey", "signed_privkey"), key)

    def test_getKeyFromEmptyTable(self):
        self.ks.delete_all_keys()
        self.assertEqual(None, self.ks.get_key("guid"))

    def test_follow_unfollow(self):
        self.fd.follow(self.u)
        following = self.fd.get_following()
        self.assertIsNotNone(following)

        self.assertTrue(self.fd.is_following(self.u.guid))

        self.fd.unfollow(self.u.guid)
        following = self.fd.get_following()
        self.assertEqual(following, '')
        self.assertFalse(self.fd.is_following(self.u.guid))

    def test_deleteFollower(self):
        self.fd.set_follower(self.f)
        f = self.fd.get_followers()
        self.assertIsNotNone(f)
        self.fd.delete_follower(self.f.guid)
        f = self.fd.get_followers()
        self.assertEqual(f, '')

    def test_saveMessage(self):
        msgs = self.ms.get_messages(self.u.guid, 'CHAT')
        self.assertTrue(len(msgs) == 0)
        self.ms.save_message(self.u.guid, self.m.handle, self.u.signed_pubkey,
                             '', 'SUBJECT', 'CHAT', 'MESSAGE', '0000-00-00 00:00:00',
                             '', '', '')
        msgs = self.ms.get_messages(self.u.guid, 'CHAT')
        self.assertIsNotNone(msgs)
        self.ms.delete_message(self.u.guid)
        msgs = self.ms.get_messages(self.u.guid, 'CHAT')
        self.assertTrue(len(msgs) == 0)

    def test_notificationStore(self):
        n = self.ns.get_notifications()
        self.assertTrue(len(n) == 0)
        self.ns.save_notification("1234", self.u.guid, self.m.handle, 'NOTICE', "", ""
                                  '0000-00-00 00:00:00', '', 0)
        n = self.ns.get_notifications()
        self.assertIsNotNone(n)
        self.ns.delete_notification("1234")
        n = self.ns.get_notifications()
        self.assertTrue(len(n) == 0)

    def test_vendorStore(self):
        v = self.vs.get_vendors()
        self.assertEqual(v, [])
        self.vs.save_vendor(self.u.guid, '127.0.0.1', '80', '')
        v = self.vs.get_vendors()
        self.assertIsNot(v, [])
        self.vs.delete_vendor(self.u.guid)
        v = self.vs.get_vendors()
        self.assertEqual(v, [])
Esempio n. 2
0
class DatastoreTest(unittest.TestCase):
    def setUp(self):

        self.db = Database(filepath="test.db")
        self.test_hash = "87e0555568bf5c7e4debd6645fc3f41e88df6ca8"
        self.test_hash2 = "97e0555568bf5c7e4debd6645fc3f41e88df6ca8"
        self.test_file = "Contents of test.txt"
        self.test_file2 = "Contents of test2.txt"

        self.sp = Profile()
        self.key = Profile().PublicKey()
        self.key.public_key = "Key"
        self.key.signature = "Sig"
        self.sp.name = "Test User"
        self.sp.guid_key.MergeFrom(self.key)
        self.sp.location = CountryCode.Value('UNITED_STATES')

        self.serialized_listings = Listings()
        self.lm = self.serialized_listings.ListingMetadata()
        self.lm.contract_hash = self.test_hash
        self.lm.title = "TEST CONTRACT TITLE"
        self.lm.price = 0
        self.lm.currency_code = "USD"
        self.lm.nsfw = False
        self.lm.origin = CountryCode.Value('ALL')

        self.u = Following.User()
        self.u.guid = '0000000000000000000000000000000000'
        self.u.pubkey = 'signed_pubkey'

        self.m = Metadata()
        self.m.name = 'Test User'
        self.m.handle = '@TestUser'
        self.m.avatar_hash = ''
        self.m.nsfw = False
        self.u.metadata.MergeFrom(self.m)

        self.f = Followers.Follower()
        self.f.guid = '0000000000000000000000000000000001'
        self.f.following = ''
        self.f.pubkey = ''
        self.f.metadata.MergeFrom(self.m)

        self.hm = self.db.HashMap()
        self.hm.delete_all()

        self.ps = self.db.ProfileStore()
        self.ls = self.db.ListingsStore()
        self.ks = self.db.KeyStore()
        self.fd = self.db.FollowData()
        self.ms = self.db.MessageStore()
        self.ns = self.db.NotificationStore()
        self.vs = self.db.VendorStore()
        self.bs = self.db.BroadcastStore()
        self.moderators = self.db.ModeratorStore()
        self.purchases = self.db.Purchases()
        self.sales = self.db.Sales()
        self.settings = self.db.Settings()

    def tearDown(self):
        os.remove("test.db")

    def test_hashmapInsert(self):
        self.hm.insert(self.test_hash, self.test_file)
        f = self.hm.get_file(self.test_hash)
        self.assertEqual(f, self.test_file)

    def test_hashmapDelete(self):
        self.hm.insert(self.test_hash, self.test_file)
        f = self.hm.get_file(self.test_hash)
        self.assertEqual(f, self.test_file)
        self.hm.delete(self.test_hash)
        v = self.hm.get_file(self.test_hash)
        self.assertIsNone(v)

    def test_hashmapGetEmpty(self):
        f = self.hm.get_file('87e0555568bf5c7e4debd6645fc3f41e88df6ca9')
        self.assertEqual(f, None)

    def test_hashmapGetAll(self):
        # Get All from empty datastore
        self.hm.delete_all()
        f = self.hm.get_all()
        self.assertEqual(0, len(f))

        # Get All from populated datastore
        self.hm.insert(self.test_hash, self.test_file)
        self.hm.insert(self.test_hash2, self.test_file2)
        f = self.hm.get_all()

        self.assertIn((self.test_hash, self.test_file), f)
        self.assertIn((self.test_hash2, self.test_file2), f)

    def test_setProto(self):
        self.ps.set_proto(self.sp.SerializeToString())
        sp = self.ps.get_proto()
        val = Profile()
        val.ParseFromString(sp)
        self.assertEqual(self.sp, val)

    def test_addListing(self):
        self.ls.delete_all_listings()
        self.ls.add_listing(self.lm)
        self.ls.add_listing(self.lm)

        l = self.ls.get_proto()
        val = Listings()
        val.ParseFromString(l)
        self.assertEqual(self.lm, val.listing[0])
        self.assertEqual(1, len(val.listing))

    def test_deleteListing(self):
        self.ls.delete_all_listings()
        self.ls.add_listing(self.lm)
        self.ls.delete_listing(self.test_hash)
        l = self.ls.get_proto()
        val = Listings()
        val.ParseFromString(l)
        self.assertEqual(0, len(val.listing))

        # Try to delete when table is already empty
        self.ls.delete_all_listings()
        self.assertEqual(None, self.ls.delete_listing(self.test_hash))

    def test_setGUIDKey(self):
        self.ks.set_key("guid", "privkey", "signed_privkey")
        key = self.ks.get_key("guid")
        self.assertEqual(("privkey", "signed_privkey"), key)

    def test_setBitcoinKey(self):
        self.ks.set_key("bitcoin", "privkey", "signed_privkey")
        key = self.ks.get_key("bitcoin")
        self.assertEqual(("privkey", "signed_privkey"), key)

    def test_getKeyFromEmptyTable(self):
        self.ks.delete_all_keys()
        self.assertEqual(None, self.ks.get_key("guid"))

    def test_follow_unfollow(self):
        self.fd.follow(self.u)
        following = self.fd.get_following()
        self.assertIsNotNone(following)

        self.fd.follow(self.u)
        self.assertTrue(self.fd.is_following(self.u.guid))

        self.fd.unfollow(self.u.guid)
        self.fd.unfollow(self.f)
        following = self.fd.get_following()
        self.assertEqual(following, '')
        self.assertFalse(self.fd.is_following(self.u.guid))

    def test_deleteFollower(self):
        self.fd.set_follower(self.f)
        self.fd.set_follower(self.f)
        f = self.fd.get_followers()
        self.assertIsNotNone(f)
        self.fd.delete_follower(self.f.guid)
        f = self.fd.get_followers()
        self.assertEqual(f, '')

    def test_MassageStore(self):
        msgs = self.ms.get_messages(self.u.guid, 'CHAT')
        self.assertEqual(0, len(msgs))
        guids = self.ms.get_unread()
        self.assertEqual(0, len(guids))
        conversations = self.ms.get_conversations()
        self.assertEqual(0, len(conversations))

        self.ms.save_message(self.u.guid, self.m.handle, self.u.pubkey,
                             'SUBJECT', 'CHAT', 'MESSAGE', ZERO_TIMESTAMP, '',
                             '', '')
        msgs = self.ms.get_messages(self.u.guid, 'CHAT')
        self.assertEqual(1, len(msgs))

        guids = self.ms.get_unread()
        self.assertEqual(1, len(guids))

        conversations = self.ms.get_conversations()
        self.assertEqual(1, len(conversations))

        self.ms.mark_as_read(self.u.guid)
        guids = self.ms.get_unread()
        self.assertEqual(0, len(guids))

        self.ms.delete_message(self.u.guid)
        msgs = self.ms.get_messages(self.u.guid, 'CHAT')
        self.assertEqual(0, len(msgs))

    def test_BroadcastStore(self):
        bmsgs = self.bs.get_broadcasts()
        self.assertEqual(0, len(bmsgs))

        self.bs.save_broadcast('BID', self.u.guid, self.m.handle, 'MESSAGE',
                               ZERO_TIMESTAMP, '')
        bmsgs = self.bs.get_broadcasts()
        self.assertEqual(1, len(bmsgs))

        self.bs.delete_broadcast('BID')
        bmsgs = self.bs.get_broadcasts()
        self.assertEqual(0, len(bmsgs))

    def test_ModeratorStore(self):
        moderators = self.moderators.get_moderator(self.u.guid)
        self.assertIsNone(moderators)

        self.moderators.save_moderator(self.u.guid, self.u.pubkey, '', '', '',
                                       'JOHN', '', '0', '')
        moderators = self.moderators.get_moderator(self.u.guid)
        self.assertEqual(moderators[0], self.u.guid)

        self.moderators.delete_moderator(self.u.guid)
        moderators = self.moderators.get_moderator(self.u.guid)
        self.assertIsNone(moderators)

        self.moderators.save_moderator(self.u.guid, self.u.pubkey, '', '', '',
                                       'JOHN', '', '0', '')
        self.moderators.clear_all()
        moderators = self.moderators.get_moderator(self.u.guid)
        self.assertIsNone(moderators)

    def test_Purchases(self):
        purchase = self.purchases.get_purchase('NO_EXIST')
        self.assertIsNone(purchase)
        purchases = self.purchases.get_all()
        self.assertEqual(0, len(purchases))

        self.purchases.new_purchase('OID', 'NEW', '', ZERO_TIMESTAMP, '', '',
                                    '0', '', '', '', '')
        purchase = self.purchases.get_purchase('OID')
        self.assertEqual('OID', purchase[0])
        purchases = self.purchases.get_all()
        self.assertEqual(1, len(purchases))

        unfunded = self.purchases.get_unfunded()
        self.assertEqual(1, len(unfunded))

        status = self.purchases.get_status('OID')
        self.assertEqual(0, status)

        self.purchases.update_status('OID', 1)
        status = self.purchases.get_status('OID')
        self.assertEqual(1, status)

        unfunded = self.purchases.get_unfunded()
        self.assertEqual(0, len(unfunded))

        outpoint = self.purchases.get_outpoint('OID')
        self.assertIsNone(outpoint)
        self.purchases.update_outpoint('OID', 'OUTPOINT')
        outpoint = self.purchases.get_outpoint('OID')
        self.assertEqual('OUTPOINT', outpoint)

        self.purchases.delete_purchase('OID')
        purchase = self.purchases.get_purchase('OID')
        self.assertIsNone(purchase)

    def test_Sales(self):
        sale = self.sales.get_sale('NO_EXIST')
        self.assertIsNone(sale)
        sales = self.sales.get_all()
        self.assertEqual(0, len(sales))

        self.sales.new_sale('OID', 'NEW', '', ZERO_TIMESTAMP, '', '', '0', '',
                            '', '')
        sale = self.sales.get_sale('OID')
        self.assertEqual('OID', sale[0])
        sales = self.sales.get_all()
        self.assertEqual(1, len(sales))

        unfunded = self.sales.get_unfunded()
        self.assertEqual(1, len(unfunded))

        status = self.sales.get_status('OID')
        self.assertEqual(0, status)

        self.sales.update_status('OID', 1)
        status = self.sales.get_status('OID')
        self.assertEqual(1, status)

        unfunded = self.sales.get_unfunded()
        self.assertEqual(0, len(unfunded))

        outpoint = self.sales.get_outpoint('OID')
        self.assertIsNone(outpoint)
        self.sales.update_outpoint('OID', 'OUTPOINT')
        outpoint = self.sales.get_outpoint('OID')
        self.assertEqual('OUTPOINT', outpoint)

        self.sales.update_payment_tx('OID', 'TXDI')
        # no get method for payment_tx

        self.sales.delete_sale('OID')
        sale = self.sales.get_sale('OID')
        self.assertIsNone(sale)

    def test_NotificationStore(self):
        n = self.ns.get_notifications()
        self.assertTrue(len(n) == 0)
        self.ns.save_notification("1234", self.u.guid, self.m.handle, 'NOTICE',
                                  "", ""
                                  '0000-00-00 00:00:00', '', 0)
        n = self.ns.get_notifications()
        self.assertIsNotNone(n)
        self.ns.mark_as_read("1234")

        self.ns.delete_notification("1234")
        n = self.ns.get_notifications()
        self.assertTrue(len(n) == 0)

    def test_VendorStore(self):
        v = self.vs.get_vendors()
        self.assertEqual(v, {})
        addr = Node.IPAddress()
        addr.ip = "127.0.0.1"
        addr.port = 1234
        n = Node()
        n.guid = digest("abcdefg")
        n.publicKey = digest("signed pubkey")
        n.nodeAddress.MergeFrom(addr)
        n.natType = FULL_CONE
        self.vs.save_vendor(self.u.guid, n.SerializeToString())
        v = self.vs.get_vendors()
        self.assertIsNot(v, {})
        self.vs.delete_vendor(self.u.guid)
        v = self.vs.get_vendors()
        self.assertEqual(v, {})

    def test_Settings(self):
        NUM_SETTINGS = 16
        settings = self.settings.get()
        self.assertIsNone(settings)

        self.settings.update('NEW_ADDRESS', 'BTC', 'AUSTRALIA', 'EN', '', '',
                             '', '', '', '', '', '', '', '', "")
        settings = self.settings.get()
        self.assertEqual(NUM_SETTINGS, len(settings))