mirror of
https://github.com/zhigang1992/react-native-firebase.git
synced 2026-04-16 23:00:31 +08:00
382 lines
10 KiB
JavaScript
382 lines
10 KiB
JavaScript
/*
|
|
* Copyright (c) 2016-present Invertase Limited & Contributors
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this library except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
*/
|
|
|
|
let validator = null;
|
|
|
|
describe('admob() requestOptions', () => {
|
|
before(() => {
|
|
validator = jet.require('packages/admob/lib/validateAdRequestOptions');
|
|
});
|
|
|
|
it('returns an empty object is not defined', () => {
|
|
const v = validator();
|
|
v.should.eql(jet.contextify({}));
|
|
});
|
|
|
|
it('throws if options is not an object', () => {
|
|
try {
|
|
validator('foo');
|
|
return Promise.reject(new Error('Did not throw Error.'));
|
|
} catch (e) {
|
|
e.message.should.containEql("'options' expected an object value");
|
|
return Promise.resolve();
|
|
}
|
|
});
|
|
|
|
describe('requestNonPersonalizedAdsOnly', () => {
|
|
it('throws if requestNonPersonalizedAdsOnly is not a boolean', () => {
|
|
try {
|
|
validator({
|
|
requestNonPersonalizedAdsOnly: 'true',
|
|
});
|
|
return Promise.reject(new Error('Did not throw Error.'));
|
|
} catch (e) {
|
|
e.message.should.containEql(
|
|
"'options.requestNonPersonalizedAdsOnly' expected a boolean value",
|
|
);
|
|
return Promise.resolve();
|
|
}
|
|
});
|
|
|
|
it('accepts requestNonPersonalizedAdsOnly boolean', () => {
|
|
const v = validator({
|
|
requestNonPersonalizedAdsOnly: false,
|
|
});
|
|
v.requestNonPersonalizedAdsOnly.should.eql(false);
|
|
});
|
|
});
|
|
|
|
describe('networkExtras', () => {
|
|
it('throws if networkExtras is not an object', () => {
|
|
try {
|
|
validator({
|
|
networkExtras: ['foo', 'bar'],
|
|
});
|
|
return Promise.reject(new Error('Did not throw Error.'));
|
|
} catch (e) {
|
|
e.message.should.containEql(
|
|
"'options.networkExtras' expected an object of key/value pairs",
|
|
);
|
|
return Promise.resolve();
|
|
}
|
|
});
|
|
|
|
it('throws if networkExtras value is not a string', () => {
|
|
try {
|
|
validator({
|
|
networkExtras: {
|
|
foo: 'bar',
|
|
bar: 123,
|
|
},
|
|
});
|
|
return Promise.reject(new Error('Did not throw Error.'));
|
|
} catch (e) {
|
|
e.message.should.containEql(
|
|
'\'options.networkExtras\' expected a string value for object key "bar"',
|
|
);
|
|
return Promise.resolve();
|
|
}
|
|
});
|
|
|
|
it('accepts networkExtras object', () => {
|
|
const v = validator({
|
|
networkExtras: {
|
|
foo: 'bar',
|
|
bar: 'baz',
|
|
},
|
|
});
|
|
|
|
v.networkExtras.foo.should.eql('bar');
|
|
v.networkExtras.bar.should.eql('baz');
|
|
});
|
|
});
|
|
|
|
describe('keywords', () => {
|
|
it('throws if keywords is not an array', () => {
|
|
try {
|
|
validator({
|
|
keywords: { foo: 'bar' },
|
|
});
|
|
return Promise.reject(new Error('Did not throw Error.'));
|
|
} catch (e) {
|
|
e.message.should.containEql(
|
|
"'options.keywords' expected an array containing string values",
|
|
);
|
|
return Promise.resolve();
|
|
}
|
|
});
|
|
|
|
it('throws if a keyword is not a string', () => {
|
|
try {
|
|
validator({
|
|
keywords: ['foo', 123],
|
|
});
|
|
return Promise.reject(new Error('Did not throw Error.'));
|
|
} catch (e) {
|
|
e.message.should.containEql(
|
|
"'options.keywords' expected an array containing string values",
|
|
);
|
|
return Promise.resolve();
|
|
}
|
|
});
|
|
|
|
it('accepts keywords array', () => {
|
|
const v = validator({
|
|
keywords: ['foo', 'bar'],
|
|
});
|
|
|
|
v.keywords.should.be.Array();
|
|
v.keywords[0].should.eql('foo');
|
|
v.keywords[1].should.eql('bar');
|
|
});
|
|
});
|
|
|
|
describe('testDevices', () => {
|
|
it('throws if testDevices is not an array', () => {
|
|
try {
|
|
validator({
|
|
testDevices: { foo: 'bar' },
|
|
});
|
|
return Promise.reject(new Error('Did not throw Error.'));
|
|
} catch (e) {
|
|
e.message.should.containEql(
|
|
"'options.testDevices' expected an array containing string values",
|
|
);
|
|
return Promise.resolve();
|
|
}
|
|
});
|
|
|
|
it('throws if a testDevices is not a string', () => {
|
|
try {
|
|
validator({
|
|
testDevices: ['foo', 123],
|
|
});
|
|
return Promise.reject(new Error('Did not throw Error.'));
|
|
} catch (e) {
|
|
e.message.should.containEql(
|
|
"'options.testDevices' expected an array containing string values",
|
|
);
|
|
return Promise.resolve();
|
|
}
|
|
});
|
|
|
|
it('accepts testDevices array', () => {
|
|
const v = validator({
|
|
testDevices: ['foo', 'bar'],
|
|
});
|
|
|
|
v.testDevices.should.be.Array();
|
|
v.testDevices[0].should.eql('foo');
|
|
v.testDevices[1].should.eql('bar');
|
|
});
|
|
});
|
|
|
|
describe('contentUrl', () => {
|
|
it('throws if contentUrl is not a string', () => {
|
|
try {
|
|
validator({
|
|
contentUrl: 123,
|
|
});
|
|
return Promise.reject(new Error('Did not throw Error.'));
|
|
} catch (e) {
|
|
e.message.should.containEql("'options.contentUrl' expected a string value");
|
|
return Promise.resolve();
|
|
}
|
|
});
|
|
|
|
it('throws if contentUrl is not a valid url', () => {
|
|
try {
|
|
validator({
|
|
contentUrl: 'www.invertase.io',
|
|
});
|
|
return Promise.reject(new Error('Did not throw Error.'));
|
|
} catch (e) {
|
|
e.message.should.containEql("'options.contentUrl' expected a valid HTTP or HTTPS url");
|
|
return Promise.resolve();
|
|
}
|
|
});
|
|
|
|
it('throws if contentUrl is too long', () => {
|
|
let str = '';
|
|
for (let i = 0; i < 530; i++) {
|
|
str += i.toString();
|
|
}
|
|
|
|
try {
|
|
validator({
|
|
contentUrl: `https://invertase.io?${str}`,
|
|
});
|
|
return Promise.reject(new Error('Did not throw Error.'));
|
|
} catch (e) {
|
|
e.message.should.containEql(
|
|
"'options.contentUrl' maximum length of a content URL is 512 characters",
|
|
);
|
|
return Promise.resolve();
|
|
}
|
|
});
|
|
|
|
it('accepts a contentUrl', () => {
|
|
const v = validator({
|
|
contentUrl: 'http://invertase.io/privacy-policy',
|
|
});
|
|
|
|
v.contentUrl.should.be.eql('http://invertase.io/privacy-policy');
|
|
});
|
|
});
|
|
|
|
describe('location', () => {
|
|
it('throws if not an array', () => {
|
|
try {
|
|
validator({
|
|
location: 'United Kingdom',
|
|
});
|
|
return Promise.reject(new Error('Did not throw Error.'));
|
|
} catch (e) {
|
|
e.message.should.containEql(
|
|
"'options.location' expected an array value containing a latitude & longitude number value",
|
|
);
|
|
return Promise.resolve();
|
|
}
|
|
});
|
|
|
|
it('throws if latitude not a number', () => {
|
|
try {
|
|
validator({
|
|
location: ['123', 123],
|
|
});
|
|
return Promise.reject(new Error('Did not throw Error.'));
|
|
} catch (e) {
|
|
e.message.should.containEql(
|
|
"'options.location' expected an array value containing a latitude & longitude number value",
|
|
);
|
|
return Promise.resolve();
|
|
}
|
|
});
|
|
|
|
it('throws if latitude is invalid', () => {
|
|
try {
|
|
validator({
|
|
location: [-100, 100],
|
|
});
|
|
return Promise.reject(new Error('Did not throw Error.'));
|
|
} catch (e) {
|
|
e.message.should.containEql(
|
|
"'options.location' latitude value must be a number between -90 and 90",
|
|
);
|
|
return Promise.resolve();
|
|
}
|
|
});
|
|
|
|
it('throws if longitude not a number', () => {
|
|
try {
|
|
validator({
|
|
location: [10, '123'],
|
|
});
|
|
return Promise.reject(new Error('Did not throw Error.'));
|
|
} catch (e) {
|
|
e.message.should.containEql(
|
|
"'options.location' expected an array value containing a latitude & longitude number value",
|
|
);
|
|
return Promise.resolve();
|
|
}
|
|
});
|
|
|
|
it('throws if longitude is invalid', () => {
|
|
try {
|
|
validator({
|
|
location: [50, 200],
|
|
});
|
|
return Promise.reject(new Error('Did not throw Error.'));
|
|
} catch (e) {
|
|
e.message.should.containEql(
|
|
"'options.location' longitude value must be a number between -180 and 180",
|
|
);
|
|
return Promise.resolve();
|
|
}
|
|
});
|
|
|
|
it('accepts a latitude and longitude', () => {
|
|
const v = validator({
|
|
location: [10, 20],
|
|
});
|
|
|
|
v.location.should.be.Array();
|
|
v.location[0].should.be.eql(10);
|
|
v.location[1].should.be.eql(20);
|
|
});
|
|
});
|
|
|
|
describe('locationAccuracy', () => {
|
|
it('throws if not a number', () => {
|
|
try {
|
|
validator({
|
|
locationAccuracy: '10',
|
|
});
|
|
return Promise.reject(new Error('Did not throw Error.'));
|
|
} catch (e) {
|
|
e.message.should.containEql("'options.locationAccuracy' expected a number value");
|
|
return Promise.resolve();
|
|
}
|
|
});
|
|
|
|
it('throws if less than 0', () => {
|
|
try {
|
|
validator({
|
|
locationAccuracy: -1,
|
|
});
|
|
return Promise.reject(new Error('Did not throw Error.'));
|
|
} catch (e) {
|
|
e.message.should.containEql("'options.locationAccuracy' expected a number greater than 0");
|
|
return Promise.resolve();
|
|
}
|
|
});
|
|
|
|
it('accepts locationAccuracy', () => {
|
|
const v = validator({
|
|
locationAccuracy: 10.5,
|
|
});
|
|
v.locationAccuracy.should.eql(10.5);
|
|
});
|
|
|
|
it('uses a defaultValue', () => {
|
|
const v = validator({});
|
|
v.locationAccuracy.should.eql(5);
|
|
});
|
|
});
|
|
|
|
describe('requestAgent', () => {
|
|
it('throws if not a string', () => {
|
|
try {
|
|
validator({
|
|
requestAgent: 1,
|
|
});
|
|
return Promise.reject(new Error('Did not throw Error.'));
|
|
} catch (e) {
|
|
e.message.should.containEql("'options.requestAgent' expected a string value");
|
|
return Promise.resolve();
|
|
}
|
|
});
|
|
|
|
it('accepts a requestAgent', () => {
|
|
const v = validator({
|
|
requestAgent: 'CoolAds',
|
|
});
|
|
v.requestAgent.should.eql('CoolAds');
|
|
});
|
|
});
|
|
});
|