diff --git a/README.md b/README.md index 66c957a..e651cfa 100644 --- a/README.md +++ b/README.md @@ -32,6 +32,14 @@ See [tango.info wiki: TINT](https://tango.info/wiki/TINT) for a Product* is a 14-digit numeric tango.info code used by tango.info and others. +## Testing +Run `pytest tests.py`. + +Sample data obtained from tango.info via: +``` +wget 'https://tango.info/07798145106390' -O testdata/23-grandes-exitos.html +``` + ## Future Provided tango.info's [Tobias Conradi](https://tango.info/tangoinfo/eng/contact) does not change the page structure in a manner that breaks this plugin, you diff --git a/testdata/23-grandes-exitos.html b/testdata/23-grandes-exitos.html new file mode 100644 index 0000000..67b26ad --- /dev/null +++ b/testdata/23-grandes-exitos.html @@ -0,0 +1,121 @@ + +23 Grandes Exitos - tango.info + + + + + + + + + + + + + + + + + + + + + +
+
+

23 Grandes Exitos

+

Overview

23 Grandes Exitos
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Base data
Object type:product
TINP:07798145106390
Product artist:Juan D'Arienzo
Product collection:RGS/Tango Collection
Product type:CD
Date:
Catalog number:RGS 1639
EAN:7798145106390
(google, + amazon)
Side qty:1
Track qty:23
+ + + + + + + + + + + +
Other info
Tango.info/wiki:/07798145106390
Tango.info/tools:tracktagger/1.4.1
Tango.info/x:graphic
+ + + + + + +
Link
shops, producer:-

Side

+ + + + + + + + +
S#DurationDiscId
1N/A

Track

S#T#TitleGenreInstrumentalist(s)Vocalist(s)Perf dateDur.info
11Don JuantangoJuan D'Arienzo-1936-09-2902:37info
12PasiónvalsJuan D'Arienzo-1937-07-0202:42info
13El aprontetangoJuan D'Arienzo-1937-04-0102:47info
14La cumparsitatangoJuan D'Arienzo-1937-12-1403:26info
15MentíasvalsJuan D'Arienzo-1937-04-0102:24info
16HomerotangoJuan D'Arienzo-1937-04-2702:37info
17Gallo ciegotangoJuan D'Arienzo-1937-12-0903:05info
18Valsecito criollovalsJuan D'Arienzo-1937-07-2602:20info
19El triunfotangoJuan D'Arienzo-1938-03-2303:14info
110La mariposatangoJuan D'Arienzo-1938-03-2302:27info
111LeliatangoJuan D'Arienzo-1938-08-2602:28info
112CharamuscatangoJuan D'Arienzo-1939-05-3002:41info
113RetintíntangoJuan D'Arienzo-1936-01-3102:30info
114Don EstebantangoJuan D'Arienzo-1936-07-0303:30info
115No llores, madrevalsJuan D'Arienzo-1936-07-0302:25info
116El irresistibletangoJuan D'Arienzo-1936-08-0502:32info
117El baqueanotangoJuan D'Arienzo-1937-01-2103:05info
118InolvidablevalsJuan D'Arienzo-1936-08-0502:23info
119El cencerrotangoJuan D'Arienzo-1937-12-0902:46info
120La morochatangoJuan D'Arienzo-1937-12-2102:35info
121Melodía porteñatangoJuan D'Arienzo-1937-12-2102:53info
122Valsecito de antesvalsJuan D'Arienzo-1937-08-3102:23info
123Unión CívicatangoJuan D'Arienzo-1938-01-0702:29info
+ + + \ No newline at end of file diff --git a/tests.py b/tests.py index 2a2a2d6..30dabf5 100644 --- a/tests.py +++ b/tests.py @@ -1,23 +1,13 @@ # -*- coding: utf-8 -*- -# TODO Fix these """ Testing for tangoinfo.py, with some fixes to get around the wrong version error when running headless. -python2 only since picard is not py3k ready yet. - Run with `pytest tests.py` """ -# Python3 compatability -try: - unicode -except NameError: - unicode = str -try: - from urllib.request import urlopen # python3 -except ImportError: - from urllib2 import urlopen # python2 +import os +from urllib.request import urlopen class FakeModule(object): @@ -29,13 +19,46 @@ class FakeModule(object): return True # Path manipulation -import sys -sys.path.insert(0, '/usr/lib/picard') # Linux -import picard +import sys # noqa +import picard # noqa sys.modules['picard.metadata'] = FakeModule() -# Finally -import tangoinfo +# Importing tangoinfo plugin relies on (mocked) picard module being present +import tangoinfo # noqa + +sample_albums = { + # Key = barcode + '7798145106390': { + 'shortname': '23-grandes-exitos', + 'offline_file': '23-grandes-exitos.html', + 'url': 'https://tango.info/07798145106390', + 'barcode': '7798145106390', + 'tinp': '07798145106390', # NOT TINT! + 'nr_of_tracks': 23, + }, +} + +class FakeDataObject(): # noqa + def __init__(self, data): + self._data = data + def data(self): # noqa + return self._data + + +def get_album(barcode, offline=True): + if offline: + fp = os.path.join("testdata", sample_albums[barcode]['offline_file']) + # Read in binary mode + with open(fp, 'rb') as f: + fakedataobj = FakeDataObject(f.read()) + # return bytes (emulating a QByteArray) + return fakedataobj + else: + url = sample_albums[barcode]['url'] + # urlopen.read() will already return a stream of bytes + response = urlopen(url).read() + fakedataobj = FakeDataObject(response) + return fakedataobj class FakeTagger(tangoinfo.TangoInfoTagger): @@ -46,12 +69,16 @@ class FakeTagger(tangoinfo.TangoInfoTagger): def website_add_track(self, album, track, barcode, tint, zeros=0): self.album_add_request(album) - if self.albumpage_queue.append(barcode, (track, album, tint)): - host = 'tango.info' - path = '/%s' % (barcode) + response = get_album(barcode, offline=True) - response = urlopen('https://%s%s' % (host, path)).read() - return self.website_process(barcode, zeros, response, None, False) + if self.albumpage_queue.append(barcode, (track, album, tint)): + return self.website_process( + barcode=barcode, + zeros=zeros, + response_bytes=response, + reply=None, + error=False + ) class FakeTrack(object): @@ -64,16 +91,16 @@ class FakeTrack(object): self.metadata = metadata self._id = id_ - def iterfiles(self, dummy): + def iterfiles(self): # No need to test writing to files return [] def __repr__(self): - fmtstr = u"Disc: %s, Track: %2s, Barcode: %s, Genre: %7s, Date: %10s" + fmtstr = "Disc: %s, Track: %2s, Barcode: %s, Genre: %7s, Date: %10s" return ' %s' % ( self._id, fmtstr % tuple(map( - lambda x: unicode(self.metadata.get(x, '')), + lambda x: str(self.metadata.get(x, '')), ('discnumber', 'tracknumber', 'barcode', 'genre', 'date') )) ) @@ -97,20 +124,20 @@ class FakeAlbum(object): # Metadata: # 23 tracks, genre and performance date given but no vocalists -def test_barcode_process_metadata(): +def test_extract_data(): """ - Test barcode_process_metadata() + Test extract_data() """ taggerclass = tangoinfo.TangoInfoTagger() barcode = '7798145106390' - url = 'https://tango.info/07798145106390' - page = urlopen(url).read() + page = get_album(barcode, offline=True).data().decode('utf-8') - albuminfo = taggerclass.barcode_process_metadata(barcode, page) + albuminfo = taggerclass.extract_data(barcode, page) - assert albuminfo['07798145106390-1-19'].get('date') == u'1937-12-09' + assert albuminfo['7798145106390-1-19'].get('date') == '1937-12-09' assert len(albuminfo.keys()) == 23 + # For visual inspection return "\n".join(str(i) for i in sorted(albuminfo.items())) @@ -120,24 +147,29 @@ def test_add_tangoinfo_data(): """ taggerclass = FakeTagger() barcode = '7798145106390' - trackxmlnode = 'fakexmlnode' - releasexmlnode = 'fakereleasenode' + track = 'faketrack' + release = 'fakerelease' + nr_of_tracks = sample_albums[barcode]['nr_of_tracks'] + disc_nr = 1 # Set up fake album albumtracks = [] - for i in range(1, 24): - fakealbumtrack = FakeTrack(id_='%s-1-%d' % (barcode, i), - metadata=dict(tracknumber=i, barcode=barcode, - discnumber=1)) + for i in range(1, (nr_of_tracks + 1)): + fakealbumtrack = FakeTrack( + id_='%s-%d-%d' % (barcode, disc_nr, i), + metadata=dict(tracknumber=i, + barcode=barcode, + discnumber=disc_nr), + ) albumtracks.append(fakealbumtrack) album = FakeAlbum(id_='fakeid', new_tracks=albumtracks) # Run plugin loaded_tracks = [] - for i in range(1, 24): + for i in range(1, (nr_of_tracks + 1)): taggerclass.add_tangoinfo_data(album, album._new_tracks[-1].metadata, - trackxmlnode, releasexmlnode) + track, release) loaded_track = album._new_tracks.pop() loaded_tracks.append(loaded_track) @@ -147,25 +179,22 @@ def test_add_tangoinfo_data(): # Start assertions # Track 1: Don Juan - assert loaded_tracks[0].metadata.get('genre') == u'Tango' + assert loaded_tracks[0].metadata.get('genre') == 'Tango' # Track 2: Pasión - assert loaded_tracks[1].metadata.get('genre') == u'Vals' + assert loaded_tracks[1].metadata.get('genre') == 'Vals' # Track 22: Valsecito de antes - assert loaded_tracks[21].metadata.get('date') == u'1937-08-31' + assert loaded_tracks[21].metadata.get('date') == '1937-08-31' # Output test data for visual inspection - return unicode('\n'.join([unicode(t) for t in loaded_tracks])) - + return '\n'.join([str(t) for t in loaded_tracks]) if __name__ == '__main__': - pass - # Run these to debug + print("Testing extract_data()") + print(test_extract_data()) - #print("Testing add_tangoinfo_data()") - #print(test_add_tangoinfo_data()) - #print("") + print("") - #print("Testing barcode_process_metadata()") - #print(test_barcode_process_metadata()) + print("Testing add_tangoinfo_data()") + print(test_add_tangoinfo_data())