Skip to content

Commit

Permalink
Merge pull request #28 from calluswhatyouwant/v0.1.x
Browse files Browse the repository at this point in the history
Upgrade to v0.1.3
  • Loading branch information
JoseRenan committed Nov 16, 2018
2 parents 9915755 + 53b8cec commit a392a10
Show file tree
Hide file tree
Showing 14 changed files with 2,709 additions and 51 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"Robson Junior <jrobsonjr16@gmail.com> (https://github.com/JRobsonJr)"
],
"license": "MIT",
"version": "0.1.2",
"version": "0.1.3",
"dependencies": {
"axios": "^0.18.0"
},
Expand Down
29 changes: 21 additions & 8 deletions src/lib/artists.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,15 @@
import { getAxiosSpotifyInstance } from './driver';
import Artist from './models/artist/artist';
import Album from './models/album/album';
import Track from './models/track/track';
import Page from './models/paging/page';
import AlbumSimplified from './models/album/album-simplified';

export const getArtist = async (id: string) => {
export const getArtist = async (id: string): Promise<Artist> => {
const response = await getAxiosSpotifyInstance().get(`/artists/${id}`);
return new Artist(response.data);
};

export const getSeveralArtists = async (ids: string[]) => {
export const getSeveralArtists = async (ids: string[]): Promise<Artist[]> => {
if (ids.length > 50) {
const exceptionLink =
'https://developer.spotify.com/documentation/web-api/reference/artists/get-several-artists/';
Expand All @@ -25,16 +24,25 @@ export const getSeveralArtists = async (ids: string[]) => {
);
};

export const getArtistAlbums = async (id: string, offset = 0, limit = 20) => {
const params = { params: { offset, limit } };
export const getArtistAlbums = async (
id: string,
offset = 0,
limit = 20,
includeGroups?: string[],
market?: string
): Promise<Page<AlbumSimplified>> => {
const params: any = { params: { offset, limit, market } };
if (includeGroups) params.params.include_groups = includeGroups.join(',');
const response = await getAxiosSpotifyInstance().get(
`/artists/${id}/albums`,
params
);
return new Page<AlbumSimplified>(response.data, AlbumSimplified);
};

export const getRelatedArtists = async (id: string) => {
export const getArtistRelatedArtists = async (
id: string
): Promise<Artist[]> => {
const response = await getAxiosSpotifyInstance().get(
`/artists/${id}/related-artists`
);
Expand All @@ -43,9 +51,14 @@ export const getRelatedArtists = async (id: string) => {
);
};

export const getArtistTopTracks = async (id: string) => {
export const getArtistTopTracks = async (
id: string,
market: string
): Promise<Track[]> => {
const params = { params: { market } };
const response = await getAxiosSpotifyInstance().get(
`/artists/${id}/top-tracks`
`/artists/${id}/top-tracks`,
params
);
return response.data.tracks.map((trackJson: any) => new Track(trackJson));
};
2 changes: 1 addition & 1 deletion src/lib/models/track/track.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ class Track {
this.trackNumber = json.track_number;
this.type = json.type;
this.uri = json.uri;
this.isLocal = json.isLocal;
this.isLocal = json.is_local;
}

get albumName() {
Expand Down
51 changes: 10 additions & 41 deletions test/album.test.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,13 @@
import { expect } from 'chai';
import nock from 'nock';

import { albumMock, AlbumMock } from './mocks/album.response';
import { severalAlbumsMock } from './mocks/several-albums.response';
import { albumTracksMock } from './mocks/album-tracks.response';
import { albumMock, AlbumMock } from './mocks/album.mock';
import { severalAlbumsMock } from './mocks/several-albums.mock';
import { albumTracksMock } from './mocks/album-tracks.mock';
import {
checkMatchingAlbumAttributes,
checkMatchingPagingObjectAttributes,
} from './common/matching-attributes.test';

import { init, getAlbum, getSeveralAlbums, getAlbumTracks } from '../src/lib';
import Album from '../src/lib/models/album/album';
Expand All @@ -13,30 +17,6 @@ describe('Album requests', () => {
init('SomeToken');
});

const checkMatchingAlbumAttributes = (response: Album, mock: AlbumMock) => {
expect(response.albumType).to.be.equal(mock.album_type);
expect(response.artists).to.have.lengthOf(mock.artists.length);
expect(response.availableMarkets).to.be.eql(mock.available_markets);
expect(response.copyrights).to.be.eql(mock.copyrights);
expect(response.externalIds).to.be.eql(mock.external_ids);
expect(response.externalUrls).to.be.eql(mock.external_urls);
expect(response.genres).to.be.eql(mock.genres);
expect(response.href).to.be.equal(mock.href);
expect(response.id).to.be.equal(mock.id);
expect(response.images).to.be.eql(mock.images);
expect(response.label).to.be.equal(mock.label);
expect(response.name).to.be.equal(mock.name);
expect(response.popularity).to.be.equal(mock.popularity);
expect(response.releaseDate).to.be.equal(mock.release_date);
expect(response.releaseDatePrecision).to.be.equal(
mock.release_date_precision
);
expect(response.totalTracks).to.be.equal(mock.total_tracks);
expect(response.tracks.total).to.be.equal(mock.tracks.total);
expect(response.type).to.be.equal(mock.type);
expect(response.uri).to.be.equal(mock.uri);
};

describe('#getAlbum()', () => {
beforeEach(() => {
nock('https://api.spotify.com/v1')
Expand Down Expand Up @@ -95,20 +75,9 @@ describe('Album requests', () => {
0,
2
);
expect(albumTracksResponse.href).to.be.equal(
albumTracksMock.href.split('?')[0]
);
expect(albumTracksResponse.items).to.have.lengthOf(
albumTracksMock.items.length
);
expect(albumTracksResponse.limit).to.be.equal(
albumTracksMock.limit
);
expect(albumTracksResponse.offset).to.be.equal(
albumTracksMock.offset
);
expect(albumTracksResponse.total).to.be.equal(
albumTracksMock.total
checkMatchingPagingObjectAttributes(
albumTracksResponse,
albumTracksMock
);
});

Expand Down
130 changes: 130 additions & 0 deletions test/artist.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
import nock from 'nock';

import { artistMock, ArtistMock } from './mocks/artist.mock';
import { severalArtistsMock } from './mocks/several-artists.mock';
import { artistAlbumsMock } from './mocks/artist-albums.mock';
import { artistRelatedArtistsMock } from './mocks/artist-related-artists.mock';
import { artistTopTracksMock, TrackMock } from './mocks/artist-top-tracks.mock';
import {
checkMatchingArtistAttributes,
checkMatchingPagingObjectAttributes,
checkMatchingTrackAttributes,
} from './common/matching-attributes.test';

import {
init,
getArtist,
getSeveralArtists,
getArtistAlbums,
getArtistRelatedArtists,
getArtistTopTracks,
} from '../src/lib';
import Artist from '../src/lib/models/artist/artist';
import Track from '../src/lib/models/track/track';

describe('Artist requests', () => {
beforeEach(() => {
init('SomeToken');
});

describe('#getArtist()', () => {
beforeEach(() => {
nock('https://api.spotify.com/v1')
.get('/artists/1WgXqy2Dd70QQOU7Ay074N')
.reply(200, artistMock);
});

it('response should match all artist attributes', async () => {
const artistResponse = await getArtist('1WgXqy2Dd70QQOU7Ay074N');
checkMatchingArtistAttributes(artistResponse, artistMock);
});
});

describe('#getSeveralArtists()', () => {
beforeEach(() => {
nock('https://api.spotify.com/v1')
.get('/artists')
.query({
ids: ['5WUlDfRSoLAfcVSX1WnrxN', '1WgXqy2Dd70QQOU7Ay074N'],
})
.reply(200, severalArtistsMock);
});

it('response should match all artists attributes', async () => {
const severalArtistsResponse = await getSeveralArtists([
'5WUlDfRSoLAfcVSX1WnrxN',
'1WgXqy2Dd70QQOU7Ay074N',
]);

for (let i = 0; i < severalArtistsResponse.length; i++) {
const artistResponse = severalArtistsResponse[i];
const artistMock = severalArtistsMock.artists[i];
checkMatchingArtistAttributes(artistResponse, artistMock);
}
});
});

describe('#getArtistAlbums()', () => {
beforeEach(() => {
nock('https://api.spotify.com/v1')
.get('/artists/1WgXqy2Dd70QQOU7Ay074N/albums')
.query({ offset: 0, limit: 5 })
.reply(200, artistAlbumsMock);
});

it('response should match all albums attributes', async () => {
const artistAlbumsResponse = await getArtistAlbums(
'1WgXqy2Dd70QQOU7Ay074N',
0,
5
);
checkMatchingPagingObjectAttributes(
artistAlbumsResponse,
artistAlbumsMock
);
});
});

describe('#getArtistRelatedArtists()', () => {
beforeEach(() => {
nock('https://api.spotify.com/v1')
.get('/artists/1WgXqy2Dd70QQOU7Ay074N/related-artists')
.reply(200, artistRelatedArtistsMock);
});

it('response should match all artists attributes', async () => {
const artistRelatedArtistsResponse = await getArtistRelatedArtists(
'1WgXqy2Dd70QQOU7Ay074N'
);

for (let i = 0; i < artistRelatedArtistsResponse.length; i++) {
const artistResponse: Artist = artistRelatedArtistsResponse[i];
const artistMock: ArtistMock =
artistRelatedArtistsMock.artists[i];
checkMatchingArtistAttributes(artistResponse, artistMock);
}
});
});

describe('#getArtistTopTracks()', () => {
beforeEach(() => {
nock('https://api.spotify.com/v1')
.get('/artists/1WgXqy2Dd70QQOU7Ay074N/top-tracks')
.query({ market: 'BR' })
.reply(200, artistTopTracksMock);
});

it('response should match all tracks attributes', async () => {
const artistTopTracksResponse = await getArtistTopTracks(
'1WgXqy2Dd70QQOU7Ay074N',
'BR'
);

for (let i = 0; i < artistTopTracksResponse.length; i++) {
const topTrackResponse: Track = artistTopTracksResponse[i];
const topTrackMock: TrackMock = artistTopTracksMock.tracks[i];
checkMatchingTrackAttributes(topTrackResponse, topTrackMock);
}
});
});
});
105 changes: 105 additions & 0 deletions test/common/matching-attributes.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
import { expect } from 'chai';

import Album from '../../src/lib/models/album/album';
import AlbumSimplified from '../../src/lib/models/album/album-simplified';
import Artist from '../../src/lib/models/artist/artist';
import Track from '../../src/lib/models/track/track';
import { AlbumMock } from '../mocks/album.mock';
import { ArtistMock } from '../mocks/artist.mock';
import { TrackMock } from './../mocks/artist-top-tracks.mock';

export const checkMatchingAlbumAttributes = (
response: Album,
mock: AlbumMock
) => {
expect(response.albumType).to.be.equal(mock.album_type);
expect(response.artists).to.have.lengthOf(mock.artists.length);
expect(response.availableMarkets).to.be.eql(mock.available_markets);
expect(response.copyrights).to.be.eql(mock.copyrights);
expect(response.externalIds).to.be.eql(mock.external_ids);
expect(response.externalUrls).to.be.eql(mock.external_urls);
expect(response.genres).to.be.eql(mock.genres);
expect(response.href).to.be.equal(mock.href);
expect(response.id).to.be.equal(mock.id);
expect(response.images).to.be.eql(mock.images);
expect(response.label).to.be.equal(mock.label);
expect(response.name).to.be.equal(mock.name);
expect(response.popularity).to.be.equal(mock.popularity);
expect(response.releaseDate).to.be.equal(mock.release_date);
expect(response.releaseDatePrecision).to.be.equal(
mock.release_date_precision
);
expect(response.totalTracks).to.be.equal(mock.total_tracks);
expect(response.tracks.total).to.be.equal(mock.tracks.total);
expect(response.type).to.be.equal(mock.type);
expect(response.uri).to.be.equal(mock.uri);
};

export const checkMatchingAlbumSimplifiedAttributes = (
response: AlbumSimplified,
mock: any
) => {
expect(response.albumType).to.be.equal(mock.album_type);
expect(response.artists).to.have.lengthOf(mock.artists.length);
expect(response.externalUrls).to.be.eql(mock.external_urls);
expect(response.href).to.be.equal(mock.href);
expect(response.id).to.be.equal(mock.id);
expect(response.images).to.be.eql(mock.images);
expect(response.name).to.be.equal(mock.name);
expect(response.releaseDate).to.be.equal(mock.release_date);
expect(response.releaseDatePrecision).to.be.equal(
mock.release_date_precision
);
expect(response.type).to.be.equal(mock.type);
expect(response.uri).to.be.equal(mock.uri);
};

export const checkMatchingArtistAttributes = (
response: Artist,
mock: ArtistMock
) => {
expect(response.externalUrls).to.be.eql(mock.external_urls);
expect(response.followers).to.be.eql(mock.followers);
expect(response.genres).to.be.eql(mock.genres);
expect(response.href).to.be.equal(mock.href);
expect(response.id).to.be.equal(mock.id);
expect(response.images).to.be.eql(mock.images);
expect(response.name).to.be.equal(mock.name);
expect(response.popularity).to.be.equal(mock.popularity);
expect(response.type).to.be.equal(mock.type);
expect(response.uri).to.be.equal(mock.uri);
};

export const checkMatchingTrackAttributes = (
response: Track,
mock: TrackMock
) => {
checkMatchingAlbumSimplifiedAttributes(response.album, mock.album);
expect(response.artists).to.have.lengthOf(mock.artists.length);
expect(response.discNumber).to.be.equal(mock.disc_number);
expect(response.durationMs).to.be.equal(mock.duration_ms);
expect(response.explicit).to.be.equal(mock.explicit);
expect(response.externalIds).to.be.eql(mock.external_ids);
expect(response.externalUrls).to.be.eql(mock.external_urls);
expect(response.href).to.be.equal(mock.href);
expect(response.id).to.be.equal(mock.id);
expect(response.isLocal).to.be.equal(mock.is_local);
expect(response.isPlayable).to.be.equal(mock.is_playable);
expect(response.name).to.be.equal(mock.name);
expect(response.popularity).to.be.equal(mock.popularity);
expect(response.previewUrl).to.be.equal(mock.preview_url);
expect(response.trackNumber).to.be.equal(mock.track_number);
expect(response.type).to.be.equal(mock.type);
expect(response.uri).to.be.equal(mock.uri);
};

export const checkMatchingPagingObjectAttributes = (
response: any,
mock: any
) => {
expect(response.href).to.be.equal(mock.href.split('?')[0]);
expect(response.items).to.have.lengthOf(mock.items.length);
expect(response.limit).to.be.equal(mock.limit);
expect(response.offset).to.be.equal(mock.offset);
expect(response.total).to.be.equal(mock.total);
};
File renamed without changes.
File renamed without changes.

0 comments on commit a392a10

Please sign in to comment.