80 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
			
		
		
	
	
			80 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
import waitForPromises from 'helpers/wait_for_promises';
 | 
						|
import { stubPerformanceWebAPI } from 'helpers/performance';
 | 
						|
import { createRouter } from '~/ide/ide_router';
 | 
						|
import { createStore } from '~/ide/stores';
 | 
						|
 | 
						|
describe('IDE router', () => {
 | 
						|
  const PROJECT_NAMESPACE = 'my-group/sub-group';
 | 
						|
  const PROJECT_NAME = 'my-project';
 | 
						|
  const TEST_PATH = `/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/merge_requests/2`;
 | 
						|
  const DEFAULT_BRANCH = 'default-main';
 | 
						|
 | 
						|
  let store;
 | 
						|
  let router;
 | 
						|
 | 
						|
  beforeEach(() => {
 | 
						|
    stubPerformanceWebAPI();
 | 
						|
 | 
						|
    window.history.replaceState({}, '', '/');
 | 
						|
    store = createStore();
 | 
						|
    router = createRouter(store, DEFAULT_BRANCH);
 | 
						|
    jest.spyOn(store, 'dispatch').mockReturnValue(new Promise(() => {}));
 | 
						|
  });
 | 
						|
 | 
						|
  it.each`
 | 
						|
    route                                                                                     | expectedBranchId           | expectedBasePath
 | 
						|
    ${`/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/tree/main/-/src/blob/`}                  | ${'main'}                  | ${'src/blob/'}
 | 
						|
    ${`/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/tree/main/-/src/blob`}                   | ${'main'}                  | ${'src/blob'}
 | 
						|
    ${`/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/tree/blob/-/src/blob`}                   | ${'blob'}                  | ${'src/blob'}
 | 
						|
    ${`/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/tree/main/-/src/tree/`}                  | ${'main'}                  | ${'src/tree/'}
 | 
						|
    ${`/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/tree/weird:branch/name-123/-/src/tree/`} | ${'weird:branch/name-123'} | ${'src/tree/'}
 | 
						|
    ${`/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/blob/main/-/src/blob`}                   | ${'main'}                  | ${'src/blob'}
 | 
						|
    ${`/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/blob/main/-/src/edit`}                   | ${'main'}                  | ${'src/edit'}
 | 
						|
    ${`/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/blob/main/-/src/merge_requests/2`}       | ${'main'}                  | ${'src/merge_requests/2'}
 | 
						|
    ${`/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/blob/blob/-/src/blob`}                   | ${'blob'}                  | ${'src/blob'}
 | 
						|
    ${`/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/edit/blob/-/src/blob`}                   | ${'blob'}                  | ${'src/blob'}
 | 
						|
    ${`/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/tree/blob`}                              | ${'blob'}                  | ${''}
 | 
						|
    ${`/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/edit`}                                   | ${DEFAULT_BRANCH}          | ${''}
 | 
						|
    ${`/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}`}                                        | ${DEFAULT_BRANCH}          | ${''}
 | 
						|
  `('correctly opens Web IDE for $route', ({ route, expectedBranchId, expectedBasePath } = {}) => {
 | 
						|
    router.push(route);
 | 
						|
 | 
						|
    expect(store.dispatch).toHaveBeenCalledWith('openBranch', {
 | 
						|
      projectId: `${PROJECT_NAMESPACE}/${PROJECT_NAME}`,
 | 
						|
      branchId: expectedBranchId,
 | 
						|
      basePath: expectedBasePath,
 | 
						|
    });
 | 
						|
  });
 | 
						|
 | 
						|
  it('correctly opens an MR', () => {
 | 
						|
    const expectedId = '2';
 | 
						|
 | 
						|
    router.push(`/project/${PROJECT_NAMESPACE}/${PROJECT_NAME}/merge_requests/${expectedId}`);
 | 
						|
 | 
						|
    expect(store.dispatch).toHaveBeenCalledWith('openMergeRequest', {
 | 
						|
      projectId: `${PROJECT_NAMESPACE}/${PROJECT_NAME}`,
 | 
						|
      mergeRequestId: expectedId,
 | 
						|
      targetProjectId: undefined,
 | 
						|
    });
 | 
						|
    expect(store.dispatch).not.toHaveBeenCalledWith('openBranch');
 | 
						|
  });
 | 
						|
 | 
						|
  it('keeps router in sync when store changes', async () => {
 | 
						|
    expect(router.currentRoute.fullPath).toBe('/');
 | 
						|
 | 
						|
    store.state.router.fullPath = TEST_PATH;
 | 
						|
 | 
						|
    await waitForPromises();
 | 
						|
 | 
						|
    expect(router.currentRoute.fullPath).toBe(TEST_PATH);
 | 
						|
  });
 | 
						|
 | 
						|
  it('keeps store in sync when router changes', () => {
 | 
						|
    expect(store.dispatch).not.toHaveBeenCalled();
 | 
						|
 | 
						|
    router.push(TEST_PATH);
 | 
						|
 | 
						|
    expect(store.dispatch).toHaveBeenCalledWith('router/push', TEST_PATH, { root: true });
 | 
						|
  });
 | 
						|
});
 |