forked from LBRYCommunity/lbry-sdk
add unit test for file list sorting
This commit is contained in:
parent
eec3734d2f
commit
852354719f
1 changed files with 139 additions and 0 deletions
|
@ -1,16 +1,21 @@
|
||||||
import mock
|
import mock
|
||||||
import json
|
import json
|
||||||
import unittest
|
import unittest
|
||||||
|
from os import path
|
||||||
|
|
||||||
from twisted.internet import defer
|
from twisted.internet import defer
|
||||||
from twisted import trial
|
from twisted import trial
|
||||||
|
|
||||||
|
from faker import Faker
|
||||||
|
|
||||||
from lbryschema.decode import smart_decode
|
from lbryschema.decode import smart_decode
|
||||||
from lbryum.wallet import NewWallet
|
from lbryum.wallet import NewWallet
|
||||||
from lbrynet import conf
|
from lbrynet import conf
|
||||||
from lbrynet.core import Session, PaymentRateManager, Wallet
|
from lbrynet.core import Session, PaymentRateManager, Wallet
|
||||||
from lbrynet.database.storage import SQLiteStorage
|
from lbrynet.database.storage import SQLiteStorage
|
||||||
from lbrynet.daemon.Daemon import Daemon as LBRYDaemon
|
from lbrynet.daemon.Daemon import Daemon as LBRYDaemon
|
||||||
|
from lbrynet.file_manager.EncryptedFileManager import EncryptedFileManager
|
||||||
|
from lbrynet.file_manager.EncryptedFileDownloader import ManagedEncryptedFileDownloader
|
||||||
|
|
||||||
from lbrynet.tests import util
|
from lbrynet.tests import util
|
||||||
from lbrynet.tests.mocks import mock_conf_settings, FakeNetwork
|
from lbrynet.tests.mocks import mock_conf_settings, FakeNetwork
|
||||||
|
@ -126,3 +131,137 @@ class TestJsonRpc(trial.unittest.TestCase):
|
||||||
d = defer.maybeDeferred(self.test_daemon.jsonrpc_help, command='status')
|
d = defer.maybeDeferred(self.test_daemon.jsonrpc_help, command='status')
|
||||||
d.addCallback(lambda result: self.assertSubstring('daemon status', result['help']))
|
d.addCallback(lambda result: self.assertSubstring('daemon status', result['help']))
|
||||||
# self.assertSubstring('daemon status', d.result)
|
# self.assertSubstring('daemon status', d.result)
|
||||||
|
|
||||||
|
|
||||||
|
class TestFileListSorting(trial.unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
mock_conf_settings(self)
|
||||||
|
util.resetTime(self)
|
||||||
|
self.faker = Faker('en_US')
|
||||||
|
self.faker.seed(66410)
|
||||||
|
self.test_daemon = get_test_daemon()
|
||||||
|
self.test_daemon.lbry_file_manager = mock.Mock(spec=EncryptedFileManager)
|
||||||
|
self.test_daemon.lbry_file_manager.lbry_files = self._get_fake_lbry_files()
|
||||||
|
|
||||||
|
# Pre-sorted lists of prices and file names in ascending order produced by
|
||||||
|
# faker with seed 66410. This seed was chosen becacuse it produces 3 results
|
||||||
|
# 'points_paid' at 6.0 and 2 results at 4.5 to test multiple sort criteria.
|
||||||
|
self.test_prices = [0.2, 2.9, 4.5, 4.5, 6.0, 6.0, 6.0, 6.8, 7.1, 9.2]
|
||||||
|
self.test_file_names = ['also.mp3', 'better.css', 'call.mp3', 'pay.jpg',
|
||||||
|
'record.pages', 'sell.css', 'strategy.pages',
|
||||||
|
'thousand.pages', 'town.mov', 'vote.ppt']
|
||||||
|
|
||||||
|
@defer.inlineCallbacks
|
||||||
|
def test_sort_by_price_no_direction_specified(self):
|
||||||
|
sort_options = ['price']
|
||||||
|
file_list = yield self.test_daemon.jsonrpc_file_list(sort=sort_options)
|
||||||
|
received = [f['points_paid'] for f in file_list]
|
||||||
|
self.assertEquals(self.test_prices, received)
|
||||||
|
|
||||||
|
@defer.inlineCallbacks
|
||||||
|
def test_sort_by_price_ascending(self):
|
||||||
|
sort_options = ['price,asc']
|
||||||
|
file_list = yield self.test_daemon.jsonrpc_file_list(sort=sort_options)
|
||||||
|
received = [f['points_paid'] for f in file_list]
|
||||||
|
self.assertEquals(self.test_prices, received)
|
||||||
|
|
||||||
|
@defer.inlineCallbacks
|
||||||
|
def test_sort_by_price_descending(self):
|
||||||
|
sort_options = ['price, desc']
|
||||||
|
file_list = yield self.test_daemon.jsonrpc_file_list(sort=sort_options)
|
||||||
|
received = [f['points_paid'] for f in file_list]
|
||||||
|
expected = list(reversed(self.test_prices))
|
||||||
|
self.assertEquals(expected, received)
|
||||||
|
|
||||||
|
@defer.inlineCallbacks
|
||||||
|
def test_sort_by_name_no_direction_specified(self):
|
||||||
|
sort_options = ['name']
|
||||||
|
file_list = yield self.test_daemon.jsonrpc_file_list(sort=sort_options)
|
||||||
|
received = [f['file_name'] for f in file_list]
|
||||||
|
self.assertEquals(self.test_file_names, received)
|
||||||
|
|
||||||
|
@defer.inlineCallbacks
|
||||||
|
def test_sort_by_name_ascending(self):
|
||||||
|
sort_options = ['name,\nasc']
|
||||||
|
file_list = yield self.test_daemon.jsonrpc_file_list(sort=sort_options)
|
||||||
|
received = [f['file_name'] for f in file_list]
|
||||||
|
self.assertEquals(self.test_file_names, received)
|
||||||
|
|
||||||
|
@defer.inlineCallbacks
|
||||||
|
def test_sort_by_name_descending(self):
|
||||||
|
sort_options = ['\tname,\n\tdesc']
|
||||||
|
file_list = yield self.test_daemon.jsonrpc_file_list(sort=sort_options)
|
||||||
|
received = [f['file_name'] for f in file_list]
|
||||||
|
expected = list(reversed(self.test_file_names))
|
||||||
|
self.assertEquals(expected, received)
|
||||||
|
|
||||||
|
@defer.inlineCallbacks
|
||||||
|
def test_sort_by_multiple_criteria(self):
|
||||||
|
sort_options = ['name,asc', 'price,desc']
|
||||||
|
file_list = yield self.test_daemon.jsonrpc_file_list(sort=sort_options)
|
||||||
|
received = ['name={}, price={}'.format(f['file_name'], f['points_paid']) for f in file_list]
|
||||||
|
expected = ['name=record.pages, price=9.2',
|
||||||
|
'name=vote.ppt, price=7.1',
|
||||||
|
'name=strategy.pages, price=6.8',
|
||||||
|
'name=also.mp3, price=6.0',
|
||||||
|
'name=better.css, price=6.0',
|
||||||
|
'name=town.mov, price=6.0',
|
||||||
|
'name=sell.css, price=4.5',
|
||||||
|
'name=thousand.pages, price=4.5',
|
||||||
|
'name=call.mp3, price=2.9',
|
||||||
|
'name=pay.jpg, price=0.2']
|
||||||
|
self.assertEquals(expected, received)
|
||||||
|
|
||||||
|
# Check that the list is not sorted as expected when sorted only by name.
|
||||||
|
sort_options = ['name,asc']
|
||||||
|
file_list = yield self.test_daemon.jsonrpc_file_list(sort=sort_options)
|
||||||
|
received = ['name={}, price={}'.format(f['file_name'], f['points_paid']) for f in file_list]
|
||||||
|
self.assertNotEqual(expected, received)
|
||||||
|
|
||||||
|
# Check that the list is not sorted as expected when sorted only by price.
|
||||||
|
sort_options = ['price,desc']
|
||||||
|
file_list = yield self.test_daemon.jsonrpc_file_list(sort=sort_options)
|
||||||
|
received = ['name={}, price={}'.format(f['file_name'], f['points_paid']) for f in file_list]
|
||||||
|
self.assertNotEqual(expected, received)
|
||||||
|
|
||||||
|
# Check that the list is not sorted as expected when not sorted at all.
|
||||||
|
file_list = yield self.test_daemon.jsonrpc_file_list()
|
||||||
|
received = ['name={}, price={}'.format(f['file_name'], f['points_paid']) for f in file_list]
|
||||||
|
self.assertNotEqual(expected, received)
|
||||||
|
|
||||||
|
def _get_fake_lbry_files(self):
|
||||||
|
return [self._get_fake_lbry_file() for _ in xrange(10)]
|
||||||
|
|
||||||
|
def _get_fake_lbry_file(self):
|
||||||
|
lbry_file = mock.Mock(spec=ManagedEncryptedFileDownloader)
|
||||||
|
|
||||||
|
file_path = self.faker.file_path()
|
||||||
|
stream_name = self.faker.file_name()
|
||||||
|
faked_attributes = {
|
||||||
|
'channel_claim_id': self.faker.sha1(),
|
||||||
|
'channel_name': '@' + self.faker.simple_profile()['username'],
|
||||||
|
'claim_id': self.faker.sha1(),
|
||||||
|
'claim_name': '-'.join(self.faker.words(4)),
|
||||||
|
'completed': self.faker.boolean(),
|
||||||
|
'download_directory': path.dirname(file_path),
|
||||||
|
'download_path': file_path,
|
||||||
|
'file_name': path.basename(file_path),
|
||||||
|
'key': self.faker.md5(),
|
||||||
|
'metadata': {},
|
||||||
|
'mime_type': self.faker.mime_type(),
|
||||||
|
'nout': abs(self.faker.pyint()),
|
||||||
|
'outpoint': self.faker.md5() + self.faker.md5(),
|
||||||
|
'points_paid': self.faker.pyfloat(left_digits=1, right_digits=1, positive=True),
|
||||||
|
'sd_hash': self.faker.md5() + self.faker.md5() + self.faker.md5(),
|
||||||
|
'stopped': self.faker.boolean(),
|
||||||
|
'stream_hash': self.faker.md5() + self.faker.md5() + self.faker.md5(),
|
||||||
|
'stream_name': stream_name,
|
||||||
|
'suggested_file_name': stream_name,
|
||||||
|
'txid': self.faker.md5() + self.faker.md5(),
|
||||||
|
'written_bytes': self.faker.pyint(),
|
||||||
|
}
|
||||||
|
|
||||||
|
for key in faked_attributes:
|
||||||
|
setattr(lbry_file, key, faked_attributes[key])
|
||||||
|
|
||||||
|
return lbry_file
|
||||||
|
|
Loading…
Add table
Reference in a new issue