const ApiKeyModel = require('dashboard/data/api-key-model'); const modelApiURL = 'wadus.com/api/v3/api_keys'; const apiData = { name: 'Awesome map key', type: 'regular', token: 'NmYvZM80laiQQMv5rUGbJA', grants: [ { type: 'apis', apis: [ 'maps', 'sql' ] }, { type: 'database', tables: [{ 'schema': 'public', 'name': 'untitled_table_14', 'permissions': ['insert', 'update', 'read'] }], schemas: [] } ] }; const parsedData = { name: 'Awesome map key', type: 'regular', token: 'NmYvZM80laiQQMv5rUGbJA', id: 'Awesome map key', apis: { maps: true, sql: true }, tables: { untitled_table_14: { schema: 'public', name: 'untitled_table_14', permissions: { insert: true, update: true, read: true } } }, datasets: { create: false, listing: false } }; describe('dashboard/data/api-key-model', function () { var model; beforeEach(function () { model = new ApiKeyModel({}, { userModel: { getSchema: () => 'public' } }); spyOn(model, 'url').and.returnValue(modelApiURL); }); it('should have these attributes by default', function () { expect(model.attributes).toEqual({ name: '', token: '', apis: { maps: false, sql: false }, datasets: { create: false, listing: false }, tables: [] }); }); it('throws an error when userModel is missing', function () { model = function () { return new ApiKeyModel(null, {}); }; expect(model).toThrowError('userModel is required'); }); describe('.regenerate', function () { it('should sync collection', function () { spyOn(model, 'sync'); model.regenerate(); var spyCallArguments = model.sync.calls.mostRecent().args; expect(model.sync).toHaveBeenCalled(); expect(spyCallArguments[0]).toBeNull(); expect(spyCallArguments[1]).toBe(model); expect(spyCallArguments[2].url).toBe('wadus.com/api/v3/api_keys/token/regenerate'); expect(spyCallArguments[2].type).toBe('POST'); }); it('should set data on sync success', function () { spyOn(model, 'sync').and.callFake(function (method, model, options) { options.success && options.success({ name: 'wadus' }); }); model.regenerate(); expect(model.get('name')).toBe('wadus'); }); }); describe('.parse', function () { it('should parse data properly', function () { const options = { userModel: { getSchema: () => 'public' } }; const parsed = model.parse(apiData, options); expect(parsed).toEqual(parsedData); }); }); describe('.toJSON', function () { it('should return data properly', function () { model.set(parsedData); const data = model.toJSON(); const expectedJSONData = Object.assign({}, apiData, { id: parsedData.id }); expect(data).toEqual(expectedJSONData); }); it('should return data properly with create and listing set to true', function () { const parsedDataCreateListing = Object.assign(parsedData, { datasets: { create: true, listing: true } }); model.set(parsedDataCreateListing); const data = model.toJSON(); const apiDataCreateListing = Object.assign({}, apiData, { grants: [ { type: 'apis', apis: [ 'maps', 'sql' ] }, { type: 'database', tables: [{ 'schema': 'public', 'name': 'untitled_table_14', 'permissions': ['insert', 'update', 'read'] }], schemas: [{ name: 'public', permissions: ['create'] }], table_metadata: [] } ] }); const expectedJSONData = Object.assign({}, apiDataCreateListing, { id: parsedData.id }); expect(data).toEqual(expectedJSONData); }); }); describe('.isPublic', function () { it('should return true if type is default', function () { model.set('type', 'regular'); expect(model.isPublic()).toBe(false); model.set('type', 'default'); expect(model.isPublic()).toBe(true); }); }); describe('.getApiGrants', function () { it('should return granted API permissions', function () { model.set('apis', { maps: true, sql: false }); expect(model.getApiGrants()).toEqual(['maps']); }); }); describe('.getTablesGrants', function () { it('should return tables with granted permissions', function () { const tables = { untitled_table_14: { schema: 'public', name: 'untitled_table_14', permissions: { insert: true, update: true, read: false } } }; model.set('tables', tables); expect(model.getTablesGrants()).toEqual([{ name: 'untitled_table_14', schema: 'public', permissions: ['insert', 'update'] }]); }); }); describe('._parseApiGrants', function () { it('should return parsed API grants properly', function () { const apiGrants = model._parseApiGrants([{ type: 'apis', apis: [ 'maps' ] }]); expect(apiGrants).toEqual({ maps: true, sql: false }); }); }); describe('._parseTableGrants', function () { it('should return parsed table grants properly', function () { const tableGrants = [{ type: 'database', tables: [{ 'schema': 'public', 'name': 'untitled_table_14', 'permissions': ['insert', 'read'] }] }]; const parsedTableGrants = model._parseTableGrants(tableGrants); expect(parsedTableGrants).toEqual({ untitled_table_14: { schema: 'public', name: 'untitled_table_14', permissions: { insert: true, read: true } } }); }); }); describe('._parseDatabaseGrants', function () { it('should be true after parsing database grants', function () { const tableGrants = [{ type: 'database', schema: 'public', name: 'untitled_table_14', permissions: { insert: true, read: true }, table_metadata: [] }]; const parsedDatabaseGrants = model._parseDatabaseGrants(tableGrants); expect(parsedDatabaseGrants).toBe(true); }); it('should be false after parsing database grants', function () { const tableGrants = [{ type: 'database', schema: 'public', name: 'untitled_table_14', permissions: { insert: true, read: true } }]; const parsedDatabaseGrants = model._parseDatabaseGrants(tableGrants); expect(parsedDatabaseGrants).toBe(false); }); }); describe('._parseDatabaseSchemas', function () { it('should be true after parsing database schemas', function () { const tableGrants = [{ type: 'database', schemas: [{ name: 'public', permissions: ['create'] }] }]; const schemaName = 'public'; const parsedDatabaseSchemas = model._parseDatabaseSchemas(tableGrants, schemaName); expect(parsedDatabaseSchemas).toBe(true); }); it('should be false after parsing database schemas', function () { const tableGrants = [{ type: 'database', schemas: [] }]; const parsedDatabaseSchemas = model._parseDatabaseSchemas(tableGrants); expect(parsedDatabaseSchemas).toBe(false); }); }); describe('._arrayToObj', function () { it('should transform an array to an object', function () { expect(model._arrayToObj(['sql', 'maps'])).toEqual({sql: true, maps: true}); }); }); describe('._hasPermissionsSelected', function () { it('should return true if any table has permissions', function () { spyOn(model, 'getTablesGrants').and.returnValues( [{ schema: 'public', name: 'table_with_permissions', permissions: ['insert', 'update', 'read'] }], [{ schema: 'public', name: 'table_without_permissions', permissions: [] }] ); expect(model.hasPermissionsSelected()).toBe(true); expect(model.hasPermissionsSelected()).toBe(false); }); }); });