コード例 #1
0
ファイル: test_sqldb.py プロジェクト: WebDevCaptain/lbry-sdk
 def test_support_added_and_removed_in_same_block(self):
     advance, state = self.advance, self.state
     stream = self.get_stream('Claim A', 10*COIN)
     advance(10, [stream])
     support = self.get_support(stream, COIN)
     advance(20, [support, self.get_abandon(support)])
     self.assertEqual(reader._search()[0]['support_amount'], 0)
コード例 #2
0
 def test_trending(self):
     advance, state = self.advance, self.state
     no_trend = self.get_stream('Claim A', COIN)
     downwards = self.get_stream('Claim B', COIN)
     up_small = self.get_stream('Claim C', COIN)
     up_medium = self.get_stream('Claim D', COIN)
     up_biggly = self.get_stream('Claim E', COIN)
     claims = advance(1,
                      [up_biggly, up_medium, up_small, no_trend, downwards])
     for window in range(1, 8):
         advance(TRENDING_WINDOW * window, [
             self.get_support(downwards, (20 - window) * COIN),
             self.get_support(up_small, int(20 + (window / 10) * COIN)),
             self.get_support(up_medium,
                              (20 + (window *
                                     (2 if window == 7 else 1))) * COIN),
             self.get_support(up_biggly,
                              (20 + (window *
                                     (3 if window == 7 else 1))) * COIN),
         ])
     results = reader._search(order_by=['trending_local'])
     self.assertEqual(
         [c.claim_id for c in claims],
         [hexlify(c['claim_hash'][::-1]).decode() for c in results])
     self.assertEqual([10, 6, 2, 0, -2],
                      [int(c['trending_local']) for c in results])
     self.assertEqual([53, 38, -32, 0, -6],
                      [int(c['trending_global']) for c in results])
     self.assertEqual([4, 4, 2, 0, 1],
                      [int(c['trending_group']) for c in results])
     self.assertEqual([53, 38, 2, 0, -6],
                      [int(c['trending_mixed']) for c in results])
コード例 #3
0
ファイル: test_sqldb.py プロジェクト: WebDevCaptain/lbry-sdk
 def test_update_and_abandon_in_same_block(self):
     advance, state = self.advance, self.state
     stream = self.get_stream('Claim A', 10*COIN)
     advance(10, [stream])
     update = self.get_stream_update(stream, 11*COIN)
     advance(20, [update, self.get_abandon(update)])
     self.assertFalse(reader._search())
コード例 #4
0
ファイル: test_sqldb.py プロジェクト: WebDevCaptain/lbry-sdk
 def test_double_updates_in_same_block(self):
     advance, state = self.advance, self.state
     stream = self.get_stream('Claim A', 10*COIN)
     advance(10, [stream])
     update = self.get_stream_update(stream, 11*COIN)
     advance(20, [update, self.get_stream_update(update, 9*COIN)])
     self.assertTrue(reader._search())
