import fs from 'fs'; import yaml from 'js-yaml'; import nock from 'nock'; import { Octokit } from 'octokit'; import tmp from 'tmp'; import { OrganizationHelper } from '../organization'; import { getJSONFixture } from './testUtilities'; const testOrg = 'twilio-labs'; describe('OrganizationHelper', () => { describe('constructor', () => { test("Creates its own Octokit instance if one isn't provided", () => { const helper = new OrganizationHelper(testOrg); expect(helper.getOctokit()).toBeInstanceOf(Octokit); }); test('Uses the provided Octokit instance if one is provided', () => { const octokit = new Octokit({ auth: process.env.GITHUB_TOKEN }); const helper = new OrganizationHelper(testOrg, octokit); expect(helper.getOctokit()).toBe(octokit); }); }); describe('getTeamMembers', () => { const teamName = 'internal-product-docs'; const fakeResponse = getJSONFixture('team_members.json'); describe('with mocked github api', () => { beforeEach(() => { nock('https://api.github.com:443', { encodedQueryParams: true }) .get(`/orgs/${testOrg}/teams/${teamName}/members`) .reply(200, JSON.stringify(fakeResponse.payload), fakeResponse.headers); }); test('returns the team members', async () => { const helper = new OrganizationHelper(testOrg); const members = await helper.getTeamMembers(teamName); expect(members).toHaveLength(2); expect(members[0].login).toBe('user1'); expect(members[1].login).toBe('user2'); }); test('returns the team members without exclusions', async () => { const helper = new OrganizationHelper(testOrg); const members = await helper.getTeamMembers(teamName, ['user1']); expect(members).toHaveLength(1); expect(members[0].login).toBe('user2'); }); test('returns team members and writes to cache file', async () => { const cacheFile = tmp.fileSync(); const helper = new OrganizationHelper(testOrg); const members = await helper.getTeamMembers(teamName, [], cacheFile.name, true); expect(members).toHaveLength(2); expect(members[0].login).toBe('user1'); expect(members[1].login).toBe('user2'); const cacheContents = fs.readFileSync(cacheFile.name, { encoding: 'utf8' }); expect(cacheContents).toEqual(yaml.dump({ members: fakeResponse.payload })); }); afterEach(() => { expect(nock.isDone()).toBeTruthy(); }); afterAll(() => { nock.restore(); }); }); describe('with mocked github api that returns an error', () => { beforeEach(() => { nock('https://api.github.com:443', { encodedQueryParams: true }) .get(`/orgs/${testOrg}/teams/${teamName}/members`) .reply(404); }); test('returns team members from cache file', async () => { const cacheFile = tmp.fileSync(); fs.writeFileSync(cacheFile.name, yaml.dump({ members: fakeResponse.payload })); const helper = new OrganizationHelper(testOrg); const members = await helper.getTeamMembers(teamName, [], cacheFile.name); expect(members).toHaveLength(2); expect(members[0].login).toBe('user1'); expect(members[1].login).toBe('user2'); expect(nock.isDone()).toBeFalsy(); // no request should have been made }); afterAll(() => { nock.restore(); }); }); }); });