mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	fix: force clone feature to correctly copy variant environments (#2498)
patches an issue where cloning a feature would clone variants for it's last found environment in the db. This now will clone the feature environments correctly
This commit is contained in:
		
							parent
							
								
									27cb6b742a
								
							
						
					
					
						commit
						801df6953c
					
				@ -768,18 +768,30 @@ class FeatureToggleService {
 | 
			
		||||
        await this.validateName(newFeatureName);
 | 
			
		||||
 | 
			
		||||
        const cToggle =
 | 
			
		||||
            await this.featureStrategiesStore.getFeatureToggleWithEnvs(
 | 
			
		||||
            await this.featureStrategiesStore.getFeatureToggleWithVariantEnvs(
 | 
			
		||||
                featureName,
 | 
			
		||||
            );
 | 
			
		||||
 | 
			
		||||
        const newToggle = { ...cToggle, name: newFeatureName };
 | 
			
		||||
        const newToggle = {
 | 
			
		||||
            ...cToggle,
 | 
			
		||||
            name: newFeatureName,
 | 
			
		||||
            variants: undefined,
 | 
			
		||||
        };
 | 
			
		||||
        const created = await this.createFeatureToggle(
 | 
			
		||||
            projectId,
 | 
			
		||||
            newToggle,
 | 
			
		||||
            userName,
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        const tasks = newToggle.environments.flatMap((e) =>
 | 
			
		||||
        const variantTasks = newToggle.environments.map((e) => {
 | 
			
		||||
            return this.featureEnvironmentStore.addVariantsToFeatureEnvironment(
 | 
			
		||||
                newToggle.name,
 | 
			
		||||
                e.name,
 | 
			
		||||
                e.variants,
 | 
			
		||||
            );
 | 
			
		||||
        });
 | 
			
		||||
 | 
			
		||||
        const strategyTasks = newToggle.environments.flatMap((e) =>
 | 
			
		||||
            e.strategies.map((s) => {
 | 
			
		||||
                if (replaceGroupId && s.parameters.hasOwnProperty('groupId')) {
 | 
			
		||||
                    s.parameters.groupId = newFeatureName;
 | 
			
		||||
@ -795,7 +807,7 @@ class FeatureToggleService {
 | 
			
		||||
            }),
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
        await Promise.all(tasks);
 | 
			
		||||
        await Promise.all([...strategyTasks, ...variantTasks]);
 | 
			
		||||
        return created;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -253,3 +253,61 @@ test('adding and removing an environment preserves variants when variants per en
 | 
			
		||||
    const toggle = await service.getFeature(featureName, false, null, false);
 | 
			
		||||
    expect(toggle.variants).toHaveLength(1);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
test('cloning a feature toggle copies variant environments correctly', async () => {
 | 
			
		||||
    const newToggleName = 'Molly';
 | 
			
		||||
    const clonedToggleName = 'Dolly';
 | 
			
		||||
    const targetEnv = 'gene-lab';
 | 
			
		||||
 | 
			
		||||
    await service.createFeatureToggle(
 | 
			
		||||
        'default',
 | 
			
		||||
        {
 | 
			
		||||
            name: newToggleName,
 | 
			
		||||
        },
 | 
			
		||||
        'test',
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    await stores.environmentStore.create({
 | 
			
		||||
        name: 'gene-lab',
 | 
			
		||||
        type: 'production',
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    await stores.featureEnvironmentStore.connectFeatureToEnvironmentsForProject(
 | 
			
		||||
        newToggleName,
 | 
			
		||||
        'default',
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    await stores.featureEnvironmentStore.addVariantsToFeatureEnvironment(
 | 
			
		||||
        newToggleName,
 | 
			
		||||
        targetEnv,
 | 
			
		||||
        [
 | 
			
		||||
            {
 | 
			
		||||
                name: 'variant1',
 | 
			
		||||
                weight: 100,
 | 
			
		||||
                weightType: 'fix',
 | 
			
		||||
                stickiness: 'default',
 | 
			
		||||
            },
 | 
			
		||||
        ],
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    await service.cloneFeatureToggle(
 | 
			
		||||
        newToggleName,
 | 
			
		||||
        'default',
 | 
			
		||||
        clonedToggleName,
 | 
			
		||||
        true,
 | 
			
		||||
        'test-user',
 | 
			
		||||
    );
 | 
			
		||||
 | 
			
		||||
    const clonedToggle =
 | 
			
		||||
        await stores.featureStrategiesStore.getFeatureToggleWithVariantEnvs(
 | 
			
		||||
            clonedToggleName,
 | 
			
		||||
        );
 | 
			
		||||
 | 
			
		||||
    const defaultEnv = clonedToggle.environments.find(
 | 
			
		||||
        (x) => x.name === 'default',
 | 
			
		||||
    );
 | 
			
		||||
    const newEnv = clonedToggle.environments.find((x) => x.name === targetEnv);
 | 
			
		||||
 | 
			
		||||
    expect(defaultEnv.variants).toHaveLength(0);
 | 
			
		||||
    expect(newEnv.variants).toHaveLength(1);
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user