mirror of
https://github.com/Unleash/unleash.git
synced 2025-02-04 00:18:01 +01:00
fix: respect environment if set on context (#2206)
When using the frontend api (embedded proxy) we should allow the use to self-define the environment on the proxy.
This commit is contained in:
parent
f1c678e5c4
commit
b0626d46bc
@ -1,6 +1,6 @@
|
|||||||
// Copy of https://github.com/Unleash/unleash-proxy/blob/main/src/test/create-context.test.ts.
|
// Copy of https://github.com/Unleash/unleash-proxy/blob/main/src/test/create-context.test.ts.
|
||||||
|
|
||||||
import { createContext } from './create-context';
|
import { createContext, enrichContextWithIp } from './create-context';
|
||||||
|
|
||||||
test('should remove undefined properties', () => {
|
test('should remove undefined properties', () => {
|
||||||
const context = createContext({
|
const context = createContext({
|
||||||
@ -55,13 +55,50 @@ test('will not blow up if properties is an array', () => {
|
|||||||
properties: ['some'],
|
properties: ['some'],
|
||||||
});
|
});
|
||||||
|
|
||||||
// console.log(context);
|
|
||||||
|
|
||||||
expect(context.userId).toBe('123');
|
expect(context.userId).toBe('123');
|
||||||
expect(context).not.toHaveProperty('tenantId');
|
expect(context).not.toHaveProperty('tenantId');
|
||||||
expect(context).not.toHaveProperty('region');
|
expect(context).not.toHaveProperty('region');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('will respect environment set in context', () => {
|
||||||
|
const context = createContext({
|
||||||
|
userId: '123',
|
||||||
|
tenantId: 'some-tenant',
|
||||||
|
environment: 'development',
|
||||||
|
region: 'eu',
|
||||||
|
properties: ['some'],
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(context.environment).toBe('development');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('will not set environment to be development if not set in context', () => {
|
||||||
|
const context = createContext({
|
||||||
|
userId: '123',
|
||||||
|
tenantId: 'some-tenant',
|
||||||
|
region: 'eu',
|
||||||
|
properties: ['some'],
|
||||||
|
});
|
||||||
|
|
||||||
|
expect(context.environment).toBe(undefined);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('will enrich context with ip', () => {
|
||||||
|
const query = {};
|
||||||
|
const ip = '192.168.10.0';
|
||||||
|
const result = enrichContextWithIp(query, ip);
|
||||||
|
|
||||||
|
expect(result.remoteAddress).toBe(ip);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('will not change environment when enriching', () => {
|
||||||
|
const query = { environment: 'production' };
|
||||||
|
const ip = '192.168.10.0';
|
||||||
|
const result = enrichContextWithIp(query, ip);
|
||||||
|
|
||||||
|
expect(result.environment).toBe('production');
|
||||||
|
});
|
||||||
|
|
||||||
test.skip('will not blow up if userId is an array', () => {
|
test.skip('will not blow up if userId is an array', () => {
|
||||||
const context = createContext({
|
const context = createContext({
|
||||||
userId: ['123'],
|
userId: ['123'],
|
||||||
|
@ -32,3 +32,9 @@ export function createContext(value: any): Context {
|
|||||||
|
|
||||||
return cleanContext;
|
return cleanContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
|
||||||
|
export const enrichContextWithIp = (query: any, ip: string): Context => {
|
||||||
|
query.remoteAddress = query.remoteAddress || ip;
|
||||||
|
return createContext(query);
|
||||||
|
};
|
||||||
|
@ -9,7 +9,7 @@ import {
|
|||||||
ProxyFeaturesSchema,
|
ProxyFeaturesSchema,
|
||||||
} from '../../openapi/spec/proxy-features-schema';
|
} from '../../openapi/spec/proxy-features-schema';
|
||||||
import { Context } from 'unleash-client';
|
import { Context } from 'unleash-client';
|
||||||
import { createContext } from '../../proxy/create-context';
|
import { enrichContextWithIp } from '../../proxy/create-context';
|
||||||
import { ProxyMetricsSchema } from '../../openapi/spec/proxy-metrics-schema';
|
import { ProxyMetricsSchema } from '../../openapi/spec/proxy-metrics-schema';
|
||||||
import { ProxyClientSchema } from '../../openapi/spec/proxy-client-schema';
|
import { ProxyClientSchema } from '../../openapi/spec/proxy-client-schema';
|
||||||
import { createResponseSchema } from '../../openapi/util/create-response-schema';
|
import { createResponseSchema } from '../../openapi/util/create-response-schema';
|
||||||
@ -168,8 +168,6 @@ export default class ProxyController extends Controller {
|
|||||||
|
|
||||||
private static createContext(req: ApiUserRequest): Context {
|
private static createContext(req: ApiUserRequest): Context {
|
||||||
const { query } = req;
|
const { query } = req;
|
||||||
query.remoteAddress = query.remoteAddress || req.ip;
|
return enrichContextWithIp(query, req.ip);
|
||||||
query.environment = req.user.environment;
|
|
||||||
return createContext(query);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -538,6 +538,47 @@ test('should filter features by constraints', async () => {
|
|||||||
.expect((res) => expect(res.body.toggles).toHaveLength(0));
|
.expect((res) => expect(res.body.toggles).toHaveLength(0));
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('should be able to set environment as a context variable', async () => {
|
||||||
|
const frontendToken = await createApiToken(ApiTokenType.FRONTEND);
|
||||||
|
const featureName = 'featureWithEnvironmentConstraint';
|
||||||
|
await createFeatureToggle({
|
||||||
|
name: featureName,
|
||||||
|
enabled: true,
|
||||||
|
strategies: [
|
||||||
|
{
|
||||||
|
name: 'default',
|
||||||
|
constraints: [
|
||||||
|
{
|
||||||
|
contextName: 'environment',
|
||||||
|
operator: 'IN',
|
||||||
|
values: ['staging'],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
parameters: {},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
});
|
||||||
|
|
||||||
|
await app.request
|
||||||
|
.get('/api/frontend?environment=staging')
|
||||||
|
.set('Authorization', frontendToken.secret)
|
||||||
|
.expect('Content-Type', /json/)
|
||||||
|
.expect(200)
|
||||||
|
.expect((res) => {
|
||||||
|
expect(res.body.toggles).toHaveLength(1);
|
||||||
|
expect(res.body.toggles[0].name).toBe(featureName);
|
||||||
|
});
|
||||||
|
|
||||||
|
await app.request
|
||||||
|
.get('/api/frontend')
|
||||||
|
.set('Authorization', frontendToken.secret)
|
||||||
|
.expect('Content-Type', /json/)
|
||||||
|
.expect(200)
|
||||||
|
.expect((res) => {
|
||||||
|
expect(res.body.toggles).toHaveLength(0);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
test('should filter features by project', async () => {
|
test('should filter features by project', async () => {
|
||||||
const projectA = 'projectA';
|
const projectA = 'projectA';
|
||||||
const projectB = 'projectB';
|
const projectB = 'projectB';
|
||||||
|
Loading…
Reference in New Issue
Block a user