diff --git a/internal_packages/preferences/lib/tabs/preferences-account-details.jsx b/internal_packages/preferences/lib/tabs/preferences-account-details.jsx
index dc7027f03..c03c8693f 100644
--- a/internal_packages/preferences/lib/tabs/preferences-account-details.jsx
+++ b/internal_packages/preferences/lib/tabs/preferences-account-details.jsx
@@ -75,14 +75,14 @@ class PreferencesAccountDetails extends Component {
_onAccountAliasCreated = (newAlias)=> {
const coercedAlias = this._makeAlias(newAlias);
- const aliases = this.state.aliases.concat([coercedAlias]);
+ const aliases = this.state.account.aliases.concat([coercedAlias]);
this._setStateAndSave({aliases})
};
_onAccountAliasUpdated = (newAlias, alias, idx)=> {
const coercedAlias = this._makeAlias(newAlias);
- const aliases = this.state.aliases.slice();
- let defaultAlias = this.state.defaultAlias;
+ const aliases = this.state.account.aliases.slice();
+ let defaultAlias = this.state.account.defaultAlias;
if (defaultAlias === alias) {
defaultAlias = coercedAlias;
}
@@ -91,8 +91,8 @@ class PreferencesAccountDetails extends Component {
};
_onAccountAliasRemoved = (alias, idx)=> {
- const aliases = this.state.aliases.slice();
- let defaultAlias = this.state.defaultAlias;
+ const aliases = this.state.account.aliases.slice();
+ let defaultAlias = this.state.account.defaultAlias;
if (defaultAlias === alias) {
defaultAlias = null;
}
diff --git a/internal_packages/preferences/spec/preferences-account-details-spec.jsx b/internal_packages/preferences/spec/preferences-account-details-spec.jsx
new file mode 100644
index 000000000..8c82f1128
--- /dev/null
+++ b/internal_packages/preferences/spec/preferences-account-details-spec.jsx
@@ -0,0 +1,170 @@
+import React, {addons} from 'react/addons';
+import PreferencesAccountDetails from '../lib/tabs/preferences-account-details';
+const {TestUtils: {renderIntoDocument}} = addons;
+
+
+const makeComponent = (props = {})=> {
+ return renderIntoDocument();
+};
+
+const account = {
+ id: 1,
+ name: 'someone',
+ emailAddress: 'someone@nylas.com',
+ aliases: [],
+ defaultAlias: null,
+}
+
+describe('PreferencesAccountDetails', ()=> {
+ beforeEach(()=> {
+ this.account = account
+ this.onAccountUpdated = jasmine.createSpy('onAccountUpdated')
+ this.component = makeComponent({account, onAccountUpdated: this.onAccountUpdated})
+ spyOn(this.component, 'setState')
+ })
+
+ function assertAccountState(actual, expected) {
+ expect(actual).toEqual({
+ account: {
+ id: expected.id || 1,
+ name: expected.name || 'someone',
+ emailAddress: expected.emailAddress || 'someone@nylas.com',
+ aliases: expected.aliases || [],
+ defaultAlias: expected.defaultAlias || null,
+ },
+ })
+ }
+
+ describe('_makeAlias', ()=> {
+ it('returns correct alias when empty string provided', ()=> {
+ const alias = this.component._makeAlias('', this.account)
+ expect(alias).toEqual('someone ')
+ });
+
+ it('returns correct alias when only the name provided', ()=> {
+ const alias = this.component._makeAlias('Chad', this.account)
+ expect(alias).toEqual('Chad ')
+ });
+
+ it('returns correct alias when email provided', ()=> {
+ const alias = this.component._makeAlias('keith@nylas.com', this.account)
+ expect(alias).toEqual('someone ')
+ });
+
+ it('returns correct alias if name and email provided', ()=> {
+ const alias = this.component._makeAlias('Donald donald@nylas.com', this.account)
+ expect(alias).toEqual('Donald ')
+ });
+
+ it('returns correct alias if alias provided', ()=> {
+ const alias = this.component._makeAlias('Donald ', this.account)
+ expect(alias).toEqual('Donald ')
+ });
+ });
+
+ describe('_setState', ()=> {
+ it('sets the correct state', ()=> {
+ this.component._setState({aliases: ['something']})
+ assertAccountState(this.component.setState.calls[0].args[0], {aliases: ['something']})
+ });
+ });
+
+ describe('_onDefaultAliasSelected', ()=> {
+ it('sets the default alias correctly when set to None', ()=> {
+ this.component._onDefaultAliasSelected({target: {value: 'None'}})
+ assertAccountState(this.component.setState.calls[0].args[0], {defaultAlias: null})
+ });
+
+ it('sets the default alias correctly when set to any value', ()=> {
+ this.component._onDefaultAliasSelected({target: {value: 'my alias'}})
+ assertAccountState(this.component.setState.calls[0].args[0], {defaultAlias: 'my alias'})
+ });
+ });
+
+ describe('alias handlers', ()=> {
+ beforeEach(()=> {
+ this.currentAlias = 'juan '
+ this.newAlias = 'some ';
+ this.account.aliases = [
+ this.currentAlias,
+ ]
+ this.component = makeComponent({account: this.account, onAccountUpdated: this.onAccountUpdated})
+ spyOn(this.component, '_makeAlias').andCallFake((alias)=> alias)
+ spyOn(this.component, 'setState')
+ })
+ describe('_onAccountAliasCreated', ()=> {
+ it('creates alias correctly', ()=> {
+ this.component._onAccountAliasCreated(this.newAlias)
+ assertAccountState(this.component.setState.calls[0].args[0],
+ {aliases: [this.currentAlias, this.newAlias]})
+ });
+ });
+
+ describe('_onAccountAliasUpdated', ()=> {
+ it('updates alias correctly when no default alias present', ()=> {
+ this.component._onAccountAliasUpdated(this.newAlias, this.currentAlias, 0)
+ assertAccountState(this.component.setState.calls[0].args[0],
+ {aliases: [this.newAlias]})
+ });
+
+ it('updates alias correctly when default alias present and it is being updated', ()=> {
+ this.account.defaultAlias = this.currentAlias
+ this.component = makeComponent({account: this.account, onAccountUpdated: this.onAccountUpdated})
+ spyOn(this.component, '_makeAlias').andCallFake((alias)=> alias)
+ spyOn(this.component, 'setState')
+
+ this.component._onAccountAliasUpdated(this.newAlias, this.currentAlias, 0)
+ assertAccountState(this.component.setState.calls[0].args[0],
+ {aliases: [this.newAlias], defaultAlias: this.newAlias})
+ });
+
+ it('updates alias correctly when default alias present and it is not being updated', ()=> {
+ this.account.defaultAlias = this.currentAlias
+ this.account.aliases.push('otheralias')
+ this.component = makeComponent({account: this.account, onAccountUpdated: this.onAccountUpdated})
+ spyOn(this.component, '_makeAlias').andCallFake((alias)=> alias)
+ spyOn(this.component, 'setState')
+
+ this.component._onAccountAliasUpdated(this.newAlias, 'otheralias', 1)
+ assertAccountState(
+ this.component.setState.calls[0].args[0],
+ {aliases: [this.currentAlias, this.newAlias], defaultAlias: this.currentAlias}
+ )
+ });
+ });
+
+
+ describe('_onAccountAliasRemoved', ()=> {
+ it('removes alias correctly when no default alias present', ()=> {
+ this.component._onAccountAliasRemoved(this.currentAlias, 0)
+ assertAccountState(this.component.setState.calls[0].args[0], {aliases: []})
+ });
+
+ it('removes alias correctly when default alias present and it is being removed', ()=> {
+ this.account.defaultAlias = this.currentAlias
+ this.component = makeComponent({account: this.account, onAccountUpdated: this.onAccountUpdated})
+ spyOn(this.component, '_makeAlias').andCallFake((alias)=> alias)
+ spyOn(this.component, 'setState')
+
+ this.component._onAccountAliasRemoved(this.currentAlias, 0)
+ assertAccountState(this.component.setState.calls[0].args[0],
+ {aliases: [], defaultAlias: null})
+ });
+
+ it('removes alias correctly when default alias present and it is not being removed', ()=> {
+ this.account.defaultAlias = this.currentAlias
+ this.account.aliases.push('otheralias')
+ this.component = makeComponent({account: this.account, onAccountUpdated: this.onAccountUpdated})
+ spyOn(this.component, '_makeAlias').andCallFake((alias)=> alias)
+ spyOn(this.component, 'setState')
+
+ this.component._onAccountAliasRemoved('otheralias', 1)
+ assertAccountState(
+ this.component.setState.calls[0].args[0],
+ {aliases: [this.currentAlias], defaultAlias: this.currentAlias}
+ )
+ });
+ });
+ });
+
+});