2021-12-14 19:50:52 +00:00
"use strict" ;
2022-11-21 11:14:38 -08:00
var _ _createBinding = ( this && this . _ _createBinding ) || ( Object . create ? ( function ( o , m , k , k2 ) {
if ( k2 === undefined ) k2 = k ;
2023-01-18 20:00:33 +00:00
var desc = Object . getOwnPropertyDescriptor ( m , k ) ;
if ( ! desc || ( "get" in desc ? ! m . _ _esModule : desc . writable || desc . configurable ) ) {
desc = { enumerable : true , get : function ( ) { return m [ k ] ; } } ;
}
Object . defineProperty ( o , k2 , desc ) ;
2022-11-21 11:14:38 -08:00
} ) : ( function ( o , m , k , k2 ) {
if ( k2 === undefined ) k2 = k ;
o [ k2 ] = m [ k ] ;
} ) ) ;
var _ _setModuleDefault = ( this && this . _ _setModuleDefault ) || ( Object . create ? ( function ( o , v ) {
Object . defineProperty ( o , "default" , { enumerable : true , value : v } ) ;
} ) : function ( o , v ) {
o [ "default" ] = v ;
} ) ;
var _ _importStar = ( this && this . _ _importStar ) || function ( mod ) {
if ( mod && mod . _ _esModule ) return mod ;
var result = { } ;
if ( mod != null ) for ( var k in mod ) if ( k !== "default" && Object . prototype . hasOwnProperty . call ( mod , k ) ) _ _createBinding ( result , mod , k ) ;
_ _setModuleDefault ( result , mod ) ;
return result ;
} ;
2021-12-14 19:50:52 +00:00
var _ _importDefault = ( this && this . _ _importDefault ) || function ( mod ) {
return ( mod && mod . _ _esModule ) ? mod : { "default" : mod } ;
} ;
Object . defineProperty ( exports , "__esModule" , { value : true } ) ;
2022-11-21 11:14:38 -08:00
const fs = _ _importStar ( require ( "fs" ) ) ;
const path = _ _importStar ( require ( "path" ) ) ;
2021-12-14 19:50:52 +00:00
const ava _1 = _ _importDefault ( require ( "ava" ) ) ;
2023-01-12 15:46:12 +00:00
const defaults = _ _importStar ( require ( "./defaults.json" ) ) ;
2021-12-14 19:50:52 +00:00
const feature _flags _1 = require ( "./feature-flags" ) ;
2021-12-15 16:29:34 +00:00
const logging _1 = require ( "./logging" ) ;
2021-12-15 17:03:43 +00:00
const repository _1 = require ( "./repository" ) ;
2021-12-14 19:50:52 +00:00
const testing _utils _1 = require ( "./testing-utils" ) ;
const util _1 = require ( "./util" ) ;
( 0 , testing _utils _1 . setupTests ) ( ava _1 . default ) ;
ava _1 . default . beforeEach ( ( ) => {
2022-11-14 16:37:48 +00:00
( 0 , util _1 . initializeEnvironment ) ( "1.2.3" ) ;
2021-12-14 19:50:52 +00:00
} ) ;
2021-12-15 17:03:43 +00:00
const testRepositoryNwo = ( 0 , repository _1 . parseRepositoryNwo ) ( "github/example" ) ;
2022-10-11 18:56:15 +01:00
const ALL _FEATURES _DISABLED _VARIANTS = [
2021-12-14 19:50:52 +00:00
{
description : "GHES" ,
gitHubVersion : { type : util _1 . GitHubVariant . GHES , version : "3.0.0" } ,
} ,
{ description : "GHAE" , gitHubVersion : { type : util _1 . GitHubVariant . GHAE } } ,
] ;
2022-10-11 18:56:15 +01:00
for ( const variant of ALL _FEATURES _DISABLED _VARIANTS ) {
( 0 , ava _1 . default ) ( ` All features are disabled if running against ${ variant . description } ` , async ( t ) => {
2021-12-14 19:50:52 +00:00
await ( 0 , util _1 . withTmpDir ) ( async ( tmpDir ) => {
const loggedMessages = [ ] ;
2023-03-09 16:46:51 +00:00
const features = setUpFeatureFlagTests ( tmpDir , ( 0 , testing _utils _1 . getRecordingLogger ) ( loggedMessages ) , variant . gitHubVersion ) ;
2022-10-11 18:56:15 +01:00
for ( const feature of Object . values ( feature _flags _1 . Feature ) ) {
2023-03-09 18:47:43 +00:00
t . deepEqual ( await features . getValue ( feature , includeCodeQlIfRequired ( feature ) ) , feature _flags _1 . featureConfig [ feature ] . defaultValue ) ;
2021-12-16 13:14:32 +00:00
}
2021-12-14 19:50:52 +00:00
t . assert ( loggedMessages . find ( ( v ) => v . type === "debug" &&
v . message ===
2022-10-07 13:41:50 -07:00
"Not running against github.com. Disabling all toggleable features." ) !== undefined ) ;
2021-12-14 19:50:52 +00:00
} ) ;
} ) ;
}
2023-03-07 16:24:55 -08:00
( 0 , ava _1 . default ) ( "API response missing and features use default value" , async ( t ) => {
2022-07-18 10:37:04 +00:00
await ( 0 , util _1 . withTmpDir ) ( async ( tmpDir ) => {
const loggedMessages = [ ] ;
2023-03-09 16:46:51 +00:00
const features = setUpFeatureFlagTests ( tmpDir , ( 0 , testing _utils _1 . getRecordingLogger ) ( loggedMessages ) ) ;
2022-07-18 10:37:04 +00:00
( 0 , testing _utils _1 . mockFeatureFlagApiEndpoint ) ( 403 , { } ) ;
2022-10-11 18:56:15 +01:00
for ( const feature of Object . values ( feature _flags _1 . Feature ) ) {
2023-03-09 16:46:51 +00:00
t . assert ( ( await features . getValue ( feature , includeCodeQlIfRequired ( feature ) ) ) ===
2023-03-09 18:47:43 +00:00
feature _flags _1 . featureConfig [ feature ] . defaultValue ) ;
2022-07-18 10:37:04 +00:00
}
2022-10-06 12:29:58 -07:00
assertAllFeaturesUndefinedInApi ( t , loggedMessages ) ;
2022-07-18 10:37:04 +00:00
} ) ;
} ) ;
2023-03-07 16:24:55 -08:00
( 0 , ava _1 . default ) ( "Features use default value if they're not returned in API response" , async ( t ) => {
2021-12-14 19:50:52 +00:00
await ( 0 , util _1 . withTmpDir ) ( async ( tmpDir ) => {
const loggedMessages = [ ] ;
2023-03-09 16:46:51 +00:00
const features = setUpFeatureFlagTests ( tmpDir , ( 0 , testing _utils _1 . getRecordingLogger ) ( loggedMessages ) ) ;
2021-12-16 13:30:31 +00:00
( 0 , testing _utils _1 . mockFeatureFlagApiEndpoint ) ( 200 , { } ) ;
2022-10-11 18:56:15 +01:00
for ( const feature of Object . values ( feature _flags _1 . Feature ) ) {
2023-03-09 16:46:51 +00:00
t . assert ( ( await features . getValue ( feature , includeCodeQlIfRequired ( feature ) ) ) ===
2023-03-09 18:47:43 +00:00
feature _flags _1 . featureConfig [ feature ] . defaultValue ) ;
2021-12-14 19:50:52 +00:00
}
2022-10-06 12:29:58 -07:00
assertAllFeaturesUndefinedInApi ( t , loggedMessages ) ;
2021-12-14 19:50:52 +00:00
} ) ;
} ) ;
2021-12-15 16:29:34 +00:00
( 0 , ava _1 . default ) ( "Feature flags exception is propagated if the API request errors" , async ( t ) => {
2021-12-14 19:50:52 +00:00
await ( 0 , util _1 . withTmpDir ) ( async ( tmpDir ) => {
2023-03-09 16:46:51 +00:00
const features = setUpFeatureFlagTests ( tmpDir ) ;
2021-12-16 13:30:31 +00:00
( 0 , testing _utils _1 . mockFeatureFlagApiEndpoint ) ( 500 , { } ) ;
2023-10-02 17:20:50 +01:00
const someFeature = Object . values ( feature _flags _1 . Feature ) [ 0 ] ;
await t . throwsAsync ( async ( ) => features . getValue ( someFeature , includeCodeQlIfRequired ( someFeature ) ) , {
2022-10-07 13:41:50 -07:00
message : "Encountered an error while trying to determine feature enablement: Error: some error message" ,
2021-12-15 16:29:34 +00:00
} ) ;
2021-12-14 19:50:52 +00:00
} ) ;
} ) ;
2022-10-11 10:39:40 -07:00
for ( const feature of Object . keys ( feature _flags _1 . featureConfig ) ) {
2022-10-11 18:56:15 +01:00
( 0 , ava _1 . default ) ( ` Only feature ' ${ feature } ' is enabled if enabled in the API response. Other features disabled ` , async ( t ) => {
2021-12-14 19:50:52 +00:00
await ( 0 , util _1 . withTmpDir ) ( async ( tmpDir ) => {
2023-03-09 16:46:51 +00:00
const features = setUpFeatureFlagTests ( tmpDir ) ;
2022-10-11 18:56:15 +01:00
// set all features to false except the one we're testing
2022-10-11 10:39:40 -07:00
const expectedFeatureEnablement = { } ;
2022-10-06 12:31:08 -07:00
for ( const f of Object . keys ( feature _flags _1 . featureConfig ) ) {
2022-10-11 10:39:40 -07:00
expectedFeatureEnablement [ f ] = f === feature ;
2021-12-14 19:50:52 +00:00
}
2022-10-11 10:39:40 -07:00
( 0 , testing _utils _1 . mockFeatureFlagApiEndpoint ) ( 200 , expectedFeatureEnablement ) ;
2022-10-11 18:56:15 +01:00
// retrieve the values of the actual features
2022-10-11 10:39:40 -07:00
const actualFeatureEnablement = { } ;
2022-10-06 12:31:08 -07:00
for ( const f of Object . keys ( feature _flags _1 . featureConfig ) ) {
2023-03-09 16:46:51 +00:00
actualFeatureEnablement [ f ] = await features . getValue ( f , includeCodeQlIfRequired ( f ) ) ;
2022-10-05 15:54:07 -07:00
}
2022-10-11 18:56:15 +01:00
// All features should be false except the one we're testing
2022-10-11 10:39:40 -07:00
t . deepEqual ( actualFeatureEnablement , expectedFeatureEnablement ) ;
2021-12-14 19:50:52 +00:00
} ) ;
} ) ;
2022-10-11 18:56:15 +01:00
( 0 , ava _1 . default ) ( ` Only feature ' ${ feature } ' is enabled if the associated environment variable is true. Others disabled. ` , async ( t ) => {
2022-10-05 15:54:07 -07:00
await ( 0 , util _1 . withTmpDir ) ( async ( tmpDir ) => {
2023-03-09 16:46:51 +00:00
const features = setUpFeatureFlagTests ( tmpDir ) ;
2022-10-11 10:39:40 -07:00
const expectedFeatureEnablement = initializeFeatures ( false ) ;
( 0 , testing _utils _1 . mockFeatureFlagApiEndpoint ) ( 200 , expectedFeatureEnablement ) ;
2022-10-11 18:56:15 +01:00
// feature should be disabled initially
2023-03-09 16:46:51 +00:00
t . assert ( ! ( await features . getValue ( feature , includeCodeQlIfRequired ( feature ) ) ) ) ;
2022-10-11 18:56:15 +01:00
// set env var to true and check that the feature is now enabled
2022-10-11 10:39:40 -07:00
process . env [ feature _flags _1 . featureConfig [ feature ] . envVar ] = "true" ;
2023-03-09 16:46:51 +00:00
t . assert ( await features . getValue ( feature , includeCodeQlIfRequired ( feature ) ) ) ;
2022-10-05 15:54:07 -07:00
} ) ;
} ) ;
2022-10-11 18:56:15 +01:00
( 0 , ava _1 . default ) ( ` Feature ' ${ feature } ' is disabled if the associated environment variable is false, even if enabled in API ` , async ( t ) => {
2022-10-05 15:54:07 -07:00
await ( 0 , util _1 . withTmpDir ) ( async ( tmpDir ) => {
2023-03-09 16:46:51 +00:00
const features = setUpFeatureFlagTests ( tmpDir ) ;
2022-10-11 10:39:40 -07:00
const expectedFeatureEnablement = initializeFeatures ( true ) ;
( 0 , testing _utils _1 . mockFeatureFlagApiEndpoint ) ( 200 , expectedFeatureEnablement ) ;
2022-10-11 18:56:15 +01:00
// feature should be enabled initially
2023-03-09 16:46:51 +00:00
t . assert ( await features . getValue ( feature , includeCodeQlIfRequired ( feature ) ) ) ;
2022-10-11 18:56:15 +01:00
// set env var to false and check that the feature is now disabled
2022-10-11 10:39:40 -07:00
process . env [ feature _flags _1 . featureConfig [ feature ] . envVar ] = "false" ;
2023-03-09 16:46:51 +00:00
t . assert ( ! ( await features . getValue ( feature , includeCodeQlIfRequired ( feature ) ) ) ) ;
2022-10-05 15:54:07 -07:00
} ) ;
} ) ;
2022-10-11 10:39:40 -07:00
if ( feature _flags _1 . featureConfig [ feature ] . minimumVersion !== undefined ) {
2022-10-11 18:56:15 +01:00
( 0 , ava _1 . default ) ( ` Getting feature ' ${ feature } should throw if no codeql is provided ` , async ( t ) => {
2022-10-06 12:29:58 -07:00
await ( 0 , util _1 . withTmpDir ) ( async ( tmpDir ) => {
2023-03-09 16:46:51 +00:00
const features = setUpFeatureFlagTests ( tmpDir ) ;
2022-10-11 10:39:40 -07:00
const expectedFeatureEnablement = initializeFeatures ( true ) ;
( 0 , testing _utils _1 . mockFeatureFlagApiEndpoint ) ( 200 , expectedFeatureEnablement ) ;
2023-03-09 16:46:51 +00:00
await t . throwsAsync ( async ( ) => features . getValue ( feature ) , {
2022-10-11 10:39:40 -07:00
message : ` Internal error: A minimum version is specified for feature ${ feature } , but no instance of CodeQL was provided. ` ,
2022-10-06 12:29:58 -07:00
} ) ;
} ) ;
} ) ;
}
2022-10-11 10:39:40 -07:00
if ( feature _flags _1 . featureConfig [ feature ] . minimumVersion !== undefined ) {
2022-10-11 18:56:15 +01:00
( 0 , ava _1 . default ) ( ` Feature ' ${ feature } ' is disabled if the minimum CLI version is below ${ feature _flags _1 . featureConfig [ feature ] . minimumVersion } ` , async ( t ) => {
2022-10-05 15:54:07 -07:00
await ( 0 , util _1 . withTmpDir ) ( async ( tmpDir ) => {
2023-03-09 16:46:51 +00:00
const features = setUpFeatureFlagTests ( tmpDir ) ;
2022-10-11 10:39:40 -07:00
const expectedFeatureEnablement = initializeFeatures ( true ) ;
( 0 , testing _utils _1 . mockFeatureFlagApiEndpoint ) ( 200 , expectedFeatureEnablement ) ;
2022-10-11 18:56:15 +01:00
// feature should be disabled when an old CLI version is set
2022-10-05 15:54:07 -07:00
let codeql = ( 0 , testing _utils _1 . mockCodeQLVersion ) ( "2.0.0" ) ;
2023-03-09 16:46:51 +00:00
t . assert ( ! ( await features . getValue ( feature , codeql ) ) ) ;
2022-10-11 18:56:15 +01:00
// even setting the env var to true should not enable the feature if
2022-10-05 15:54:07 -07:00
// the minimum CLI version is not met
2022-10-11 10:39:40 -07:00
process . env [ feature _flags _1 . featureConfig [ feature ] . envVar ] = "true" ;
2023-03-09 16:46:51 +00:00
t . assert ( ! ( await features . getValue ( feature , codeql ) ) ) ;
2022-10-11 18:56:15 +01:00
// feature should be enabled when a new CLI version is set
2022-10-05 15:54:07 -07:00
// and env var is not set
2022-10-11 10:39:40 -07:00
process . env [ feature _flags _1 . featureConfig [ feature ] . envVar ] = "" ;
codeql = ( 0 , testing _utils _1 . mockCodeQLVersion ) ( feature _flags _1 . featureConfig [ feature ] . minimumVersion ) ;
2023-03-09 16:46:51 +00:00
t . assert ( await features . getValue ( feature , codeql ) ) ;
2022-10-11 18:56:15 +01:00
// set env var to false and check that the feature is now disabled
2022-10-11 10:39:40 -07:00
process . env [ feature _flags _1 . featureConfig [ feature ] . envVar ] = "false" ;
2023-03-09 16:46:51 +00:00
t . assert ( ! ( await features . getValue ( feature , codeql ) ) ) ;
2022-10-05 15:54:07 -07:00
} ) ;
} ) ;
}
}
2022-10-11 18:56:15 +01:00
// If we ever run into a situation where we no longer have any features that
2022-10-07 11:33:32 -07:00
// specify a minimum version, then we will have a bunch of code no longer being
// tested. This is unlikely, and this test will fail if that happens.
// If we do end up in that situation, then we should consider adding a synthetic
2022-10-11 18:56:15 +01:00
// feature with a minimum version that is only used for tests.
2022-10-07 11:33:32 -07:00
( 0 , ava _1 . default ) ( "At least one feature has a minimum version specified" , ( t ) => {
2022-10-11 18:56:15 +01:00
t . assert ( Object . values ( feature _flags _1 . featureConfig ) . some ( ( f ) => f . minimumVersion !== undefined ) , "At least one feature should have a minimum version specified" ) ;
// An even less likely scenario is that we no longer have any features.
t . assert ( Object . values ( feature _flags _1 . featureConfig ) . length > 0 , "There should be at least one feature" ) ;
2022-10-07 11:33:32 -07:00
} ) ;
2022-11-21 11:14:38 -08:00
( 0 , ava _1 . default ) ( "Feature flags are saved to disk" , async ( t ) => {
await ( 0 , util _1 . withTmpDir ) ( async ( tmpDir ) => {
2023-03-09 16:46:51 +00:00
const features = setUpFeatureFlagTests ( tmpDir ) ;
2022-11-21 11:14:38 -08:00
const expectedFeatureEnablement = initializeFeatures ( true ) ;
( 0 , testing _utils _1 . mockFeatureFlagApiEndpoint ) ( 200 , expectedFeatureEnablement ) ;
const cachedFeatureFlags = path . join ( tmpDir , feature _flags _1 . FEATURE _FLAGS _FILE _NAME ) ;
t . false ( fs . existsSync ( cachedFeatureFlags ) , "Feature flag cached file should not exist before getting feature flags" ) ;
2023-03-09 16:46:51 +00:00
t . true ( await features . getValue ( feature _flags _1 . Feature . CliConfigFileEnabled , includeCodeQlIfRequired ( feature _flags _1 . Feature . CliConfigFileEnabled ) ) , "Feature flag should be enabled initially" ) ;
2022-11-21 11:14:38 -08:00
t . true ( fs . existsSync ( cachedFeatureFlags ) , "Feature flag cached file should exist after getting feature flags" ) ;
const actualFeatureEnablement = JSON . parse ( fs . readFileSync ( cachedFeatureFlags , "utf8" ) ) ;
t . deepEqual ( actualFeatureEnablement , expectedFeatureEnablement ) ;
// now test that we actually use the feature flag cache instead of the server
actualFeatureEnablement [ feature _flags _1 . Feature . CliConfigFileEnabled ] = false ;
fs . writeFileSync ( cachedFeatureFlags , JSON . stringify ( actualFeatureEnablement ) ) ;
// delete the in memory cache so that we are forced to use the cached file
2023-03-09 16:46:51 +00:00
features . gitHubFeatureFlags . cachedApiResponse = undefined ;
t . false ( await features . getValue ( feature _flags _1 . Feature . CliConfigFileEnabled , includeCodeQlIfRequired ( feature _flags _1 . Feature . CliConfigFileEnabled ) ) , "Feature flag should be enabled after reading from cached file" ) ;
2022-11-21 11:14:38 -08:00
} ) ;
} ) ;
2022-11-21 14:30:36 -08:00
( 0 , ava _1 . default ) ( "Environment variable can override feature flag cache" , async ( t ) => {
await ( 0 , util _1 . withTmpDir ) ( async ( tmpDir ) => {
2023-03-09 16:46:51 +00:00
const features = setUpFeatureFlagTests ( tmpDir ) ;
2022-11-21 14:30:36 -08:00
const expectedFeatureEnablement = initializeFeatures ( true ) ;
( 0 , testing _utils _1 . mockFeatureFlagApiEndpoint ) ( 200 , expectedFeatureEnablement ) ;
const cachedFeatureFlags = path . join ( tmpDir , feature _flags _1 . FEATURE _FLAGS _FILE _NAME ) ;
2023-03-09 16:46:51 +00:00
t . true ( await features . getValue ( feature _flags _1 . Feature . CliConfigFileEnabled , includeCodeQlIfRequired ( feature _flags _1 . Feature . CliConfigFileEnabled ) ) , "Feature flag should be enabled initially" ) ;
2022-11-21 14:30:36 -08:00
t . true ( fs . existsSync ( cachedFeatureFlags ) , "Feature flag cached file should exist after getting feature flags" ) ;
process . env . CODEQL _PASS _CONFIG _TO _CLI = "false" ;
2023-03-09 16:46:51 +00:00
t . false ( await features . getValue ( feature _flags _1 . Feature . CliConfigFileEnabled , includeCodeQlIfRequired ( feature _flags _1 . Feature . CliConfigFileEnabled ) ) , "Feature flag should be disabled after setting env var" ) ;
2022-11-21 14:30:36 -08:00
} ) ;
} ) ;
2023-01-05 13:11:53 +00:00
for ( const variant of [ util _1 . GitHubVariant . GHAE , util _1 . GitHubVariant . GHES ] ) {
( 0 , ava _1 . default ) ( ` selects CLI from defaults.json on ${ util _1 . GitHubVariant [ variant ] } ` , async ( t ) => {
await ( 0 , util _1 . withTmpDir ) ( async ( tmpDir ) => {
const features = setUpFeatureFlagTests ( tmpDir ) ;
2023-01-25 11:09:18 -08:00
const defaultCliVersion = await features . getDefaultCliVersion ( variant ) ;
t . deepEqual ( defaultCliVersion , {
2023-01-05 13:11:53 +00:00
cliVersion : defaults . cliVersion ,
tagName : defaults . bundleVersion ,
} ) ;
} ) ;
} ) ;
}
2023-07-07 14:52:52 +01:00
( 0 , ava _1 . default ) ( "selects CLI v2.20.1 on Dotcom when feature flags enable v2.20.0 and v2.20.1" , async ( t ) => {
2023-01-05 13:11:53 +00:00
await ( 0 , util _1 . withTmpDir ) ( async ( tmpDir ) => {
2023-03-09 16:46:51 +00:00
const features = setUpFeatureFlagTests ( tmpDir ) ;
2023-01-05 13:11:53 +00:00
const expectedFeatureEnablement = initializeFeatures ( true ) ;
2023-07-07 14:52:52 +01:00
expectedFeatureEnablement [ "default_codeql_version_2_20_0_enabled" ] = true ;
expectedFeatureEnablement [ "default_codeql_version_2_20_1_enabled" ] = true ;
expectedFeatureEnablement [ "default_codeql_version_2_20_2_enabled" ] = false ;
expectedFeatureEnablement [ "default_codeql_version_2_20_3_enabled" ] = false ;
expectedFeatureEnablement [ "default_codeql_version_2_20_4_enabled" ] = false ;
expectedFeatureEnablement [ "default_codeql_version_2_20_5_enabled" ] = false ;
2023-01-05 13:11:53 +00:00
( 0 , testing _utils _1 . mockFeatureFlagApiEndpoint ) ( 200 , expectedFeatureEnablement ) ;
2023-03-09 16:46:51 +00:00
const defaultCliVersion = await features . getDefaultCliVersion ( util _1 . GitHubVariant . DOTCOM ) ;
2023-01-25 11:09:18 -08:00
t . deepEqual ( defaultCliVersion , {
2023-07-07 14:52:52 +01:00
cliVersion : "2.20.1" ,
tagName : "codeql-bundle-v2.20.1" ,
2023-01-25 11:09:18 -08:00
toolsFeatureFlagsValid : true ,
2023-01-05 13:11:53 +00:00
} ) ;
} ) ;
} ) ;
2023-07-06 22:24:42 +01:00
( 0 , ava _1 . default ) ( "includes tag name when feature flags enable version greater than v2.13.4" , async ( t ) => {
await ( 0 , util _1 . withTmpDir ) ( async ( tmpDir ) => {
const features = setUpFeatureFlagTests ( tmpDir ) ;
const expectedFeatureEnablement = initializeFeatures ( true ) ;
expectedFeatureEnablement [ "default_codeql_version_2_20_0_enabled" ] = true ;
( 0 , testing _utils _1 . mockFeatureFlagApiEndpoint ) ( 200 , expectedFeatureEnablement ) ;
const defaultCliVersion = await features . getDefaultCliVersion ( util _1 . GitHubVariant . DOTCOM ) ;
t . deepEqual ( defaultCliVersion , {
cliVersion : "2.20.0" ,
tagName : "codeql-bundle-v2.20.0" ,
toolsFeatureFlagsValid : true ,
} ) ;
} ) ;
} ) ;
2023-01-23 20:00:44 +00:00
( 0 , ava _1 . default ) ( ` selects CLI from defaults.json on Dotcom when no default version feature flags are enabled ` , async ( t ) => {
2023-01-05 13:11:53 +00:00
await ( 0 , util _1 . withTmpDir ) ( async ( tmpDir ) => {
2023-03-09 16:46:51 +00:00
const features = setUpFeatureFlagTests ( tmpDir ) ;
2023-01-05 13:11:53 +00:00
const expectedFeatureEnablement = initializeFeatures ( true ) ;
( 0 , testing _utils _1 . mockFeatureFlagApiEndpoint ) ( 200 , expectedFeatureEnablement ) ;
2023-03-09 16:46:51 +00:00
const defaultCliVersion = await features . getDefaultCliVersion ( util _1 . GitHubVariant . DOTCOM ) ;
2023-01-25 11:09:18 -08:00
t . deepEqual ( defaultCliVersion , {
2023-01-23 20:00:44 +00:00
cliVersion : defaults . cliVersion ,
2023-07-06 22:24:42 +01:00
tagName : defaults . bundleVersion ,
2023-01-25 11:09:18 -08:00
toolsFeatureFlagsValid : false ,
2023-01-05 13:11:53 +00:00
} ) ;
} ) ;
} ) ;
2023-07-07 15:14:51 +01:00
( 0 , ava _1 . default ) ( ` selects CLI from defaults.json on Dotcom when default version feature flags are unsupported ` , async ( t ) => {
await ( 0 , util _1 . withTmpDir ) ( async ( tmpDir ) => {
const features = setUpFeatureFlagTests ( tmpDir ) ;
const expectedFeatureEnablement = initializeFeatures ( true ) ;
// Doesn't have a semantically versioned bundle
expectedFeatureEnablement [ "default_codeql_version_2_13_3_enabled" ] = true ;
( 0 , testing _utils _1 . mockFeatureFlagApiEndpoint ) ( 200 , expectedFeatureEnablement ) ;
const defaultCliVersion = await features . getDefaultCliVersion ( util _1 . GitHubVariant . DOTCOM ) ;
t . deepEqual ( defaultCliVersion , {
cliVersion : defaults . cliVersion ,
tagName : defaults . bundleVersion ,
toolsFeatureFlagsValid : false ,
} ) ;
} ) ;
} ) ;
2023-01-05 13:17:37 +00:00
( 0 , ava _1 . default ) ( "ignores invalid version numbers in default version feature flags" , async ( t ) => {
await ( 0 , util _1 . withTmpDir ) ( async ( tmpDir ) => {
const loggedMessages = [ ] ;
2023-03-09 16:46:51 +00:00
const features = setUpFeatureFlagTests ( tmpDir , ( 0 , testing _utils _1 . getRecordingLogger ) ( loggedMessages ) ) ;
2023-01-05 13:17:37 +00:00
const expectedFeatureEnablement = initializeFeatures ( true ) ;
2023-07-07 14:52:52 +01:00
expectedFeatureEnablement [ "default_codeql_version_2_20_0_enabled" ] = true ;
expectedFeatureEnablement [ "default_codeql_version_2_20_1_enabled" ] = true ;
expectedFeatureEnablement [ "default_codeql_version_2_20_invalid_enabled" ] =
2023-01-05 13:17:37 +00:00
true ;
( 0 , testing _utils _1 . mockFeatureFlagApiEndpoint ) ( 200 , expectedFeatureEnablement ) ;
2023-03-09 16:46:51 +00:00
const defaultCliVersion = await features . getDefaultCliVersion ( util _1 . GitHubVariant . DOTCOM ) ;
2023-01-25 11:09:18 -08:00
t . deepEqual ( defaultCliVersion , {
2023-07-07 14:52:52 +01:00
cliVersion : "2.20.1" ,
tagName : "codeql-bundle-v2.20.1" ,
2023-01-25 11:09:18 -08:00
toolsFeatureFlagsValid : true ,
2023-01-05 13:17:37 +00:00
} ) ;
t . assert ( loggedMessages . find ( ( v ) => v . type === "warning" &&
v . message ===
2023-07-07 14:52:52 +01:00
"Ignoring feature flag default_codeql_version_2_20_invalid_enabled as it does not specify a valid CodeQL version." ) !== undefined ) ;
2023-01-05 13:17:37 +00:00
} ) ;
} ) ;
2023-07-18 13:12:12 +01:00
( 0 , ava _1 . default ) ( "feature flags should end with _enabled" , async ( t ) => {
for ( const feature of Object . values ( feature _flags _1 . Feature ) ) {
t . assert ( feature . endsWith ( "_enabled" ) , ` ${ feature } should end with '_enabled' ` ) ;
}
} ) ;
2022-10-06 12:29:58 -07:00
function assertAllFeaturesUndefinedInApi ( t , loggedMessages ) {
2022-10-11 10:39:40 -07:00
for ( const feature of Object . keys ( feature _flags _1 . featureConfig ) ) {
2022-10-06 12:29:58 -07:00
t . assert ( loggedMessages . find ( ( v ) => v . type === "debug" &&
2022-10-11 10:39:40 -07:00
v . message . includes ( feature ) &&
2023-03-07 16:24:55 -08:00
v . message . includes ( "undefined in API response" ) ) !== undefined ) ;
2022-10-06 12:29:58 -07:00
}
}
function initializeFeatures ( initialValue ) {
2022-10-06 12:31:08 -07:00
return Object . keys ( feature _flags _1 . featureConfig ) . reduce ( ( features , key ) => {
2022-10-06 12:29:58 -07:00
features [ key ] = initialValue ;
return features ;
} , { } ) ;
}
2022-11-21 11:14:38 -08:00
function setUpFeatureFlagTests ( tmpDir , logger = ( 0 , logging _1 . getRunnerLogger ) ( true ) , gitHubVersion = { type : util _1 . GitHubVariant . DOTCOM } ) {
2022-10-05 15:54:07 -07:00
( 0 , testing _utils _1 . setupActionsVars ) ( tmpDir , tmpDir ) ;
2022-11-21 11:14:38 -08:00
return new feature _flags _1 . Features ( gitHubVersion , testRepositoryNwo , tmpDir , logger ) ;
2021-12-14 19:50:52 +00:00
}
2022-10-11 18:56:15 +01:00
function includeCodeQlIfRequired ( feature ) {
return feature _flags _1 . featureConfig [ feature ] . minimumVersion !== undefined
2022-10-06 12:29:58 -07:00
? ( 0 , testing _utils _1 . mockCodeQLVersion ) ( "9.9.9" )
: undefined ;
}
2021-12-14 19:50:52 +00:00
//# sourceMappingURL=feature-flags.test.js.map