linagora/openpaas-esn

View on GitHub
modules/linagora.esn.contact/frontend/app/contact/contact.service.spec.js

Summary

Maintainability
F
1 wk
Test Coverage
'use strict';

/* global chai, sinon: false */

var expect = chai.expect;

describe('The contactService service', function() {
  var $rootScope, $q;
  var session, contactService, ContactAPIClient, moveFn, davImportServiceMock;

  beforeEach(function() {
    module('esn.session', function($provide) {
      session = {
        user: {
          _id: '123'
        },
        ready: {
          then: angular.noop
        }
      };

      $provide.value('session', session);
    });

    davImportServiceMock = {};

    module('linagora.esn.contact', function($provide) {
      $provide.value('davImportService', davImportServiceMock);
    });

    inject(function(
      _$rootScope_,
      _$q_,
      _contactService_,
      _ContactAPIClient_
    ) {
      $rootScope = _$rootScope_;
      $q = _$q_;
      ContactAPIClient = _ContactAPIClient_;
      contactService = _contactService_;
    });
  });

  describe('The listContacts function', function() {
    it('should call ContactAPIClient with right parameters to get the list of contacts', function(done) {
      var bookId = '1213';
      var bookName = 'contacts';

      ContactAPIClient.addressbookHome = function(currentBookId) {
        return {
          addressbook: function(currentBookName) {

            return {
              get: function() {
                return $q.when({
                  bookId: bookId,
                  bookName: bookName
                });
              },
              vcard: function() {
                return {
                  list: function() {
                    expect(currentBookId).to.equal(bookId);
                    expect(currentBookName).to.equal(bookName);
                    done();
                  }
                };
              }
            };
          }
        };
      };

      contactService.listContacts(bookId, bookName);
      $rootScope.$digest();
    });

    it('should list contact from source address book if the current one is subscription', function(done) {
      var subsBookId = '123';
      var subsBookName = 'contacts';
      var sourceBookId = '456';
      var sourceBookName = 'collected';

      ContactAPIClient.addressbookHome = function(bookId) {
        return {
          addressbook: function(bookName) {

            return {
              get: function() {
                return $q.when({
                  bookId: subsBookId,
                  bookName: subsBookName,
                  source: {
                    bookId: sourceBookId,
                    bookName: sourceBookName
                  },
                  isSubscription: true
                });
              },
              vcard: function() {
                return {
                  list: function() {
                    expect(bookId).to.equal(sourceBookId);
                    expect(bookName).to.equal(sourceBookName);
                    done();
                  }
                };
              }
            };
          }
        };
      };

      contactService.listContacts(subsBookId, subsBookName);
      $rootScope.$digest();
    });
  });

  describe('The getContact function', function() {
    it('should call ContactAPIClient with right parameters to get the contact', function(done) {
      var bookId = '1213';
      var bookName = 'contacts';

      ContactAPIClient.addressbookHome = function(currentBookId) {
        return {
          addressbook: function(currentBookName) {

            return {
              get: function() {
                return $q.when({
                  bookId: bookId,
                  bookName: bookName
                });
              },
              vcard: function() {
                return {
                  get: function() {
                    expect(currentBookId).to.equal(bookId);
                    expect(currentBookName).to.equal(bookName);
                    done();
                  }
                };
              }
            };
          }
        };
      };

      contactService.getContact(bookId, bookName);
      $rootScope.$digest();
    });

    it('should get contact from source address book if the current one is subscription', function(done) {
      var subsBookId = '123';
      var subsBookName = 'contacts';
      var sourceBookId = '456';
      var sourceBookName = 'collected';
      var cardId = 'ghj';

      ContactAPIClient.addressbookHome = function(bookId) {
        return {
          addressbook: function(bookName) {

            return {
              get: function() {
                return $q.when({
                  bookId: subsBookId,
                  bookName: subsBookName,
                  source: {
                    bookId: sourceBookId,
                    bookName: sourceBookName
                  },
                  isSubscription: true
                });
              },
              vcard: function(id) {
                return {
                  get: function() {
                    expect(id).to.equal(cardId);
                    expect(bookId).to.equal(sourceBookId);
                    expect(bookName).to.equal(sourceBookName);
                    done();
                  }
                };
              }
            };
          }
        };
      };

      contactService.getContact({ bookId: sourceBookId, bookName: sourceBookName }, cardId);
      $rootScope.$digest();
    });
  });

  describe('The createContact function', function() {
    it('should call ContactAPIClient with right parameters to create the contact', function(done) {
      var bookId = '1213';
      var bookName = 'contacts';
      var contact = {
        id: '456'
      };

      ContactAPIClient.addressbookHome = function(currentBookId) {
        return {
          addressbook: function(currentBookName) {

            return {
              get: function() {
                return $q.when({
                  bookId: bookId,
                  bookName: bookName
                });
              },
              vcard: function() {
                return {
                  create: function() {
                    expect(currentBookId).to.equal(bookId);
                    expect(currentBookName).to.equal(bookName);
                    done();

                    return $q.when(contact);
                  }
                };
              }
            };
          }
        };
      };

      contactService.createContact({ bookId: bookId, bookName: bookName }, contact);
      $rootScope.$digest();
    });

    it('should create contact in source address book if the current one is subscription', function(done) {
      var subsBookId = '123';
      var subsBookName = 'contacts';
      var sourceBookId = '456';
      var sourceBookName = 'collected';
      var createContact = {
        id: '678'
      };

      ContactAPIClient.addressbookHome = function(bookId) {
        return {
          addressbook: function(bookName) {

            return {
              get: function() {
                return $q.when({
                  bookId: subsBookId,
                  bookName: subsBookName,
                  source: {
                    bookId: sourceBookId,
                    bookName: sourceBookName
                  },
                  isSubscription: true
                });
              },
              vcard: function() {
                return {
                  create: function(contact) {
                    expect(contact).to.deep.equal(createContact);
                    expect(bookId).to.equal(sourceBookId);
                    expect(bookName).to.equal(sourceBookName);
                    done();
                  }
                };
              }
            };
          }
        };
      };

      contactService.createContact({ bookId: subsBookId, bookName: subsBookName }, createContact);
      $rootScope.$digest();
    });
  });

  describe('The updateContact function', function() {
    it('should call ContactAPIClient with right parameters to update the contact', function(done) {
      var addressbook = {
        bookId: '123',
        bookName: 'contacts'
      };
      var contact = {
        id: '456',
        addressbook: addressbook
      };

      ContactAPIClient.addressbookHome = function(currentBookId) {
        return {
          addressbook: function(currentBookName) {

            return {
              get: function() {
                return $q.when(addressbook);
              },
              vcard: function() {
                return {
                  update: function() {
                    expect(currentBookId).to.equal(contact.addressbook.bookId);
                    expect(currentBookName).to.equal(contact.addressbook.bookName);
                    done();

                    return $q.when(contact);
                  }
                };
              }
            };
          }
        };
      };

      contactService.updateContact(addressbook, contact);
      $rootScope.$digest();
    });

    it('should update contact in source address book if the current one is subscription', function(done) {
      var subsBookId = '123';
      var subsBookName = 'contacts';
      var sourceBookId = '456';
      var sourceBookName = 'collected';
      var addressbook = {
        bookId: subsBookId,
        bookName: subsBookName,
        source: {
          bookId: sourceBookId,
          bookName: sourceBookName
        },
        isSubscription: true
      };
      var contact = {
        id: 'jqk',
        addressbook: addressbook
      };

      ContactAPIClient.addressbookHome = function(bookId) {
        return {
          addressbook: function(bookName) {

            return {
              get: function() {
                return $q.when(addressbook);
              },
              vcard: function() {
                return {
                  update: function() {
                    expect(bookId).to.equal(sourceBookId);
                    expect(bookName).to.equal(sourceBookName);
                    done();
                  }
                };
              }
            };
          }
        };
      };

      contactService.updateContact(addressbook, contact);
      $rootScope.$digest();
    });
  });

  describe('The removeContact function', function() {
    it('should call ContactAPIClient with right parameters to remove the contact', function(done) {
      var addressbook = {
        bookId: '123',
        bookName: 'contacts'
      };
      var contact = {
        id: '456',
        addressbook: addressbook
      };

      ContactAPIClient.addressbookHome = function(currentBookId) {
        return {
          addressbook: function(currentBookName) {

            return {
              get: function() {
                return $q.when(addressbook);
              },
              vcard: function() {
                return {
                  remove: function() {
                    expect(currentBookId).to.equal(contact.addressbook.bookId);
                    expect(currentBookName).to.equal(contact.addressbook.bookName);
                    done();
                  }
                };
              }
            };
          }
        };
      };

      contactService.removeContact(addressbook, contact);
      $rootScope.$digest();
    });

    it('should remove contact from source address book if the current one is subscription', function(done) {
      var subsBookId = '123';
      var subsBookName = 'contacts';
      var sourceBookId = '456';
      var sourceBookName = 'collected';
      var addressbook = {
        bookId: subsBookId,
        bookName: subsBookName,
        source: {
          bookId: sourceBookId,
          bookName: sourceBookName
        },
        isSubscription: true
      };
      var contact = {
        id: 'jqk',
        addressbook: addressbook
      };

      ContactAPIClient.addressbookHome = function(bookId) {
        return {
          addressbook: function(bookName) {
            return {
              get: function() {
                return $q.when(addressbook);
              },
              vcard: function() {
                return {
                  remove: function() {
                    expect(bookId).to.equal(sourceBookId);
                    expect(bookName).to.equal(sourceBookName);
                    done();
                  }
                };
              }
            };
          }
        };
      };

      contactService.removeContact(addressbook, contact);
      $rootScope.$digest();
    });
  });

  describe('The copyContact function', function() {
    it('should delete id of the contact before calling ContactAPIClient to copy contact', function(done) {
      var contact = {
        id: '456'
      };
      var addressbook = {
        bookId: session.user._id,
        bookName: 'contacts'
      };

      ContactAPIClient.addressbookHome = function(bookId) {
        expect(bookId).to.equal(session.user._id);

        return {
          addressbook: function(bookName) {
            expect(bookName).to.equal('contacts');

            return {
              get: function() {
                return $q.when(addressbook);
              },
              vcard: function() {
                return {
                  create: function(createContact) {
                    expect(createContact.id).to.be.undefined;
                    done();
                  }
                };
              }
            };
          }
        };
      };

      contactService.copyContact(addressbook, contact);
      $rootScope.$digest();
    });

    it('should copy contact to toAddressbook\'s source AB if the toAddressbook is a subscription', function(done) {
      var toAddressbook = {
        bookId: '123',
        bookName: 'contacts',
        source: {
          bookId: '456',
          bookName: 'collected'
        },
        isSubscription: true
      };

      ContactAPIClient.addressbookHome = function(bookId) {
        return {
          addressbook: function(bookName) {

            return {
              get: function() {
                return $q.when(toAddressbook);
              },
              vcard: function() {
                return {
                  create: function() {
                    expect(bookId).to.equal(toAddressbook.source.bookId);
                    expect(bookName).to.equal(toAddressbook.source.bookName);
                    done();
                  }
                };
              }
            };
          }
        };
      };

      contactService.copyContact(toAddressbook, { id: 'jqk' });
      $rootScope.$digest();
    });
  });

  describe('The moveContact function', function() {
    var contact;

    beforeEach(function() {
      moveFn = sinon.stub().returns($q.when());
      contact = {
        id: 'toto',
        addressbook: {
          bookId: session.user._id,
          bookName: 'contacts'
        }
      };
      ContactAPIClient.addressbookHome = function(bookId) {
        expect(bookId).to.equal(session.user._id);

        return {
          addressbook: function(bookName) {
            expect(bookName).to.equal(contact.addressbook.bookName);

            return {
              vcard: function(cardId) {
                expect(cardId).to.equal(contact.id);

                return {
                  move: moveFn
                };
              }
            };
          }
        };
      };
    });

    it('should move contact to toAddressbook\'s source AB if the toAddressbook is a subscription', function(done) {
      var fromAddressbook = {
        bookId: '456',
        bookName: 'from'
      };

      var toAddressbook = {
        bookId: '456',
        bookName: 'to',
        source: {
          bookId: '789',
          bookName: 'test'
        },
        isSubscription: true
      };

      var contact = {
        id: 'jqk',
        addressbook: fromAddressbook
      };

      ContactAPIClient.addressbookHome = function() {
        return {
          addressbook: function(bookName) {

            return {
              get: function() {
                if (bookName === 'from') {
                  return $q.when(fromAddressbook);
                }

                return $q.when(toAddressbook);
              },
              vcard: function() {
                return {
                  move: function(options) {
                    expect(options).to.deep.equal({
                      toBookId: toAddressbook.source.bookId,
                      toBookName: toAddressbook.source.bookName
                    });
                    done();
                  }
                };
              }
            };
          }
        };
      };

      contactService.moveContact(fromAddressbook, toAddressbook, contact);
      $rootScope.$digest();
    });

    it('should move contact from source of fromAddressbook if the fromAddressbook is a subscription', function(done) {
      var fromAddressbook = {
        bookId: '123',
        bookName: 'from',
        source: {
          bookId: 'jqk',
          bookName: 'test'
        },
        isSubscription: true
      };

      var toAddressbook = {
        bookId: '456',
        bookName: 'to'
      };
      var contact = {
        id: 'jqk',
        addressbook: fromAddressbook
      };

      ContactAPIClient.addressbookHome = function(bookId) {
        return {
          addressbook: function(bookName) {

            return {
              get: function() {
                if (bookName === 'from') {
                  return $q.when(fromAddressbook);
                }

                return $q.when(toAddressbook);
              },
              vcard: function() {
                return {
                  move: function(options) {
                    expect(bookId).to.equal(fromAddressbook.source.bookId);
                    expect(bookName).to.equal(fromAddressbook.source.bookName);
                    expect(options).to.deep.equal({
                      toBookId: toAddressbook.bookId,
                      toBookName: toAddressbook.bookName
                    });
                    done();
                  }
                };
              }
            };
          }
        };
      };

      contactService.moveContact(fromAddressbook, toAddressbook, contact);
      $rootScope.$digest();
    });

    it('should move contact from source of source AB to source of destination AB if both source and destination ABs are subscription', function(done) {
      var fromAddressbook = {
        bookId: '123',
        bookName: 'from',
        source: {
          bookId: 'jqk',
          bookName: 'test'
        },
        isSubscription: true
      };
      var toAddressbook = {
        bookId: '456',
        bookName: 'to',
        source: {
          bookId: '789',
          bookName: 'test1'
        },
        isSubscription: true
      };
      var contact = {
        id: 'jqk',
        addressbook: fromAddressbook
      };

      ContactAPIClient.addressbookHome = function(bookId) {
        return {
          addressbook: function(bookName) {
            return {
              get: function() {
                if (bookName === 'from') {
                  return $q.when(fromAddressbook);
                }

                return $q.when(toAddressbook);
              },
              vcard: function() {
                return {
                  move: function(options) {
                    expect(bookId).to.equal(fromAddressbook.source.bookId);
                    expect(bookName).to.equal(fromAddressbook.source.bookName);
                    expect(options).to.deep.equal({
                      toBookId: toAddressbook.source.bookId,
                      toBookName: toAddressbook.source.bookName
                    });
                    done();
                  }
                };
              }
            };
          }
        };
      };

      contactService.moveContact(fromAddressbook, toAddressbook, contact);
      $rootScope.$digest();
    });
  });

  describe('The importContactsFromFile function', function() {
    it('should call davImportService.importFromFile with right parameters to import contacts', function() {
      var bookId = '1213';
      var bookName = 'contacts';
      var file = [{ type: 'text/vcard', length: 100 }];

      ContactAPIClient.addressbookHome = function() {
        return {
          addressbook: function() {
            return {
              get: function() {
                return $q.when({
                  bookId: bookId,
                  bookName: bookName
                });
              }
            };
          }
        };
      };
      davImportServiceMock.importFromFile = sinon.spy();

      contactService.importContactsFromFile({ bookId: bookId, bookName: bookName }, file[0]);
      $rootScope.$digest();

      expect(davImportServiceMock.importFromFile).to.have.been.calledWith(file[0], '/addressbooks/' + bookId + '/' + bookName + '.json');
    });

    it('should import contacts to source address book if the current one is subscription', function() {
      var subsBookId = '123';
      var subsBookName = 'contacts';
      var sourceBookId = '456';
      var sourceBookName = 'collected';
      var file = [{ type: 'text/vcard', length: 100 }];

      ContactAPIClient.addressbookHome = function() {
        return {
          addressbook: function() {
            return {
              get: function() {
                return $q.when({
                  bookId: subsBookId,
                  bookName: subsBookName,
                  source: {
                    bookId: sourceBookId,
                    bookName: sourceBookName
                  },
                  isSubscription: true
                });
              }
            };
          }
        };
      };
      davImportServiceMock.importFromFile = sinon.spy();

      contactService.importContactsFromFile({ bookId: subsBookId, bookName: subsBookName }, file[0]);
      $rootScope.$digest();

      expect(davImportServiceMock.importFromFile).to.have.been.calledWith(file[0], '/addressbooks/' + sourceBookId + '/' + sourceBookName + '.json');
    });
  });
});