コード例 #5
0
    def test_canonical_url_and_channel_validation(self):
        advance = self.advance

        tx_chan_a = self.get_channel_with_claim_id_prefix('a', 1, key=b'c')
        tx_chan_ab = self.get_channel_with_claim_id_prefix('ab', 72, key=b'c')
        txo_chan_a = tx_chan_a[0].outputs[0]
        txo_chan_ab = tx_chan_ab[0].outputs[0]
        advance(1, [tx_chan_a])
        advance(2, [tx_chan_ab])
        r_ab, r_a = reader._search(order_by=['creation_height'], limit=2)
        self.assertEqual("@foo#a", r_a['short_url'])
        self.assertEqual("@foo#ab", r_ab['short_url'])
        self.assertIsNone(r_a['canonical_url'])
        self.assertIsNone(r_ab['canonical_url'])
        self.assertEqual(0, r_a['claims_in_channel'])
        self.assertEqual(0, r_ab['claims_in_channel'])

        tx_a = self.get_stream_with_claim_id_prefix('a', 2)
        tx_ab = self.get_stream_with_claim_id_prefix('ab', 42)
        tx_abc = self.get_stream_with_claim_id_prefix('abc', 65)
        advance(3, [tx_a])
        advance(4, [tx_ab, tx_abc])
        r_abc, r_ab, r_a = reader._search(
            order_by=['creation_height', 'tx_position'], limit=3)
        self.assertEqual("foo#a", r_a['short_url'])
        self.assertEqual("foo#ab", r_ab['short_url'])
        self.assertEqual("foo#abc", r_abc['short_url'])
        self.assertIsNone(r_a['canonical_url'])
        self.assertIsNone(r_ab['canonical_url'])
        self.assertIsNone(r_abc['canonical_url'])

        tx_a2 = self.get_stream_with_claim_id_prefix('a',
                                                     7,
                                                     channel=txo_chan_a)
        tx_ab2 = self.get_stream_with_claim_id_prefix('ab',
                                                      23,
                                                      channel=txo_chan_a)
        a2_claim = tx_a2[0].outputs[0]
        ab2_claim = tx_ab2[0].outputs[0]
        advance(6, [tx_a2])
        advance(7, [tx_ab2])
        r_ab2, r_a2 = reader._search(order_by=['creation_height'], limit=2)
        self.assertEqual(f"foo#{a2_claim.claim_id[:2]}", r_a2['short_url'])
        self.assertEqual(f"foo#{ab2_claim.claim_id[:4]}", r_ab2['short_url'])
        self.assertEqual("@foo#a/foo#a", r_a2['canonical_url'])
        self.assertEqual("@foo#a/foo#ab", r_ab2['canonical_url'])
        self.assertEqual(
            2,
            reader._search(claim_id=txo_chan_a.claim_id,
                           limit=1)[0]['claims_in_channel'])

        # change channel public key, invaliding stream claim signatures
        advance(8, [self.get_channel_update(txo_chan_a, COIN, key=b'a')])
        r_ab2, r_a2 = reader._search(order_by=['creation_height'], limit=2)
        self.assertEqual(f"foo#{a2_claim.claim_id[:2]}", r_a2['short_url'])
        self.assertEqual(f"foo#{ab2_claim.claim_id[:4]}", r_ab2['short_url'])
        self.assertIsNone(r_a2['canonical_url'])
        self.assertIsNone(r_ab2['canonical_url'])
        self.assertEqual(
            0,
            reader._search(claim_id=txo_chan_a.claim_id,
                           limit=1)[0]['claims_in_channel'])

        # reinstate previous channel public key (previous stream claim signatures become valid again)
        channel_update = self.get_channel_update(txo_chan_a, COIN, key=b'c')
        advance(9, [channel_update])
        r_ab2, r_a2 = reader._search(order_by=['creation_height'], limit=2)
        self.assertEqual(f"foo#{a2_claim.claim_id[:2]}", r_a2['short_url'])
        self.assertEqual(f"foo#{ab2_claim.claim_id[:4]}", r_ab2['short_url'])
        self.assertEqual("@foo#a/foo#a", r_a2['canonical_url'])
        self.assertEqual("@foo#a/foo#ab", r_ab2['canonical_url'])
        self.assertEqual(
            2,
            reader._search(claim_id=txo_chan_a.claim_id,
                           limit=1)[0]['claims_in_channel'])
        self.assertEqual(
            0,
            reader._search(claim_id=txo_chan_ab.claim_id,
                           limit=1)[0]['claims_in_channel'])

        # change channel of stream
        self.assertEqual(
            "@foo#a/foo#ab",
            reader._search(claim_id=ab2_claim.claim_id,
                           limit=1)[0]['canonical_url'])
        tx_ab2 = self.get_stream_update(tx_ab2, COIN, txo_chan_ab)
        advance(10, [tx_ab2])
        self.assertEqual(
            "@foo#ab/foo#a",
            reader._search(claim_id=ab2_claim.claim_id,
                           limit=1)[0]['canonical_url'])
        # TODO: currently there is a bug where stream leaving a channel does not update that channels claims count
        self.assertEqual(
            2,
            reader._search(claim_id=txo_chan_a.claim_id,
                           limit=1)[0]['claims_in_channel'])
        # TODO: after bug is fixed remove test above and add test below
        #self.assertEqual(1, reader._search(claim_id=txo_chan_a.claim_id, limit=1)[0]['claims_in_channel'])
        self.assertEqual(
            1,
            reader._search(claim_id=txo_chan_ab.claim_id,
                           limit=1)[0]['claims_in_channel'])

        # claim abandon updates claims_in_channel
        advance(11, [self.get_abandon(tx_ab2)])
        self.assertEqual(
            0,
            reader._search(claim_id=txo_chan_ab.claim_id,
                           limit=1)[0]['claims_in_channel'])

        # delete channel, invaliding stream claim signatures
        advance(12, [self.get_abandon(channel_update)])
        r_a2, = reader._search(order_by=['creation_height'], limit=1)
        self.assertEqual(f"foo#{a2_claim.claim_id[:2]}", r_a2['short_url'])
        self.assertIsNone(r_a2['canonical_url'])
コード例 #6
0
ファイル: test_sqldb.py プロジェクト: WebDevCaptain/lbry-sdk
 def test_create_and_abandon_in_same_block(self):
     advance, state = self.advance, self.state
     stream = self.get_stream('Claim A', 10*COIN)
     advance(10, [stream, self.get_abandon(stream)])
     self.assertFalse(reader._search())
コード例 #7
0
ファイル: test_sqldb.py プロジェクト: WebDevCaptain/lbry-sdk
 def test_create_and_update_in_same_block(self):
     advance, state = self.advance, self.state
     stream = self.get_stream('Claim A', 10*COIN)
     advance(10, [stream, self.get_stream_update(stream, 11*COIN)])
     self.assertTrue(reader._search())