UNPKG

google-admin-sdk

Version:

node.js library that wraps the Directory and Groups APIs in the Google Admin SDK

836 lines (768 loc) 31.7 kB
assert = require 'assert' async = require 'async' _ = require 'underscore' google_apis = require "#{__dirname}/../lib/" nock = require 'nock' util = require 'util' # There are 3 large test suites in this file: # describe 'UserProvisioning' # describe 'OrgUnitProvisioning' # describe 'GroupProvisioning' before -> nock.disableNetConnect() beforeEach -> nock.cleanAll() describe 'Retry', -> before -> @retry_count = 5 @up = new google_apis.UserProvisioning token: access: 'fake access token' @up.retry_options = {minTimeout: 100, maxTimeout: 200, retries: @retry_count, randomize: true} # The following 2 test verifies that @up.get is indeed retrying for @retry_count times. # Including the initial request, there are retry_count + 1 total requests. it "retries for `retry_count` times but nocked for `(retry_count + 1)` times", (done) -> # Nock out all requests with failure nock('https://www.googleapis.com:443').get('/admin/directory/v1/users/1234567890') .times(@retry_count + 1).reply(500, 'FAIL') @up.get '1234567890', (err, data) -> assert.equal err, 'FAIL' done() it 'retries for retry_count times and nocked for retry_count times', (done) -> # Nock out all but last request with failure, so that on the (retry_count + 1)th request, # it attempts to make a real http request. nock('https://www.googleapis.com:443').get('/admin/directory/v1/users/1234567890') .times(@retry_count).reply(500, 'FAIL') @up.get '1234567890', (err, data) -> assert.equal err.name, 'NetConnectNotAllowedError' assert.equal err.message, 'Nock: Not allow net connect for "www.googleapis.com:443"' done() describe 'oauth2_request', -> it 'does not deadlock with request_refresh_token if no refresh token', (done) -> gsdk = new google_apis.GoogleAPIAdminSDK token: refresh: 'sometoken' access: 'someaccess' client: id: 'someid' secret: 'somesecret' refresh_nock = nock('https://accounts.google.com:443') .filteringRequestBody(() -> return '*') .post('/o/oauth2/token', '*') .reply(400, 'no refresh from google') request_nock = nock('https://www.googleapis.com:443').get('/admin/directory/v1/users/1234') .reply(401, 'go request token refresh') opts = json: true uri: "https://www.googleapis.com/admin/directory/v1/users/1234" gsdk.oauth2_request opts, (err, dontcare) -> refresh_nock.done() request_nock.done() assert.equal err, 'no refresh from google' done() it 'does not deadlock with request_refresh_token if genuinely invalid credentials', (done) -> gsdk = new google_apis.GoogleAPIAdminSDK token: refresh: 'sometoken' access: 'someaccess' client: id: 'someid' secret: 'somesecret' refresh_nock = nock('https://accounts.google.com:443') .filteringRequestBody(() -> return '*') .post('/o/oauth2/token', '*') .reply(200, 'okay, here you go') request_nock = nock('https://www.googleapis.com:443') .get('/admin/directory/v1/users/1234').reply(401, 'go request token refresh') .get('/admin/directory/v1/users/1234').reply(401, 'nope, genuinely invalid credentials') opts = json: true uri: "https://www.googleapis.com/admin/directory/v1/users/1234" gsdk.oauth2_request opts, (err, resp, body) -> refresh_nock.done() request_nock.done() assert.equal resp.statusCode, 401 assert.equal body, 'nope, genuinely invalid credentials' done() describe 'UserProvisioning', ()-> before -> @up = new google_apis.UserProvisioning token: access: 'fake access token' @up.retry_options = {minTimeout: 100, maxTimeout: 200, retries: 2, randomize: true} it 'requires domain, client_id, client_secret upon construction', (done) -> assert.throws () -> new google_apis.UserProvisioning() , Error done() it 'returns an error when an argument of wrong type is given', (done) -> async.waterfall [ (cb_wf) => @up.get 12345, (err, data) -> assert.equal err.toString(), 'Error: UserProvisioning::get requires (String userkey, [callback])' cb_wf() (cb_wf) => @up.insert 12345, (err, data) -> assert.equal err.toString(), "Error: UserProvisioning::insert expected (Object body, [callback])" cb_wf() (cb_wf) => @up.list 12345, (err, data) -> assert.equal err.toString(), "Error: UserProvisioning::list requires (Object params, [callback])" cb_wf() (cb_wf) => @up.patch 12345, (err, data) -> assert.equal err.toString(), "Error: UserProvisioning::patch expected (String userkey, [Object body, String fields, callback])" cb_wf() (cb_wf) => @up.delete 12345, (err, data) -> assert.equal err.toString(), "Error: UserProvisioning::delete expected (String userkey, [callback])" cb_wf() ], done ## GET ## it 'can get user by id', (done) -> body = kind: 'admin#directory#user' id: '1234567890' primaryEmail: 'george@domain.org' name: { givenName: 'George', familyName: 'Washington', fullName: 'George Washington' } isAdmin: false isDelegatedAdmin: false lastLoginTime: '1970-01-01T00:00:00.000Z' creationTime: '2013-02-20T21:29:18.000Z' agreedToTerms: true suspended: false changePasswordAtNextLogin: false ipWhitelisted: false emails: [{address: "george@domain.org", primary: true}] customerId: 'fake_customer_id' orgUnitPath: '/' isMailboxSetup: true includeInGlobalAddressList: true nock('https://www.googleapis.com:443').persist().get('/admin/directory/v1/users/1234567890') .reply(200, body) @up.get '1234567890', (err, data) -> assert.ifError err assert.deepEqual data, body done() it '404s when making get with bad userkey', (done) -> body = error: errors: [{ domain: "global", reason: "notFound", message: "Resource Not Found: userKey" }] code: 404 message: "Resource Not Found: userKey" nock('https://www.googleapis.com:443').persist().get('/admin/directory/v1/users/12345') .reply(404, body) @up.get '12345', (err, data) -> assert.deepEqual err, body done() ## LIST ## it 'gets partial response for field argument', (done) -> body = users: [ { name: { givenName: "George", familyName: "Washington", fullName: "George Washington" } } { name: { givenName: "Lhamo", familyName: "Dondrub", fullName: "Lhamo Dondrub" } } ] nextPageToken: "next_page" nock('https://www.googleapis.com:443').persist().get('/admin/directory/v1/users?domain=domain.org&maxResults=2&fields=users%2Fname%2C%20nextPageToken') .reply(200, body) @up.list {domain: 'domain.org', maxResults: 2, fields: 'users/name, nextPageToken'}, (err, data) -> assert.deepEqual data, body done() it 'gets users that match a query', (done) -> user = kind: 'admin#directory#user' id: '987654321' primaryEmail: 'betsyross@domain.org' name: { givenName: 'Betsy', familyName: 'Ross', fullName: 'Betsy Ross' } isAdmin: false isDelegatedAdmin: false lastLoginTime: '1970-01-01T00:00:00.000Z' creationTime: '2013-06-25T17:01:23.000Z' agreedToTerms: true suspended: false changePasswordAtNextLogin: false ipWhitelisted: false emails: [ { address: 'betsyross@domain.org', primary: true } ] customerId: 'fake_customer_id' orgUnitPath: '/' isMailboxSetup: true includeInGlobalAddressList: true body = kind: 'admin#directory#users' users: [user] nextPageToken: 'next_page' nock('https://www.googleapis.com:443').persist().get('/admin/directory/v1/users?domain=domain.org&maxResults=1&query=email%3Abetsy*') .reply(200, body) @up.list {domain: 'domain.org', maxResults: 1, query: 'email:betsy*'}, (err, data) -> assert.deepEqual data, body done() it 'gets paging info even when not explicitly requested', (done) -> body = users: [ { name: { givenName: "George", familyName: "Washington", fullName: "George Washington" } } { name: { givenName: "Lhamo", familyName: "Dondrub", fullName: "Lhamo Dondrub" } } ] nextPageToken: "next_page" nock('https://www.googleapis.com:443').persist().get('/admin/directory/v1/users?domain=domain.org&maxResults=2&fields=nextPageToken%2Cusers%2Fname') .reply(200, body) @up.list {domain: 'domain.org', maxResults: 2, fields: 'users/name'}, (err, data) -> assert.deepEqual data, body done() ## INSERT ## it 'creates a user', (done) -> post_body = name: {familyName: "Gandhi", givenName: "Mahatma"} password: "supersecurepassword12345" primaryEmail: "mgandhi@domain.org" resp_body = kind: "admin#directory#user" id: "1234567890" primaryEmail: "mgandhi@domain.org" name: { givenName: "Mahatma", familyName: "Gandhi" } isAdmin: false isDelegatedAdmin: false customerId: "fake_customer_id" orgUnitPath: "/" isMailboxSetup: false nock('https://www.googleapis.com:443').persist().post('/admin/directory/v1/users', post_body) .reply(200, resp_body) @up.insert post_body, (err, data) -> assert.deepEqual data, resp_body done() ## INSERT, and FAIL ## it 'sends a "Domain User Limit" when their domain has its max number of users', (done) -> # Lets pretend the domain is already at its user limit when we try to create this user post_body = name: {familyName: "Gandhi", givenName: "Mahatma"} password: "supersecurepassword12345" primaryEmail: "mgandhi@domain.org" error = error: errors: [ { domain: 'global', reason: 'DomainUserLimitExceeded', message: 'Domain user limit exceeded.' } ] code: 412 message: 'Domain user limit exceeded.' nock('https://www.googleapis.com:443').persist().post('/admin/directory/v1/users', post_body) .reply(412, error) @up.insert post_body, (err, data) -> assert.deepEqual error, err done() it 'creates a user and returns a partial response', (done) -> post_body = name: {familyName: "Gandhi", givenName: "Mahatma"} password: "supersecurepassword12345" primaryEmail: "mgandhi@domain.org" resp_body = id: "1234567890" primaryEmail: "mgandhi@domain.org" name: { givenName: "Mahatma", familyName: "Gandhi" } nock('https://www.googleapis.com:443').persist().post('/admin/directory/v1/users', post_body) .reply(200, resp_body) @up.insert post_body, 'name,primaryEmail,id', (err, data) -> assert.deepEqual data, resp_body done() it 'returns an error when trying to create a user without a required field', (done) -> post_body = name: {familyName: "Gandhi", givenName: "Mahatma"} password: "supersecurepassword12345" @up.insert post_body, (err, data) -> assert.equal(err.toString(), "Error: UserProvisioning::insert requires 'primaryEmail'") done() ## PATCH ## it 'updates a user', (done) -> req_body = {name: {familyName: 'Thatcher', givenName: 'Margaret'}} resp_body = kind: "admin#directory#user" id: "1234567890" primaryEmail: "mthatcher@domain.org" name: { givenName: "Margaret", familyName: "Thatcher" } isAdmin: false isDelegatedAdmin: false lastLoginTime: "1970-01-01T00:00:00.000Z" creationTime: "2013-06-25T19:41:26.000Z" agreedToTerms: true suspended: false changePasswordAtNextLogin: false ipWhitelisted: false emails: [{ address: "mthatcher@domain.org", primary: true }] customerId: "fake_customer_id" orgUnitPath: "/" isMailboxSetup: true includeInGlobalAddressList: true nock('https://www.googleapis.com:443').persist().patch('/admin/directory/v1/users/1234567890', req_body) .reply(200, resp_body) @up.patch '1234567890', req_body, (err, data) -> assert.deepEqual resp_body, data done() it '404s when updating with a bad userkey', (done) -> req_body = {} body = error: errors: [{ domain: "global", reason: "notFound", message: "Resource Not Found: userKey" }] code: 404 message: "Resource Not Found: userKey" nock('https://www.googleapis.com:443').persist().patch('/admin/directory/v1/users/12345', req_body) .reply(404, body) @up.patch '12345', req_body, (err, data) -> assert.deepEqual err, body done() it 'can correctly call patch with userkey, body, cb', (done) -> body = kind: 'admin#directory#user' id: '1234567890' primaryEmail: 'newemail@domain.org' name: {givenName: 'Benjamin', familyName: 'Newlastname', fullName: 'Benjamin Newlastname' } isAdmin: false isDelegatedAdmin: false lastLoginTime: '1970-01-01T00:00:00.000Z' creationTime: '2013-06-26T03:39:52.000Z' agreedToTerms: true suspended: false changePasswordAtNextLogin: false ipWhitelisted: false emails: [ { address: 'newemail@domain.org', type: 'custom', primary: true } ] customerId: 'fake_customer_id' orgUnitPath: '/' isMailboxSetup: true includeInGlobalAddressList: true patch_body = name: familyName: 'Newlastname' primaryEmail: 'newemail@domain.org' nock('https://www.googleapis.com:443').persist() .patch('/admin/directory/v1/users/1234567890', patch_body) .reply(200, body) @up.patch '1234567890', patch_body, (err, data) -> assert.deepEqual data, body done() it 'can correctly call patch with userkey, fields, cb', (done) -> body = primaryEmail: 'newemail@domain.org' name: givenName: 'George' familyName: 'Newlastname' fullName: 'George Newlastname' nock('https://www.googleapis.com:443').persist() .patch('/admin/directory/v1/users/1234567890?fields=name%2CprimaryEmail') .reply(200, body) @up.patch '1234567890', 'name,primaryEmail', (err, data) -> assert.deepEqual data, body done() ## DELETE ## it 'deletes a user', (done) -> body = {204: "Operation success"} nock('https://www.googleapis.com:443').persist().delete('/admin/directory/v1/users/1234567890') .reply(204, body) @up.delete '1234567890', (err, data) -> assert.deepEqual data, body done() it '404s when deleting a user with a bad userkey', (done) -> body = error: errors: [{ domain: "global", reason: "notFound", message: "Resource Not Found: userKey" }] code: 404 message: "Resource Not Found: userKey" nock('https://www.googleapis.com:443').persist().delete('/admin/directory/v1/users/12345') .reply(404, body) @up.delete '12345', (err, data) -> assert.deepEqual err, body done() describe 'OrgUnitProvisioning', ()-> before -> @ou = new google_apis.OrgUnitProvisioning token: access: 'access_token' @ou.retry_options = {minTimeout: 100, maxTimeout: 200, retries: 2, randomize: true} it 'returns an error when an argument of wrong type is given', (done) -> async.waterfall [ (cb_wf) => @ou.get 12345, (err, data) -> assert.equal err.toString(), "Error: OrgUnit::get expected (String customer_id, String org_unit_path, [, String fields, callback])" cb_wf() (cb_wf) => @ou.insert 12345, (err, data) -> assert.equal err.toString(), "Error: OrgUnit::insert expected (String customer_id, Object properties[, String fields, callback])" cb_wf() (cb_wf) => @ou.list 12345, (err, data) -> assert.equal err.toString(), "Error: OrgUnit::list expected (String customer_id[, Object params, callback])" cb_wf() (cb_wf) => @ou.patch 12345, (err, data) -> assert.equal err.toString(), "Error: OrgUnit::patch expected (String customer_id, String org_unit_path, [Object patch_body, String fields, callback])" cb_wf() (cb_wf) => @ou.delete 12345, (err, data) -> assert.equal err.toString(), "Error: OrgUnit::delete expected (String customer_id, String org_unit_path[, callback])" cb_wf() ], done it 'can get an OrgUnit', (done) -> body = kind: 'admin#directory#orgUnit' name: 'RockyRoad' description: 'For people who like Rocky Road ice cream' orgUnitPath: '/RockyRoad' parentOrgUnitPath: '/' blockInheritance: false nock('https://www.googleapis.com:443').persist().get('/admin/directory/v1/customer/fake_customer_id/orgunits/RockyRoad') .reply(200, body) @ou.get 'fake_customer_id', 'RockyRoad', (err, data) -> assert.deepEqual data, body done() it 'can get an OrgUnit filtered by fields', (done) -> body = name: 'RockyRoad' description: 'For people who like Rocky Road ice cream' nock('https://www.googleapis.com:443').persist() .get('/admin/directory/v1/customer/fake_customer_id/orgunits/RockyRoad?fields=name%2Cdescription') .reply(200, body) @ou.get 'fake_customer_id', 'RockyRoad', 'name,description', (err, data) -> assert.deepEqual data, body done() it 'can list all org units for a customer', (done) -> body = kind: 'admin#directory#orgUnits', organizationUnits: [ kind: 'admin#directory#orgUnit' name: 'RockyRoad' description: '' orgUnitPath: '/RockyRoad' parentOrgUnitPath: '/' blockInheritance: false , kind: 'admin#directory#orgUnit' name: 'Vanilla' description: '' orgUnitPath: '/Vanilla' parentOrgUnitPath: '/' blockInheritance: false , kind: 'admin#directory#orgUnit' name: 'ChocolateChipCookieDough' description: '' orgUnitPath: '/ChocolateChipCookieDough' parentOrgUnitPath: '/' blockInheritance: false ] nock('https://www.googleapis.com:443').persist().get('/admin/directory/v1/customer/fake_customer_id/orgunits') .reply(200, body) @ou.list 'fake_customer_id', (err, data) -> assert.deepEqual data, body done() it 'can list an org unit by params', (done) -> body = kind: 'admin#directory#orgUnits', organizationUnits: [ { kind: 'admin#directory#orgUnit', name: 'OrgUnit1', description: '', orgUnitPath: '/ParentOU/OrgUnit1', parentOrgUnitPath: '/ParentOU', blockInheritance: false }, { kind: 'admin#directory#orgUnit', name: 'OrgUnit2', description: '', orgUnitPath: '/ParentOU/OrgUnit2', parentOrgUnitPath: '/ParentOU', blockInheritance: false } ] nock('https://www.googleapis.com:443').persist().get('/admin/directory/v1/customer/fake_customer_id/orgunits?orgUnitPath=ParentOU') .reply(200, body) @ou.list 'fake_customer_id', {orgUnitPath: 'ParentOU'}, (err, data) -> assert.deepEqual data, body done() it 'returns 400 with bad customer_id', (done) -> error = error: errors: [{ domain: "global", reason: "badRequest", message: "Bad Request" }] code: 400 message: "Bad Request" nock('https://www.googleapis.com:443').persist().get('/admin/directory/v1/customer/asdfasdf/orgunits') .reply(400, error) @ou.list 'asdfasdf', (err, data) -> assert.deepEqual err, error done() ## INSERT ## it 'creates an orgunit', (done) -> properties = name: 'TestOU' parentOrgUnitPath: '/' body = kind: 'admin#directory#orgUnit' name: 'TestOU' orgUnitPath: '/TestOU' parentOrgUnitPath: '/' nock('https://www.googleapis.com:443').persist().post('/admin/directory/v1/customer/fake_customer_id/orgunits', properties) .reply(200, body) @ou.insert 'fake_customer_id', properties, (err, data) -> assert.deepEqual data, body done() it 'creates an orgunit with fields args for partial response', (done) -> properties = name: 'TestOU' parentOrgUnitPath: '/' fields = 'name, orgUnitPath' body = name: 'TestOU' orgUnitPath: '/TestOU' nock('https://www.googleapis.com:443').persist().post('/admin/directory/v1/customer/fake_customer_id/orgunits?fields=name%2C%20orgUnitPath', properties) .reply(200, body) @ou.insert 'fake_customer_id', properties, fields, (err, data) -> assert.deepEqual data, body done() it 'fails to create an orgunit when invalid customer_id is given', (done) -> properties = name: 'TestOU' parentOrgUnitPath: '/' error = error: errors: [{ domain: "global", reason: "badRequest", message: "Bad Request" }] code: 400 message: "Bad Request" nock('https://www.googleapis.com:443').persist().post('/admin/directory/v1/customer/badId/orgunits', properties) .reply(400, error) @ou.insert 'badId', properties, (err, data) -> assert.deepEqual err, error done() it 'fails to create an orgunit when required properties are not given', (done) -> properties = name: 'TestOU4' error = error: errors: [ { domain: 'global', reason: 'invalid', message: 'Invalid Parent Orgunit Id' } ] code: 400 message: 'Invalid Parent Orgunit Id' nock('https://www.googleapis.com:443').persist().post('/admin/directory/v1/customer/fake_customer_id/orgunits', properties) .reply(400, error) @ou.insert 'fake_customer_id', properties, (err, data) -> assert.deepEqual err, error done() ## DELETE ## it 'deletes an orgunit', (done) -> body = { 204: 'Operation success' } nock('https://www.googleapis.com:443').persist().delete('/admin/directory/v1/customer/fake_customer_id/orgunits/DeleteThis') .reply(204, body) @ou.delete 'fake_customer_id', 'DeleteThis', (err, data) -> assert.deepEqual data, body done() it '404s when trying to delete a nonexistant an orgunit', (done) -> error = error: errors: [ { domain: 'global', reason: 'notFound', message: 'Org unit not found' } ] code: 404 message: 'Org unit not found' nock('https://www.googleapis.com:443').persist().delete('/admin/directory/v1/customer/fake_customer_id/orgunits/doesnotexist') .reply(404, error) @ou.delete 'fake_customer_id', 'doesnotexist', (err, data) -> assert.deepEqual err, error done() ## PATCH ## it 'updates an OrgUnit', (done) -> patch_body = {name: 'UpdatedName'} body = kind: 'admin#directory#orgUnit' name: 'UpdatedName' orgUnitPath: '/UpdatedName' parentOrgUnitPath: '/' nock('https://www.googleapis.com:443').persist() .patch('/admin/directory/v1/customer/fake_customer_id/orgunits/UpdateThisName', patch_body) .reply(200, body) @ou.patch 'fake_customer_id', 'UpdateThisName', patch_body, (err, data) -> assert.deepEqual data, body done() it 'updates an OrgUnit and returns a partial response', (done) -> patch_body = {name: 'UpdatedName'} body = name: 'UpdatedName' orgUnitPath: '/UpdatedName' nock('https://www.googleapis.com:443').persist() .patch('/admin/directory/v1/customer/fake_customer_id/orgunits/UpdateThisName?fields=name%2CorgUnitPath', patch_body) .reply(200, body) @ou.patch 'fake_customer_id', 'UpdateThisName', patch_body, 'name,orgUnitPath', (err, data) -> assert.deepEqual data, body done() it 'can call update with no patch_body', (done) -> body = { name: 'UpdateThisName' } nock('https://www.googleapis.com:443').persist() .patch('/admin/directory/v1/customer/fake_customer_id/orgunits/UpdateThisName?fields=name') .reply(200, body) @ou.patch 'fake_customer_id', 'UpdateThisName', 'name', (err, data) -> assert.deepEqual data, body done() it 'update returns an error when called with an invalid customer_id', (done) -> error = errors: [ { domain: 'global', reason: 'authError', message: 'Invalid Credentials', locationType: 'header', location: 'Authorization' } ] code: 401 message: 'Invalid Credentials' nock('https://www.googleapis.com:443').persist() .patch('/admin/directory/v1/customer/bad_id/orgunits/UpdateThisName?fields=name') .reply(401, error) @ou.patch 'bad_id', 'UpdateThisName', 'name', (err, data) -> assert.deepEqual err, error done() describe 'GroupProvisioning', ()-> before -> @gp = new google_apis.GroupProvisioning token: access: 'fake_access_token' @gp.retry_options = {minTimeout: 100, maxTimeout: 200, retries: 2, randomize: true} it 'returns an error when an argument of wrong type is given', (done) -> async.waterfall [ (cb_wf) => @gp.get 12345, (err, data) -> assert.equal err.toString(), "Error: GroupProvisioning::get expected (String group_key[, callback])" cb_wf() (cb_wf) => @gp.insert 12345, (err, data) -> assert.equal err.toString(), "Error: GroupProvisioning::insert expected (Object properties[, String fields, callback])" cb_wf() (cb_wf) => @gp.list 12345, (err, data) -> assert.equal err.toString(), "Error: GroupProvisioning::list expected (Object params[, callback])" cb_wf() (cb_wf) => @gp.patch 12345, (err, data) -> assert.equal err.toString(), "Error: GroupProvisioning::delete expected (String group_key[, Object body, String fields, callback])" cb_wf() (cb_wf) => @gp.delete 12345, (err, data) -> assert.equal err.toString(), "Error: GroupProvisioning::delete expected (String group_key[, callback])" cb_wf() ], done ## LIST ## it 'lists groups for a domain', (done) -> body = kind: 'admin#directory#groups' groups: [{ id: 'abcd1234' email: 'group1@domain.org', name: 'Group1', description: 'the first group' }] nextPageToken: 'next_page' params = domain: 'domain.org' maxResults: 1 fields: 'groups(description,email,id,name),kind,nextPageToken' nock('https://www.googleapis.com:443').persist() .get('/admin/directory/v1/groups?domain=domain.org&maxResults=1&fields=groups(description%2Cemail%2Cid%2Cname)%2Ckind%2CnextPageToken') .reply(200, body) @gp.list params, (err, data) -> assert.deepEqual data, body done() it 'returns an error when an invalid param is given', (done) -> params = domain: 'domain.org' maxResults: 1 unknown_field: true @gp.list params, (err, data) -> assert.equal err.toString(), "Error: GroupProvisioning::list invalid param 'unknown_field'" done() it 'returns 404 for a valid parameter that doesn not exist', (done) -> params = domain: 'badexample.com' maxResults: 1 error = errors: [ { domain: 'global', reason: 'notFound', message: 'Resource Not Found: badexample.com' } ] code: 404 message: 'Resource Not Found: badexample.com' nock('https://www.googleapis.com:443').persist() .get('/admin/directory/v1/groups?domain=badexample.com&maxResults=1') .reply(404, error) @gp.list params, (err, data) -> assert.deepEqual err, error done() ## GET ## it 'can get group by group_key', (done) -> body = kind: 'admin#directory#group' id: 'abcd1234' email: 'group1@domain.org' name: 'Group1' description: 'the first group' adminCreated: true nock('https://www.googleapis.com:443').persist().get('/admin/directory/v1/groups/abcd1234') .reply(200, body) @gp.get 'abcd1234', (err, data) -> assert.deepEqual data, body done() it '404s when trying to get a group by invalid group_key', (done) -> error = error: errors: [ { domain: 'global', reason: 'notFound', message: 'Resource Not Found: groupKey' } ] code: 404 message: 'Resource Not Found: groupKey' nock('https://www.googleapis.com:443').persist() .get('/admin/directory/v1/groups/badkey') .reply(404, error) @gp.get 'badkey', (err, data) -> assert.deepEqual err, error done() ## INSERT ## it 'can insert a group', (done) -> fields = 'description,email,id' body = id: 'abcd1234' email: 'newgroup@domain.org' description: 'new test group' properties = email: 'newgroup@domain.org' description: 'new test group' nock('https://www.googleapis.com:443').persist().post('/admin/directory/v1/groups?fields=description%2Cemail%2Cid', properties) .reply(200, body) @gp.insert properties, fields, (err, data) -> assert.deepEqual data, body done() it 'returns an error when trying to insert a group without required properties', (done) -> error = error: errors: [ { domain: 'global', reason: 'required', message: 'Missing required field: email' } ] code: 400 message: 'Missing required field: email' properties = description: 'no email for this group' nock('https://www.googleapis.com:443').persist().post('/admin/directory/v1/groups', properties) .reply(400, error) @gp.insert properties, (err, data) -> assert.deepEqual err, error done() ## DELETE ## it 'can delete a group', (done) -> nock('https://www.googleapis.com:443').persist() .delete('/admin/directory/v1/groups/abcd1234') .reply(204, "") @gp.delete 'abcd1234', (err, data) -> assert.deepEqual data, { 204: 'Operation success'} done() it 'delete returns an error when a nonstring group_key is given', (done) -> @gp.delete 12345, (err, data) -> assert.equal err.toString(), 'Error: GroupProvisioning::delete expected (String group_key[, callback])' done() it 'returns an error when a nonexistant group_key is given', (done) -> error = error: errors: [ { domain: 'global', reason: 'notFound', message: 'Resource Not Found: groupKey' } ] code: 404 message: 'Resource Not Found: groupKey' nock('https://www.googleapis.com:443').persist() .delete('/admin/directory/v1/groups/asdf1234asdf') .reply(404, error) @gp.delete 'asdf1234asdf', (err, data) -> assert.deepEqual err, error done() it 'updates a group', (done) -> req_body = name: 'Updated group' description: 'new description' resp_body = id: 'abcd1234' email: 'group1@domain.org' name: 'Updated group' description: 'new description' nock('https://www.googleapis.com:443').persist() .patch('/admin/directory/v1/groups/abcd1234?fields=id%2Cname%2Cdescription%2Cemail', req_body) .reply(200, resp_body) @gp.patch 'abcd1234', req_body, 'id,name,description,email', (err, data) -> assert.deepEqual data, resp_body done() it '404s when updating with a bad group_key', (done) -> req_body = {name: 'Updated group'} error = error: errors: [ { domain: 'global', reason: 'notFound', message: 'Resource Not Found: groupKey' } ] code: 404, message: 'Resource Not Found: groupKey' nock('https://www.googleapis.com:443').persist() .patch('/admin/directory/v1/groups/12345', req_body) .reply(404, error) @gp.patch '12345', req_body, (err, data) -> assert.deepEqual err, error done()