Add some additional authTests
This commit is contained in:
parent
fdd8df6966
commit
8160431811
File diff suppressed because it is too large
Load Diff
|
@ -2,9 +2,11 @@ import firebase from '../../firebase';
|
||||||
import TestSuite from '../../../lib/TestSuite';
|
import TestSuite from '../../../lib/TestSuite';
|
||||||
|
|
||||||
import authTests from './authTests';
|
import authTests from './authTests';
|
||||||
|
import userTests from './userTests';
|
||||||
|
|
||||||
const suite = new TestSuite('Auth', 'firebase.auth()', firebase);
|
const suite = new TestSuite('Auth', 'firebase.auth()', firebase);
|
||||||
|
|
||||||
suite.addTests(authTests);
|
suite.addTests(authTests);
|
||||||
|
suite.addTests(userTests);
|
||||||
|
|
||||||
export default suite;
|
export default suite;
|
||||||
|
|
|
@ -0,0 +1,399 @@
|
||||||
|
import should from 'should';
|
||||||
|
|
||||||
|
const randomString = (length, chars) => {
|
||||||
|
let mask = '';
|
||||||
|
if (chars.indexOf('a') > -1) mask += 'abcdefghijklmnopqrstuvwxyz';
|
||||||
|
if (chars.indexOf('A') > -1) mask += 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
||||||
|
if (chars.indexOf('#') > -1) mask += '0123456789';
|
||||||
|
if (chars.indexOf('!') > -1) mask += '~`!@#$%^&*()_+-={}[]:";\'<>?,./|\\';
|
||||||
|
let result = '';
|
||||||
|
for (let i = length; i > 0; --i) {
|
||||||
|
result += mask[Math.round(Math.random() * (mask.length - 1))];
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
export default (userTests = ({ tryCatch, context, describe, it, firebase }) => {
|
||||||
|
describe('User', () => {
|
||||||
|
context('getIdToken()', () => {
|
||||||
|
it('should return a token', () => {
|
||||||
|
const random = randomString(12, '#aA');
|
||||||
|
const email = `${random}@${random}.com`;
|
||||||
|
const pass = random;
|
||||||
|
|
||||||
|
const successCb = newUser => {
|
||||||
|
newUser.uid.should.be.a.String();
|
||||||
|
newUser.email.should.equal(email.toLowerCase());
|
||||||
|
newUser.emailVerified.should.equal(false);
|
||||||
|
newUser.isAnonymous.should.equal(false);
|
||||||
|
newUser.providerId.should.equal('firebase');
|
||||||
|
|
||||||
|
return newUser.getIdToken().then(token => {
|
||||||
|
token.should.be.a.String();
|
||||||
|
token.length.should.be.greaterThan(24);
|
||||||
|
return firebase.native.auth().currentUser.delete();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return firebase.native
|
||||||
|
.auth()
|
||||||
|
.createUserWithEmailAndPassword(email, pass)
|
||||||
|
.then(successCb);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('getToken()', () => {
|
||||||
|
it('should return a token', () => {
|
||||||
|
const random = randomString(12, '#aA');
|
||||||
|
const email = `${random}@${random}.com`;
|
||||||
|
const pass = random;
|
||||||
|
|
||||||
|
const successCb = newUser => {
|
||||||
|
newUser.uid.should.be.a.String();
|
||||||
|
newUser.email.should.equal(email.toLowerCase());
|
||||||
|
newUser.emailVerified.should.equal(false);
|
||||||
|
newUser.isAnonymous.should.equal(false);
|
||||||
|
newUser.providerId.should.equal('firebase');
|
||||||
|
|
||||||
|
return newUser.getToken().then(token => {
|
||||||
|
token.should.be.a.String();
|
||||||
|
token.length.should.be.greaterThan(24);
|
||||||
|
return firebase.native.auth().currentUser.delete();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return firebase.native
|
||||||
|
.auth()
|
||||||
|
.createUserWithEmailAndPassword(email, pass)
|
||||||
|
.then(successCb);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('linkWithCredential()', () => {
|
||||||
|
it('it should link anonymous account <-> email account', () => {
|
||||||
|
const random = randomString(12, '#aA');
|
||||||
|
const email = `${random}@${random}.com`;
|
||||||
|
const pass = random;
|
||||||
|
|
||||||
|
const successCb = currentUser => {
|
||||||
|
currentUser.should.be.an.Object();
|
||||||
|
currentUser.uid.should.be.a.String();
|
||||||
|
currentUser.toJSON().should.be.an.Object();
|
||||||
|
should.equal(currentUser.toJSON().email, null);
|
||||||
|
currentUser.isAnonymous.should.equal(true);
|
||||||
|
currentUser.providerId.should.equal('firebase');
|
||||||
|
firebase.native.auth().currentUser.uid.should.be.a.String();
|
||||||
|
|
||||||
|
const credential = firebase.native.auth.EmailAuthProvider.credential(
|
||||||
|
email,
|
||||||
|
pass
|
||||||
|
);
|
||||||
|
|
||||||
|
return currentUser
|
||||||
|
.linkWithCredential(credential)
|
||||||
|
.then(linkedUser => {
|
||||||
|
linkedUser.should.be.an.Object();
|
||||||
|
linkedUser.should.equal(firebase.native.auth().currentUser);
|
||||||
|
linkedUser.uid.should.be.a.String();
|
||||||
|
linkedUser.toJSON().should.be.an.Object();
|
||||||
|
// iOS and Android are inconsistent in returning lowercase / mixed case
|
||||||
|
linkedUser
|
||||||
|
.toJSON()
|
||||||
|
.email.toLowerCase()
|
||||||
|
.should.eql(email.toLowerCase());
|
||||||
|
linkedUser.isAnonymous.should.equal(false);
|
||||||
|
linkedUser.providerId.should.equal('firebase');
|
||||||
|
return firebase.native.auth().signOut();
|
||||||
|
})
|
||||||
|
.catch(error =>
|
||||||
|
firebase.native
|
||||||
|
.auth()
|
||||||
|
.signOut()
|
||||||
|
.then(() => Promise.reject(error))
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
return firebase.native
|
||||||
|
.auth()
|
||||||
|
.signInAnonymously()
|
||||||
|
.then(successCb);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('it should error on link anon <-> email if email already exists', () => {
|
||||||
|
const email = 'test@test.com';
|
||||||
|
const pass = 'test1234';
|
||||||
|
|
||||||
|
const successCb = currentUser => {
|
||||||
|
currentUser.should.be.an.Object();
|
||||||
|
currentUser.uid.should.be.a.String();
|
||||||
|
currentUser.toJSON().should.be.an.Object();
|
||||||
|
should.equal(currentUser.toJSON().email, null);
|
||||||
|
currentUser.isAnonymous.should.equal(true);
|
||||||
|
currentUser.providerId.should.equal('firebase');
|
||||||
|
firebase.native.auth().currentUser.uid.should.be.a.String();
|
||||||
|
|
||||||
|
const credential = firebase.native.auth.EmailAuthProvider.credential(
|
||||||
|
email,
|
||||||
|
pass
|
||||||
|
);
|
||||||
|
|
||||||
|
return currentUser
|
||||||
|
.linkWithCredential(credential)
|
||||||
|
.then(() =>
|
||||||
|
firebase.native
|
||||||
|
.auth()
|
||||||
|
.signOut()
|
||||||
|
.then(() => Promise.reject(new Error('Did not error on link')))
|
||||||
|
)
|
||||||
|
.catch(error =>
|
||||||
|
firebase.native
|
||||||
|
.auth()
|
||||||
|
.signOut()
|
||||||
|
.then(() => {
|
||||||
|
error.code.should.equal('auth/email-already-in-use');
|
||||||
|
error.message.should.equal(
|
||||||
|
'The email address is already in use by another account.'
|
||||||
|
);
|
||||||
|
return Promise.resolve();
|
||||||
|
})
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
return firebase.native
|
||||||
|
.auth()
|
||||||
|
.signInAnonymously()
|
||||||
|
.then(successCb);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('linkAndRetrieveDataWithCredential()', () => {
|
||||||
|
it('it should link anonymous account <-> email account', () => {
|
||||||
|
const random = randomString(12, '#aA');
|
||||||
|
const email = `${random}@${random}.com`;
|
||||||
|
const pass = random;
|
||||||
|
|
||||||
|
const successCb = currentUser => {
|
||||||
|
currentUser.should.be.an.Object();
|
||||||
|
currentUser.uid.should.be.a.String();
|
||||||
|
currentUser.toJSON().should.be.an.Object();
|
||||||
|
should.equal(currentUser.toJSON().email, null);
|
||||||
|
currentUser.isAnonymous.should.equal(true);
|
||||||
|
currentUser.providerId.should.equal('firebase');
|
||||||
|
firebase.native.auth().currentUser.uid.should.be.a.String();
|
||||||
|
|
||||||
|
const credential = firebase.native.auth.EmailAuthProvider.credential(
|
||||||
|
email,
|
||||||
|
pass
|
||||||
|
);
|
||||||
|
|
||||||
|
return currentUser
|
||||||
|
.linkAndRetrieveDataWithCredential(credential)
|
||||||
|
.then(linkedUserCredential => {
|
||||||
|
linkedUserCredential.should.be.an.Object();
|
||||||
|
const linkedUser = linkedUserCredential.user;
|
||||||
|
linkedUser.should.be.an.Object();
|
||||||
|
linkedUser.should.equal(firebase.native.auth().currentUser);
|
||||||
|
linkedUser.uid.should.be.a.String();
|
||||||
|
linkedUser.toJSON().should.be.an.Object();
|
||||||
|
// iOS and Android are inconsistent in returning lowercase / mixed case
|
||||||
|
linkedUser
|
||||||
|
.toJSON()
|
||||||
|
.email.toLowerCase()
|
||||||
|
.should.eql(email.toLowerCase());
|
||||||
|
linkedUser.isAnonymous.should.equal(false);
|
||||||
|
linkedUser.providerId.should.equal('firebase');
|
||||||
|
// TODO: iOS is incorrect, passes on Android
|
||||||
|
// const additionalUserInfo = linkedUserCredential.additionalUserInfo;
|
||||||
|
// additionalUserInfo.should.be.an.Object();
|
||||||
|
// additionalUserInfo.isNewUser.should.equal(false);
|
||||||
|
return firebase.native.auth().signOut();
|
||||||
|
})
|
||||||
|
.catch(error =>
|
||||||
|
firebase.native
|
||||||
|
.auth()
|
||||||
|
.signOut()
|
||||||
|
.then(() => Promise.reject(error))
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
return firebase.native
|
||||||
|
.auth()
|
||||||
|
.signInAnonymously()
|
||||||
|
.then(successCb);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('it should error on link anon <-> email if email already exists', () => {
|
||||||
|
const email = 'test@test.com';
|
||||||
|
const pass = 'test1234';
|
||||||
|
|
||||||
|
const successCb = currentUser => {
|
||||||
|
currentUser.should.be.an.Object();
|
||||||
|
currentUser.uid.should.be.a.String();
|
||||||
|
currentUser.toJSON().should.be.an.Object();
|
||||||
|
should.equal(currentUser.toJSON().email, null);
|
||||||
|
currentUser.isAnonymous.should.equal(true);
|
||||||
|
currentUser.providerId.should.equal('firebase');
|
||||||
|
firebase.native.auth().currentUser.uid.should.be.a.String();
|
||||||
|
|
||||||
|
const credential = firebase.native.auth.EmailAuthProvider.credential(
|
||||||
|
email,
|
||||||
|
pass
|
||||||
|
);
|
||||||
|
|
||||||
|
return currentUser
|
||||||
|
.linkAndRetrieveDataWithCredential(credential)
|
||||||
|
.then(() =>
|
||||||
|
firebase.native
|
||||||
|
.auth()
|
||||||
|
.signOut()
|
||||||
|
.then(() => Promise.reject(new Error('Did not error on link')))
|
||||||
|
)
|
||||||
|
.catch(error =>
|
||||||
|
firebase.native
|
||||||
|
.auth()
|
||||||
|
.signOut()
|
||||||
|
.then(() => {
|
||||||
|
error.code.should.equal('auth/email-already-in-use');
|
||||||
|
error.message.should.equal(
|
||||||
|
'The email address is already in use by another account.'
|
||||||
|
);
|
||||||
|
return Promise.resolve();
|
||||||
|
})
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
return firebase.native
|
||||||
|
.auth()
|
||||||
|
.signInAnonymously()
|
||||||
|
.then(successCb);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('signOut()', () => {
|
||||||
|
it('it should reject signOut if no currentUser', () =>
|
||||||
|
new Promise((resolve, reject) => {
|
||||||
|
if (firebase.native.auth().currentUser) {
|
||||||
|
return reject(
|
||||||
|
new Error(
|
||||||
|
`A user is currently signed in. ${
|
||||||
|
firebase.native.auth().currentUser.uid
|
||||||
|
}`
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
const successCb = tryCatch(() => {
|
||||||
|
reject(new Error('No signOut error returned'));
|
||||||
|
}, reject);
|
||||||
|
|
||||||
|
const failureCb = tryCatch(error => {
|
||||||
|
error.code.should.equal('auth/no-current-user');
|
||||||
|
error.message.should.equal('No user currently signed in.');
|
||||||
|
resolve();
|
||||||
|
}, reject);
|
||||||
|
|
||||||
|
return firebase.native
|
||||||
|
.auth()
|
||||||
|
.signOut()
|
||||||
|
.then(successCb)
|
||||||
|
.catch(failureCb);
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
|
||||||
|
context('linkWithPhoneNumber()', () => {
|
||||||
|
it('should throw an unsupported error', async () => {
|
||||||
|
await firebase.native.auth().signInAnonymouslyAndRetrieveData();
|
||||||
|
(() => {
|
||||||
|
firebase.native.auth().currentUser.linkWithPhoneNumber();
|
||||||
|
}).should.throw(
|
||||||
|
'User.linkWithPhoneNumber() is unsupported by the native Firebase SDKs.'
|
||||||
|
);
|
||||||
|
await firebase.native.auth().signOut();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('linkWithPopup()', () => {
|
||||||
|
it('should throw an unsupported error', async () => {
|
||||||
|
await firebase.native.auth().signInAnonymouslyAndRetrieveData();
|
||||||
|
(() => {
|
||||||
|
firebase.native.auth().currentUser.linkWithPopup();
|
||||||
|
}).should.throw(
|
||||||
|
'User.linkWithPopup() is unsupported by the native Firebase SDKs.'
|
||||||
|
);
|
||||||
|
await firebase.native.auth().signOut();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('linkWithRedirect()', () => {
|
||||||
|
it('should throw an unsupported error', async () => {
|
||||||
|
await firebase.native.auth().signInAnonymouslyAndRetrieveData();
|
||||||
|
(() => {
|
||||||
|
firebase.native.auth().currentUser.linkWithRedirect();
|
||||||
|
}).should.throw(
|
||||||
|
'User.linkWithRedirect() is unsupported by the native Firebase SDKs.'
|
||||||
|
);
|
||||||
|
await firebase.native.auth().signOut();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('reauthenticateWithPhoneNumber()', () => {
|
||||||
|
it('should throw an unsupported error', async () => {
|
||||||
|
await firebase.native.auth().signInAnonymouslyAndRetrieveData();
|
||||||
|
(() => {
|
||||||
|
firebase.native.auth().currentUser.reauthenticateWithPhoneNumber();
|
||||||
|
}).should.throw(
|
||||||
|
'User.reauthenticateWithPhoneNumber() is unsupported by the native Firebase SDKs.'
|
||||||
|
);
|
||||||
|
await firebase.native.auth().signOut();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('reauthenticateWithPopup()', () => {
|
||||||
|
it('should throw an unsupported error', async () => {
|
||||||
|
await firebase.native.auth().signInAnonymouslyAndRetrieveData();
|
||||||
|
(() => {
|
||||||
|
firebase.native.auth().currentUser.reauthenticateWithPopup();
|
||||||
|
}).should.throw(
|
||||||
|
'User.reauthenticateWithPopup() is unsupported by the native Firebase SDKs.'
|
||||||
|
);
|
||||||
|
await firebase.native.auth().signOut();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('reauthenticateWithRedirect()', () => {
|
||||||
|
it('should throw an unsupported error', async () => {
|
||||||
|
await firebase.native.auth().signInAnonymouslyAndRetrieveData();
|
||||||
|
(() => {
|
||||||
|
firebase.native.auth().currentUser.reauthenticateWithRedirect();
|
||||||
|
}).should.throw(
|
||||||
|
'User.reauthenticateWithRedirect() is unsupported by the native Firebase SDKs.'
|
||||||
|
);
|
||||||
|
await firebase.native.auth().signOut();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('updatePhoneNumber()', () => {
|
||||||
|
it('should throw an unsupported error', async () => {
|
||||||
|
await firebase.native.auth().signInAnonymouslyAndRetrieveData();
|
||||||
|
(() => {
|
||||||
|
firebase.native.auth().currentUser.updatePhoneNumber();
|
||||||
|
}).should.throw(
|
||||||
|
'User.updatePhoneNumber() is unsupported by the native Firebase SDKs.'
|
||||||
|
);
|
||||||
|
await firebase.native.auth().signOut();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
context('refreshToken', () => {
|
||||||
|
it('should throw an unsupported error', async () => {
|
||||||
|
await firebase.native.auth().signInAnonymouslyAndRetrieveData();
|
||||||
|
(() => {
|
||||||
|
firebase.native.auth().currentUser.refreshToken;
|
||||||
|
}).should.throw(
|
||||||
|
'User.refreshToken is unsupported by the native Firebase SDKs.'
|
||||||
|
);
|
||||||
|
await firebase.native.auth().signOut();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
Loading…
Reference in New Issue