mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	feat: Add suppport for variant overrides
This commit is contained in:
		
							parent
							
								
									4d6fab8ea0
								
							
						
					
					
						commit
						b36fc73a7b
					
				@ -24,6 +24,15 @@ const variantsSchema = joi.object().keys({
 | 
			
		||||
            value: joi.string().required(),
 | 
			
		||||
        })
 | 
			
		||||
        .optional(),
 | 
			
		||||
    overrides: joi.array().items(
 | 
			
		||||
        joi
 | 
			
		||||
            .object()
 | 
			
		||||
            .keys({
 | 
			
		||||
                field: joi.string().required(),
 | 
			
		||||
                values: joi.array().items(joi.string()),
 | 
			
		||||
            })
 | 
			
		||||
            .optional()
 | 
			
		||||
    ),
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
const featureShema = joi
 | 
			
		||||
 | 
			
		||||
@ -25,3 +25,71 @@ test('should be valid toggle name', t => {
 | 
			
		||||
    const { value } = joi.validate(toggle, featureShema);
 | 
			
		||||
    t.deepEqual(value, toggle);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test('should strip extra variant fields', t => {
 | 
			
		||||
    const toggle = {
 | 
			
		||||
        name: 'app.name',
 | 
			
		||||
        enabled: false,
 | 
			
		||||
        strategies: [{ name: 'default' }],
 | 
			
		||||
        variants: [
 | 
			
		||||
            {
 | 
			
		||||
                name: 'variant-a',
 | 
			
		||||
                weight: 1,
 | 
			
		||||
                unkown: 'not-allowed',
 | 
			
		||||
            },
 | 
			
		||||
        ],
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    const { value } = joi.validate(toggle, featureShema);
 | 
			
		||||
    t.notDeepEqual(value, toggle);
 | 
			
		||||
    t.falsy(value.variants[0].unkown);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test('should be possible to define variant overrides', t => {
 | 
			
		||||
    const toggle = {
 | 
			
		||||
        name: 'app.name',
 | 
			
		||||
        enabled: false,
 | 
			
		||||
        strategies: [{ name: 'default' }],
 | 
			
		||||
        variants: [
 | 
			
		||||
            {
 | 
			
		||||
                name: 'variant-a',
 | 
			
		||||
                weight: 1,
 | 
			
		||||
                overrides: [
 | 
			
		||||
                    {
 | 
			
		||||
                        field: 'userId',
 | 
			
		||||
                        values: ['123'],
 | 
			
		||||
                    },
 | 
			
		||||
                ],
 | 
			
		||||
            },
 | 
			
		||||
        ],
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    const { value, error } = joi.validate(toggle, featureShema);
 | 
			
		||||
    t.deepEqual(value, toggle);
 | 
			
		||||
    t.falsy(error);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test('variant overrides must have corect shape', async t => {
 | 
			
		||||
    t.plan(1);
 | 
			
		||||
    const toggle = {
 | 
			
		||||
        name: 'app.name',
 | 
			
		||||
        enabled: false,
 | 
			
		||||
        strategies: [{ name: 'default' }],
 | 
			
		||||
        variants: [
 | 
			
		||||
            {
 | 
			
		||||
                name: 'variant-a',
 | 
			
		||||
                weight: 1,
 | 
			
		||||
                overrides: {
 | 
			
		||||
                    userId: ['not-alloed'],
 | 
			
		||||
                    sessionId: ['not-alloed'],
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
        ],
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    try {
 | 
			
		||||
        await joi.validate(toggle, featureShema);
 | 
			
		||||
    } catch (error) {
 | 
			
		||||
        t.is(error.details[0].message, '"overrides" must be an array');
 | 
			
		||||
    }
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
@ -234,3 +234,31 @@ test.serial('should not be possible to create archived toggle', async t => {
 | 
			
		||||
        .expect(400)
 | 
			
		||||
        .then(destroy);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test.serial('creates new feature toggle with variant overrides', async t => {
 | 
			
		||||
    t.plan(0);
 | 
			
		||||
    const { request, destroy } = await setupApp('feature_api_serial');
 | 
			
		||||
    return request
 | 
			
		||||
        .post('/api/admin/features')
 | 
			
		||||
        .send({
 | 
			
		||||
            name: 'com.test.variants',
 | 
			
		||||
            enabled: false,
 | 
			
		||||
            strategies: [{ name: 'default' }],
 | 
			
		||||
            variants: [
 | 
			
		||||
                {
 | 
			
		||||
                    name: 'variant1',
 | 
			
		||||
                    weight: 50,
 | 
			
		||||
                    overrides: [
 | 
			
		||||
                        {
 | 
			
		||||
                            field: 'userId',
 | 
			
		||||
                            values: ['123'],
 | 
			
		||||
                        },
 | 
			
		||||
                    ],
 | 
			
		||||
                },
 | 
			
		||||
                { name: 'variant2', weight: 50 },
 | 
			
		||||
            ],
 | 
			
		||||
        })
 | 
			
		||||
        .set('Content-Type', 'application/json')
 | 
			
		||||
        .expect(201)
 | 
			
		||||
        .then(destroy);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user