mirror of
https://github.com/zebrajr/react.git
synced 2025-12-07 00:20:28 +01:00
Shortcut for the common case where only a single flag is checked. Same as `gate(flags => flags.enableFeatureFlag)`. Normally I don't care about these types of conveniences but I'm about to add a lot more inline flag checks these all over our tests and it gets noisy. This helps a bit.
229 lines
5.4 KiB
JavaScript
229 lines
5.4 KiB
JavaScript
/**
|
|
* Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
*
|
|
* This source code is licensed under the MIT license found in the
|
|
* LICENSE file in the root directory of this source tree.
|
|
*/
|
|
'use strict';
|
|
|
|
describe('transform-test-gate-pragma', () => {
|
|
// Fake runtime
|
|
// eslint-disable-next-line no-unused-vars
|
|
const _test_gate = (gateFn, testName, cb) => {
|
|
// eslint-disable-next-line jest/no-done-callback, jest/valid-title
|
|
it(testName, (...args) => {
|
|
shouldPass = gateFn(context);
|
|
return cb(...args);
|
|
});
|
|
};
|
|
|
|
// eslint-disable-next-line no-unused-vars
|
|
const _test_gate_focus = (gateFn, testName, cb) => {
|
|
// NOTE: Tests in this file are not actually focused because the calls to
|
|
// `test.only` and `fit` are compiled to `_test_gate_focus`. So if you want
|
|
// to focus something, swap the following `test` call for `test.only`.
|
|
// eslint-disable-next-line jest/no-done-callback, jest/valid-title
|
|
it(testName, (...args) => {
|
|
shouldPass = gateFn(context);
|
|
isFocused = true;
|
|
return cb(...args);
|
|
});
|
|
};
|
|
|
|
// Feature flags, environment variables, etc. We can configure this in
|
|
// our test set up.
|
|
const context = {
|
|
flagThatIsOff: false,
|
|
flagThatIsOn: true,
|
|
environment: 'fake-environment',
|
|
};
|
|
|
|
let shouldPass;
|
|
let isFocused;
|
|
beforeEach(() => {
|
|
shouldPass = null;
|
|
isFocused = false;
|
|
});
|
|
|
|
it('no pragma', () => {
|
|
expect(shouldPass).toBe(null);
|
|
});
|
|
|
|
// unrelated comment
|
|
it('no pragma, unrelated comment', () => {
|
|
expect(shouldPass).toBe(null);
|
|
});
|
|
|
|
// @gate flagThatIsOn
|
|
it('basic positive test', () => {
|
|
expect(shouldPass).toBe(true);
|
|
});
|
|
|
|
// @gate flagThatIsOff
|
|
it('basic negative test', () => {
|
|
expect(shouldPass).toBe(false);
|
|
});
|
|
|
|
// @gate flagThatIsOn
|
|
it('method', () => {
|
|
expect(shouldPass).toBe(true);
|
|
});
|
|
|
|
/* eslint-disable jest/no-focused-tests */
|
|
|
|
// @gate flagThatIsOn
|
|
it.only('test.only', () => {
|
|
expect(isFocused).toBe(true);
|
|
expect(shouldPass).toBe(true);
|
|
});
|
|
|
|
// @gate flagThatIsOff
|
|
it.only('it.only', () => {
|
|
expect(isFocused).toBe(true);
|
|
expect(shouldPass).toBe(false);
|
|
});
|
|
|
|
// @gate flagThatIsOn
|
|
it.only('fit', () => {
|
|
expect(isFocused).toBe(true);
|
|
expect(shouldPass).toBe(true);
|
|
});
|
|
|
|
/* eslint-enable jest/no-focused-tests */
|
|
|
|
// @gate !flagThatIsOff
|
|
it('flag negation', () => {
|
|
expect(shouldPass).toBe(true);
|
|
});
|
|
|
|
// @gate flagThatIsOn
|
|
// @gate !flagThatIsOff
|
|
it('multiple gates', () => {
|
|
expect(shouldPass).toBe(true);
|
|
});
|
|
|
|
// @gate flagThatIsOn
|
|
// @gate flagThatIsOff
|
|
it('multiple gates 2', () => {
|
|
expect(shouldPass).toBe(false);
|
|
});
|
|
|
|
// @gate !flagThatIsOff && flagThatIsOn
|
|
it('&&', () => {
|
|
expect(shouldPass).toBe(true);
|
|
});
|
|
|
|
// @gate flagThatIsOff || flagThatIsOn
|
|
it('||', () => {
|
|
expect(shouldPass).toBe(true);
|
|
});
|
|
|
|
// @gate (flagThatIsOn || flagThatIsOff) && flagThatIsOn
|
|
it('groups', () => {
|
|
expect(shouldPass).toBe(true);
|
|
});
|
|
|
|
// @gate flagThatIsOn == !flagThatIsOff
|
|
it('==', () => {
|
|
expect(shouldPass).toBe(true);
|
|
});
|
|
|
|
// @gate flagThatIsOn === !flagThatIsOff
|
|
it('===', () => {
|
|
expect(shouldPass).toBe(true);
|
|
});
|
|
|
|
// @gate flagThatIsOn != !flagThatIsOff
|
|
it('!=', () => {
|
|
expect(shouldPass).toBe(false);
|
|
});
|
|
|
|
// @gate flagThatIsOn != !flagThatIsOff
|
|
it('!==', () => {
|
|
expect(shouldPass).toBe(false);
|
|
});
|
|
|
|
// @gate flagThatIsOn === true
|
|
it('true', () => {
|
|
expect(shouldPass).toBe(true);
|
|
});
|
|
|
|
// @gate flagThatIsOff === false
|
|
it('false', () => {
|
|
expect(shouldPass).toBe(true);
|
|
});
|
|
|
|
// @gate environment === "fake-environment"
|
|
it('double quoted strings', () => {
|
|
expect(shouldPass).toBe(true);
|
|
});
|
|
|
|
// @gate environment === 'fake-environment'
|
|
it('single quoted strings', () => {
|
|
expect(shouldPass).toBe(true);
|
|
});
|
|
|
|
// @gate flagThatIsOn // This is a comment
|
|
it('line comment', () => {
|
|
expect(shouldPass).toBe(true);
|
|
});
|
|
});
|
|
|
|
describe('transform test-gate-pragma: actual runtime', () => {
|
|
// These tests use the actual gating runtime used by the rest of our
|
|
// test suite.
|
|
|
|
// @gate __DEV__
|
|
it('__DEV__', () => {
|
|
if (!__DEV__) {
|
|
throw Error("Doesn't work in production!");
|
|
}
|
|
});
|
|
|
|
// @gate build === "development"
|
|
it('strings', () => {
|
|
if (!__DEV__) {
|
|
throw Error("Doesn't work in production!");
|
|
}
|
|
});
|
|
|
|
// Always should fail because of the unguarded console.error
|
|
// @gate false
|
|
it('works with console.error tracking', () => {
|
|
console.error('Should cause test to fail');
|
|
});
|
|
|
|
// Always should fail because of the unguarded console.warn
|
|
// @gate false
|
|
it('works with console.warn tracking', () => {
|
|
console.warn('Should cause test to fail');
|
|
});
|
|
|
|
// @gate false
|
|
it('works with console tracking if error is thrown before end of test', () => {
|
|
console.warn('Please stop that!');
|
|
console.error('Stop that!');
|
|
throw Error('I told you to stop!');
|
|
});
|
|
|
|
// @gate false
|
|
it('a global error event is treated as a test failure', () => {
|
|
dispatchEvent(
|
|
new ErrorEvent('error', {
|
|
error: new Error('Oops!'),
|
|
})
|
|
);
|
|
});
|
|
});
|
|
|
|
describe('dynamic gate method', () => {
|
|
// @gate experimental && __DEV__
|
|
it('returns same conditions as pragma', () => {
|
|
expect(gate(ctx => ctx.experimental && ctx.__DEV__)).toBe(true);
|
|
});
|
|
|
|
it('converts string conditions to accessor function', () => {
|
|
expect(gate('experimental')).toBe(gate(flags => flags.experimental));
|
|
});
|
|
});
|