150 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			150 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								const expect = require('expect');
							 | 
						||
| 
								 | 
							
								const { Probot } = require('probot');
							 | 
						||
| 
								 | 
							
								const prOpened = require('./payloads/events/pullRequests.opened');
							 | 
						||
| 
								 | 
							
								const prExisting = require('./payloads/events/pullRequests.existing');
							 | 
						||
| 
								 | 
							
								const prUnrelated = require('./payloads/events/pullRequests.unrelated');
							 | 
						||
| 
								 | 
							
								const prClosed = require('./payloads/events/pullRequests.closed');
							 | 
						||
| 
								 | 
							
								const prOpenedFiles = require('./payloads/files/files.opened');
							 | 
						||
| 
								 | 
							
								const prExistingFiles = require('./payloads/files/files.existing');
							 | 
						||
| 
								 | 
							
								const prUnrelatedFiles = require('./payloads/files/files.unrelated');
							 | 
						||
| 
								 | 
							
								const probotPlugin = require('..');
							 | 
						||
| 
								 | 
							
								const { PRtest } = require('./utils/testmodels');
							 | 
						||
| 
								 | 
							
								// const mongoose = require('mongoose');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								describe('Presolver', () => {
							 | 
						||
| 
								 | 
							
								  let probot, github;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  afterEach(async (done) => {
							 | 
						||
| 
								 | 
							
								    await PRtest.deleteMany({}).catch(err => console.log(err));
							 | 
						||
| 
								 | 
							
								    done();
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  beforeEach( async() => {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    probot = new Probot({});
							 | 
						||
| 
								 | 
							
								    // Load our app into probot
							 | 
						||
| 
								 | 
							
								    let app = await probot.load(probotPlugin);
							 | 
						||
| 
								 | 
							
								    await PRtest.deleteMany({}).catch(err => console.log(err));
							 | 
						||
| 
								 | 
							
								    // This is an easy way to mock out the GitHub API
							 | 
						||
| 
								 | 
							
								    // https://probot.github.io/docs/testing/
							 | 
						||
| 
								 | 
							
								    github = {
							 | 
						||
| 
								 | 
							
								      issues: {
							 | 
						||
| 
								 | 
							
								        /* eslint-disable no-undef */
							 | 
						||
| 
								 | 
							
								        createComment: jest.fn().mockReturnValue(Promise.resolve({})),
							 | 
						||
| 
								 | 
							
								        addLabels: jest.fn(),
							 | 
						||
| 
								 | 
							
								        getLabel: jest.fn().mockImplementation(() => Promise.resolve([])),
							 | 
						||
| 
								 | 
							
								        createLabel: jest.fn()
							 | 
						||
| 
								 | 
							
								        /* eslint-enable no-undef */
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								      repos: {
							 | 
						||
| 
								 | 
							
								        getContent: () =>
							 | 
						||
| 
								 | 
							
								          Promise.resolve({
							 | 
						||
| 
								 | 
							
								            data: Buffer.from(
							 | 
						||
| 
								 | 
							
								              `
							 | 
						||
| 
								 | 
							
								          issueOpened: Message
							 | 
						||
| 
								 | 
							
								          pullRequestOpened: Message
							 | 
						||
| 
								 | 
							
								          `
							 | 
						||
| 
								 | 
							
								            ).toString('base64')
							 | 
						||
| 
								 | 
							
								          })
							 | 
						||
| 
								 | 
							
								      },
							 | 
						||
| 
								 | 
							
								      pullRequests: {
							 | 
						||
| 
								 | 
							
								        // eslint-disable-next-line no-undef
							 | 
						||
| 
								 | 
							
								        listFiles: jest.fn().mockImplementation((issue) => {
							 | 
						||
| 
								 | 
							
								          const { number } = issue;
							 | 
						||
| 
								 | 
							
								          let data;
							 | 
						||
| 
								 | 
							
								          switch (number) {
							 | 
						||
| 
								 | 
							
								            case 31525:
							 | 
						||
| 
								 | 
							
								              data = prOpenedFiles;
							 | 
						||
| 
								 | 
							
								              break;
							 | 
						||
| 
								 | 
							
								            case 33363:
							 | 
						||
| 
								 | 
							
								              data = prExistingFiles;
							 | 
						||
| 
								 | 
							
								              break;
							 | 
						||
| 
								 | 
							
								            case 34559:
							 | 
						||
| 
								 | 
							
								              data = prUnrelatedFiles;
							 | 
						||
| 
								 | 
							
								              break;
							 | 
						||
| 
								 | 
							
								            default:
							 | 
						||
| 
								 | 
							
								              data = prExistingFiles;
							 | 
						||
| 
								 | 
							
								          }
							 | 
						||
| 
								 | 
							
								          return { data };
							 | 
						||
| 
								 | 
							
								        }),
							 | 
						||
| 
								 | 
							
								        // eslint-disable-next-line no-undef
							 | 
						||
| 
								 | 
							
								        list: jest
							 | 
						||
| 
								 | 
							
								          .fn()
							 | 
						||
| 
								 | 
							
								          .mockImplementation(() => ({ data: [
							 | 
						||
| 
								 | 
							
								            prExisting.pull_request
							 | 
						||
| 
								 | 
							
								          ] }))
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								    app.auth = () => Promise.resolve(github);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  test(`adds a label if a PR has changes to files targeted by an
							 | 
						||
| 
								 | 
							
								    existing PR`, async () => {
							 | 
						||
| 
								 | 
							
								    // Receive a webhook event
							 | 
						||
| 
								 | 
							
								    await probot.receive({
							 | 
						||
| 
								 | 
							
								      name: 'pull_request.opened',
							 | 
						||
| 
								 | 
							
								      payload: prOpened
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    expect(github.issues.addLabels).toHaveBeenCalled();
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  test('does not add a label when files do not coincide', async () => {
							 | 
						||
| 
								 | 
							
								    await probot.receive({
							 | 
						||
| 
								 | 
							
								      name: 'pull_request.opened',
							 | 
						||
| 
								 | 
							
								      payload: prUnrelated
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    expect(github.issues.addLabels).toHaveBeenCalledTimes(0);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  test('db should update if the action is opened', async () => {
							 | 
						||
| 
								 | 
							
								    await probot.receive({
							 | 
						||
| 
								 | 
							
								      name: 'pull_request.opened',
							 | 
						||
| 
								 | 
							
								      payload: prOpened
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    const results = await PRtest.find({}).then(data => data);
							 | 
						||
| 
								 | 
							
								    expect(results.length).toBeGreaterThan(0);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  test('db should update if the action is reopened', async () => {
							 | 
						||
| 
								 | 
							
								    await probot.receive({
							 | 
						||
| 
								 | 
							
								      name: 'pull_request.reopened',
							 | 
						||
| 
								 | 
							
								      payload: prOpened
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    const results = await PRtest.find({}).then(data => data);
							 | 
						||
| 
								 | 
							
								    expect(results.length).toBeGreaterThan(0);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  test('db should update if the action is synchronize', async () => {
							 | 
						||
| 
								 | 
							
								    await probot.receive({
							 | 
						||
| 
								 | 
							
								      name: 'pull_request.synchronize',
							 | 
						||
| 
								 | 
							
								      payload: prOpened
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    const results = await PRtest.find({}).then(data => data);
							 | 
						||
| 
								 | 
							
								    expect(results.length).toBeGreaterThan(0);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  test('db should update if the action is edited', async () => {
							 | 
						||
| 
								 | 
							
								    await probot.receive({
							 | 
						||
| 
								 | 
							
								      name: 'pull_request.edited',
							 | 
						||
| 
								 | 
							
								      payload: prOpened
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    const results = await PRtest.find({}).then(data => data);
							 | 
						||
| 
								 | 
							
								    expect(results.length).toBeGreaterThan(0);
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  test('db should have removed document if action is closed', async () => {
							 | 
						||
| 
								 | 
							
								    await probot.receive({
							 | 
						||
| 
								 | 
							
								      name: 'pull_request.closed',
							 | 
						||
| 
								 | 
							
								      payload: prClosed
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								    const result = await PRtest.findOne(
							 | 
						||
| 
								 | 
							
								      { _id: prClosed.number }).then(doc => doc)
							 | 
						||
| 
								 | 
							
								      .catch(err => console.log(err));
							 | 
						||
| 
								 | 
							
								    expect(result).toBe(null);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								});
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								// For more information about testing with Jest see:
							 | 
						||
| 
								 | 
							
								// https://facebook.github.io/jest/
							 |