@sickrin/openalex-sdk
Version:
A TypeScript SDK for interacting with the OpenAlex API - forked and enhanced version
285 lines (279 loc) • 9.18 kB
text/typescript
import axios from 'axios';
import fs from 'fs';
import { Source } from 'src/types/source';
import OpenAlex from '../src/index';
describe('get single source', () => {
test('get author ', async () => {
const openAlex = new OpenAlex();
const res = await openAlex.source('S137773608');
const openAlexRes = await axios.get(
'https://api.openalex.org/sources/S137773608',
);
expect(res).toEqual(openAlexRes.data);
});
test('get author using External IDs', async () => {
const openAlex = new OpenAlex();
const res = await openAlex.source('2041-1723', 'issn');
const openAlexRes = await axios.get(
'https://api.openalex.org/sources/issn:2041-1723',
);
expect(res).toEqual(openAlexRes.data);
});
});
// get multiple sources
describe('get multiple sources', () => {
// test getting first page
test('get simple ', async () => {
const openAlex = new OpenAlex();
const res = await openAlex.sources({
perPage: 50,
});
const openAlexRes = await axios.get(
'https://api.openalex.org/sources?per-page=50',
);
expect(res.results.map((r) => r.id)).toEqual(
openAlexRes.data.results.map((r: Source) => r.id),
);
}, 10000);
test('get simple page 2', async () => {
const openAlex = new OpenAlex();
const res = await openAlex.sources({
perPage: 50,
page: 2,
});
const openAlexRes = await axios.get(
'https://api.openalex.org/sources?per-page=50&page=2',
);
expect(res.results.map((r) => r.id)).toEqual(
openAlexRes.data.results.map((r: Source) => r.id),
);
}, 10000);
// get sources with search query
test('get with search query', async () => {
const openAlex = new OpenAlex();
const res = await openAlex.sources({
search: 'nature',
});
const openAlexRes = await axios.get(
'https://api.openalex.org/sources?search=nature',
);
expect(res.results.map((r) => r.id)).toEqual(
openAlexRes.data.results.map((r: Source) => r.id),
);
}, 10000);
// get sources with search query for 'nature' and page 2
test('get with search query and page 2', async () => {
const openAlex = new OpenAlex();
const res = await openAlex.sources({
search: 'nature',
page: 2,
});
const openAlexRes = await axios.get(
'https://api.openalex.org/sources?search=nature&page=2',
);
expect(res.results.map((r) => r.id)).toEqual(
openAlexRes.data.results.map((r: Source) => r.id),
);
});
// get sources with search query with search field
test('get with search query and search field', async () => {
const openAlex = new OpenAlex();
const res = await openAlex.sources({
search: 'nature',
searchField: 'display_name',
});
const openAlexRes = await axios.get(
'https://api.openalex.org/sources?filter=display_name.search:nature',
);
expect(res.results.map((r) => r.id)).toEqual(
openAlexRes.data.results.map((r: Source) => r.id),
);
});
// get sources with simple filter
test('get with filter', async () => {
const openAlex = new OpenAlex();
const res = await openAlex.sources({
filter: {
works_count: ['>100'],
},
});
const openAlexRes = await axios.get(
'https://api.openalex.org/sources?filter=works_count:%3E100',
);
expect(res.results.map((r) => r.id)).toEqual(
openAlexRes.data.results.map((r: Source) => r.id),
);
});
// get sources with multiple filters
test('get with multiple filters', async () => {
const openAlex = new OpenAlex();
const res = await openAlex.sources({
filter: {
works_count: ['>100', '<1000'],
},
});
const openAlexRes = await axios.get(
'https://api.openalex.org/sources?filter=works_count:%3E100|<1000',
);
expect(res.results.map((r) => r.id)).toEqual(
openAlexRes.data.results.map((r: Source) => r.id),
);
});
// get sources with multiple filters and search query
test('get with multiple filters and search query', async () => {
const openAlex = new OpenAlex();
const res = await openAlex.sources({
filter: {
works_count: ['>100', '<1000'],
},
search: 'nature',
});
const openAlexRes = await axios.get(
'https://api.openalex.org/sources?filter=works_count:%3E100|<1000&search=nature',
);
expect(res.results.map((r) => r.id)).toEqual(
openAlexRes.data.results.map((r: Source) => r.id),
);
});
// get sources with different filters and search query and search field
test('get with multiple filters and search query and search field', async () => {
const openAlex = new OpenAlex();
const res = await openAlex.sources({
filter: {
is_oa: true,
type: 'journal',
},
search: 'nature',
});
const openAlexRes = await axios.get(
'https://api.openalex.org/sources?filter=is_oa:true,type:journal&search=nature&cursor=*',
);
expect(res.results.map((r) => r.id)).toEqual(
openAlexRes.data.results.map((r: Source) => r.id),
);
});
// get sources with simple group by
test('get with group by', async () => {
const openAlex = new OpenAlex();
const res = await openAlex.sources({
groupBy: 'type',
});
const openAlexRes = await axios.get(
'https://api.openalex.org/sources?group_by=type',
);
expect(res.results).toEqual(openAlexRes.data.results);
});
// get sources with group by and filter
test('get with group by and filter', async () => {
const openAlex = new OpenAlex();
const res = await openAlex.sources({
groupBy: 'type',
filter: {
works_count: ['>100'],
},
});
const openAlexRes = await axios.get(
'https://api.openalex.org/sources?group_by=type&filter=works_count:%3E100&cursor=*',
);
expect(res.results).toEqual(openAlexRes.data.results);
});
// get sources with sort by
test('get with sort by', async () => {
const openAlex = new OpenAlex();
const res = await openAlex.sources({
sortBy: {
field: 'display_name',
order: 'asc',
},
});
const openAlexRes = await axios.get(
'https://api.openalex.org/sources?sort=display_name:asc&cursor=*',
);
expect(res.results).toEqual(openAlexRes.data.results);
});
// get sources with sort by and filter
test('get with sort by and filter', async () => {
const openAlex = new OpenAlex();
const res = await openAlex.sources({
sortBy: {
field: 'display_name',
order: 'asc',
},
filter: {
works_count: ['>100'],
},
});
const openAlexRes = await axios.get(
'https://api.openalex.org/sources?sort=display_name:asc&filter=works_count:%3E100&cursor=*',
);
expect(res.results.map((r) => r.id)).toEqual(
openAlexRes.data.results.map((r: Source) => r.id),
);
});
// get sources from page 1 to 3 and per page 50
test('get with start and end page', async () => {
const openAlex = new OpenAlex();
const res = await openAlex.sources({
startPage: 1,
endPage: 3,
perPage: 50,
});
const openAlexRes = await axios.get(
'https://api.openalex.org/sources?per-page=50&page=1',
);
const openAlexRes2 = await axios.get(
'https://api.openalex.org/sources?per-page=50&page=2',
);
const openAlexRes3 = await axios.get(
'https://api.openalex.org/sources?per-page=50&page=3',
);
// compare only ids in the results
expect(res.results.map((r: Source) => r.id)).toEqual([
...openAlexRes.data.results.map((r: Source) => r.id),
...openAlexRes2.data.results.map((r: Source) => r.id),
...openAlexRes3.data.results.map((r: Source) => r.id),
]);
}, 10000);
// get all sources with simple search query
test('get all sources with simple search query', async () => {
const openAlex = new OpenAlex();
const res = await openAlex.sources({
search: 'nature',
retriveAllPages: true,
});
const openAlexRes = await axios.get(
'https://api.openalex.org/sources?search=nature&per-page=200&page=1',
);
const openAlexRes2 = await axios.get(
'https://api.openalex.org/sources?search=nature&per-page=200&page=2',
);
expect(res.results.map((r: Source) => r.id)).toEqual([
...openAlexRes.data.results.map((r: Source) => r.id),
...openAlexRes2.data.results.map((r: Source) => r.id),
]);
}, 10000);
});
describe('save sources to csv', () => {
test('save sources to csv', async () => {
const openAlex = new OpenAlex();
await openAlex.sources({
perPage: 50,
toCsv: 'sources',
});
// check if file exists
expect(fs.existsSync('sources.csv')).toBe(true);
// delete the file
fs.unlinkSync('sources.csv');
}, 10000);
test('save sources to json', async () => {
const openAlex = new OpenAlex();
await openAlex.sources({
perPage: 50,
toJson: 'sources',
});
// check if file exists
expect(fs.existsSync('sources.json')).toBe(true);
// delete the file
fs.unlinkSync('sources.json');
}, 10000);
});