Skip to content

Commit dffbe8d

Browse files
committed
Add tests, fix types
1 parent 2e65846 commit dffbe8d

File tree

7 files changed

+329
-9
lines changed

7 files changed

+329
-9
lines changed

packages/app-types/index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ export interface FirebaseNamespace {
110110
setLogLevel(logLevel: LogLevelString): void;
111111

112112
// Sets log handler for all Firebase components.
113-
onLog(logCallback: LogCallback, options: LogOptions): void;
113+
onLog(logCallback: LogCallback, options?: LogOptions): void;
114114

115115
// The current SDK version.
116116
SDK_VERSION: string;
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
/**
2+
* @license
3+
* Copyright 2017 Google Inc.
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
import { FirebaseNamespace, VersionService } from '@firebase/app-types';
19+
import { _FirebaseApp, _FirebaseNamespace } from '@firebase/app-types/private';
20+
import { createFirebaseNamespace } from '../src/firebaseNamespace';
21+
import { expect } from 'chai';
22+
import { spy as Spy } from 'sinon';
23+
import './setup';
24+
import { Logger } from '@firebase/logger';
25+
import { registerCoreComponents } from '../src/registerCoreComponents';
26+
import {
27+
Component,
28+
ComponentType,
29+
ComponentContainer
30+
} from '@firebase/component';
31+
32+
declare module '@firebase/component' {
33+
interface NameServiceMapping {
34+
'vs1': VersionService;
35+
'vs2': VersionService;
36+
'test-shell': Promise<void>;
37+
}
38+
}
39+
40+
describe('User Log Methods', () => {
41+
describe('Integration Tests', () => {
42+
let firebase: FirebaseNamespace;
43+
let result: any = null;
44+
let warnSpy = Spy(console, 'warn');
45+
let infoSpy = Spy(console, 'info');
46+
let logSpy = Spy(console, 'log');
47+
48+
beforeEach(() => {
49+
firebase = createFirebaseNamespace();
50+
});
51+
52+
it(`respects log level set through firebase.setLogLevel()`, () => {
53+
firebase.initializeApp({});
54+
registerCoreComponents(firebase);
55+
(firebase as _FirebaseNamespace).INTERNAL.registerComponent(
56+
new Component(
57+
'test-shell',
58+
async (container: ComponentContainer) => {
59+
60+
const logger = new Logger('@firebase/logger-test');
61+
logger.warn('hello');
62+
expect(warnSpy.called).to.be.true;
63+
(firebase as _FirebaseNamespace).setLogLevel('warn');
64+
logger.info('hi');
65+
expect(infoSpy.called).to.be.false;
66+
logger.log('hi');
67+
expect(logSpy.called).to.be.false;
68+
logSpy.resetHistory();
69+
infoSpy.resetHistory();
70+
(firebase as _FirebaseNamespace).setLogLevel('debug');
71+
logger.info('hi');
72+
expect(infoSpy.called).to.be.true;
73+
logger.log('hi');
74+
expect(logSpy.called).to.be.true;
75+
},
76+
ComponentType.PUBLIC
77+
)
78+
);
79+
return (firebase as any)['test-shell']();
80+
});
81+
82+
it(`correctly triggers callback given to firebase.onLog()`, () => {
83+
firebase.initializeApp({});
84+
registerCoreComponents(firebase);
85+
(firebase as _FirebaseNamespace).INTERNAL.registerComponent(
86+
new Component(
87+
'test-shell',
88+
async (container: ComponentContainer) => {
89+
90+
const logger = new Logger('@firebase/logger-test');
91+
(firebase as _FirebaseNamespace).onLog((logData) => {
92+
result = logData;
93+
});
94+
logger.info('hi');
95+
expect(result.level).to.equal('info');
96+
expect(result.message).to.equal('hi');
97+
expect(infoSpy.called).to.be.true;
98+
},
99+
ComponentType.PUBLIC
100+
)
101+
);
102+
return (firebase as any)['test-shell']();
103+
});
104+
});
105+
});

packages/firebase/index.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ declare namespace firebase {
138138
*/
139139
type: string;
140140
}) => void,
141-
options: {
141+
options?: {
142142
/**
143143
* Threshhold log level. Only logs at or above this level will trigger the `logCallback`
144144
* passed to `onLog`.

packages/logger/karma.conf.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,14 @@
1515
* limitations under the License.
1616
*/
1717

18-
const karma = require('karma');
19-
const path = require('path');
2018
const karmaBase = require('../../config/karma.base');
2119

2220
const files = [`test/**/*`];
2321

2422
module.exports = function(config) {
2523
const karmaConfig = Object.assign({}, karmaBase, {
2624
// files to load into karma
27-
files: files,
25+
files,
2826
// frameworks to use
2927
// available frameworks: https://npmjs.org/browse/keyword/karma-adapter
3028
frameworks: ['mocha']

packages/logger/src/logger.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,12 +27,14 @@ export interface LogOptions {
2727
level: LogLevelString;
2828
}
2929

30-
export type LogCallback = (callbackParams: {
30+
export type LogCallback = (callbackParams: LogCallbackParams) => void;
31+
32+
export interface LogCallbackParams {
3133
level: LogLevelString;
3234
message: string;
3335
args: unknown[];
3436
type: string;
35-
}) => void;
37+
};
3638

3739
/**
3840
* A container for all of the Logger instances
@@ -211,7 +213,7 @@ export function setLogLevel(level: LogLevelString | LogLevel): void {
211213

212214
export function setUserLogHandler(
213215
logCallback: LogCallback | null,
214-
options: LogOptions
216+
options?: LogOptions
215217
): void {
216218
if (logCallback !== null && typeof logCallback !== 'function') {
217219
throw new TypeError(
Lines changed: 204 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,204 @@
1+
/**
2+
* @license
3+
* Copyright 2018 Google Inc.
4+
*
5+
* Licensed under the Apache License, Version 2.0 (the "License");
6+
* you may not use this file except in compliance with the License.
7+
* You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
import { expect } from 'chai';
19+
import { spy } from 'sinon';
20+
import { Logger, setLogLevel } from '../src/logger';
21+
import { setUserLogHandler } from '../index';
22+
23+
describe(`Custom log handler`, () => {
24+
const client1 = new Logger('@firebase/test-logger');
25+
const client2 = new Logger('@firebase/other-logger');
26+
let result: any;
27+
let spies: any = {};
28+
29+
describe('Callback log level set to INFO (default)', () => {
30+
before(() => {
31+
setUserLogHandler((callbackParams) => {
32+
result = callbackParams;
33+
});
34+
});
35+
36+
beforeEach(() => {
37+
result = null;
38+
spies = {
39+
logSpy: spy(console, 'log'),
40+
infoSpy: spy(console, 'info'),
41+
warnSpy: spy(console, 'warn'),
42+
errorSpy: spy(console, 'error')
43+
};
44+
});
45+
46+
afterEach(() => {
47+
spies.logSpy.restore();
48+
spies.infoSpy.restore();
49+
spies.warnSpy.restore();
50+
spies.errorSpy.restore();
51+
});
52+
53+
it('calls custom callback with correct data for calling instance', () => {
54+
client1.info('info message!');
55+
expect(result.message).to.equal('info message!');
56+
expect(result.args[0]).to.equal('info message!');
57+
expect(result.level).to.equal('info');
58+
expect(result.type).to.equal('@firebase/test-logger');
59+
expect(spies.infoSpy.called).to.be.true;
60+
spies.infoSpy.resetHistory();
61+
client2.info('another info message!');
62+
expect(result.message).to.equal('another info message!');
63+
expect(result.args[0]).to.equal('another info message!');
64+
expect(result.level).to.equal('info');
65+
expect(result.type).to.equal('@firebase/other-logger');
66+
expect(spies.infoSpy.called).to.be.true;
67+
});
68+
69+
it('parses multiple arguments correctly', () => {
70+
client1.info('info message!', ['hello'], 1, { a: 3 });
71+
expect(result.message).to.equal('info message! ["hello"] 1 {"a":3}');
72+
expect(result.args).to.deep.equal(['info message!', ['hello'], 1, { a: 3 }]);
73+
expect(result.level).to.equal('info');
74+
expect(result.type).to.equal('@firebase/test-logger');
75+
});
76+
77+
it('calls custom callback when log call is above set log level', () => {
78+
// Info was already tested above.
79+
client1.warn('warning message!');
80+
expect(result.message).to.equal('warning message!');
81+
expect(result.level).to.equal('warn');
82+
expect(spies.warnSpy.called).to.be.true;
83+
client1.error('error message!');
84+
expect(result.message).to.equal('error message!');
85+
expect(result.level).to.equal('error');
86+
expect(spies.errorSpy.called).to.be.true;
87+
});
88+
89+
it('does not call custom callback when log call is not above set log level', () => {
90+
client1.log('message you should not see');
91+
expect(result).to.be.null;
92+
expect(spies.logSpy.called).to.be.false;
93+
client1.debug('message you should not see');
94+
expect(result).to.be.null;
95+
expect(spies.logSpy.called).to.be.false;
96+
});
97+
});
98+
99+
describe('Callback log level set to WARN with options', () => {
100+
before(() => {
101+
setUserLogHandler((callbackParams) => {
102+
result = callbackParams;
103+
}, { level: 'warn' });
104+
});
105+
106+
beforeEach(() => {
107+
result = null;
108+
spies = {
109+
logSpy: spy(console, 'log'),
110+
infoSpy: spy(console, 'info'),
111+
warnSpy: spy(console, 'warn'),
112+
errorSpy: spy(console, 'error')
113+
};
114+
});
115+
116+
afterEach(() => {
117+
spies.logSpy.restore();
118+
spies.infoSpy.restore();
119+
spies.warnSpy.restore();
120+
spies.errorSpy.restore();
121+
});
122+
123+
it('calls custom callback when log call is above set log level', () => {
124+
client1.warn('warning message!');
125+
expect(result.message).to.equal('warning message!');
126+
expect(result.args[0]).to.equal('warning message!');
127+
expect(result.level).to.equal('warn');
128+
expect(result.type).to.equal('@firebase/test-logger');
129+
expect(spies.warnSpy.called).to.be.true;
130+
client1.error('error message!');
131+
expect(result.message).to.equal('error message!');
132+
expect(result.level).to.equal('error');
133+
expect(spies.errorSpy.called).to.be.true;
134+
});
135+
136+
it('does not call custom callback when log call is not above set log level', () => {
137+
client1.debug('message you should not see');
138+
expect(result).to.be.null;
139+
expect(spies.logSpy.called).to.be.false;
140+
client1.log('message you should not see');
141+
expect(result).to.be.null;
142+
expect(spies.logSpy.called).to.be.false;
143+
client1.info('message you should not see');
144+
expect(result).to.be.null;
145+
});
146+
147+
it('logLevel set in setUserLogHandler should not affect internal logging level', () => {
148+
client1.info('message you should not see');
149+
expect(result).to.be.null;
150+
expect(spies.infoSpy.called).to.be.true;
151+
});
152+
});
153+
154+
describe('Global log level set to VERBOSE with setLogLevel()', () => {
155+
before(() => {
156+
setLogLevel('verbose');
157+
setUserLogHandler((callbackParams) => {
158+
result = callbackParams;
159+
});
160+
});
161+
162+
beforeEach(() => {
163+
result = null;
164+
spies = {
165+
logSpy: spy(console, 'log'),
166+
infoSpy: spy(console, 'info'),
167+
warnSpy: spy(console, 'warn'),
168+
errorSpy: spy(console, 'error')
169+
};
170+
});
171+
172+
afterEach(() => {
173+
spies.logSpy.restore();
174+
spies.infoSpy.restore();
175+
spies.warnSpy.restore();
176+
spies.errorSpy.restore();
177+
});
178+
179+
it('calls custom callback when log call is above set log level', () => {
180+
client1.log('log message!');
181+
expect(result.message).to.equal('log message!');
182+
expect(result.level).to.equal('verbose');
183+
expect(spies.logSpy.called).to.be.true;
184+
client1.info('info message!');
185+
expect(result.message).to.equal('info message!');
186+
expect(result.level).to.equal('info');
187+
expect(spies.infoSpy.called).to.be.true;
188+
client1.warn('warning message!');
189+
expect(result.message).to.equal('warning message!');
190+
expect(result.level).to.equal('warn');
191+
expect(spies.warnSpy.called).to.be.true;
192+
client1.error('error message!');
193+
expect(result.message).to.equal('error message!');
194+
expect(result.level).to.equal('error');
195+
expect(spies.errorSpy.called).to.be.true;
196+
});
197+
198+
it('does not call custom callback when log call is not above set log level', () => {
199+
client1.debug('message you should not see');
200+
expect(result).to.be.null;
201+
expect(spies.logSpy.called).to.be.false;
202+
});
203+
});
204+
});

packages/logger/test/logger.test.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,18 @@ describe('@firebase/logger', () => {
7777
testLog(message, 'error', true);
7878
});
7979

80-
describe('Defaults to LogLevel.NOTICE', () => {
80+
describe('Can set log level with string', () => {
81+
beforeEach(() => {
82+
setLogLevel('warn');
83+
});
84+
testLog(message, 'debug', false);
85+
testLog(message, 'log', false);
86+
testLog(message, 'info', false);
87+
testLog(message, 'warn', true);
88+
testLog(message, 'error', true);
89+
});
90+
91+
describe('Defaults to LogLevel.INFO', () => {
8192
testLog(message, 'debug', false);
8293
testLog(message, 'log', false);
8394
testLog(message, 'info', true);

0 commit comments

Comments
 (0)