Skip to content

Commit

Permalink
chore: remove un-needed zero-value handling (#539)
Browse files Browse the repository at this point in the history
Signed-off-by: Todd Baert <[email protected]>
  • Loading branch information
toddbaert authored Aug 17, 2023
1 parent ee8d162 commit 552be83
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 128 deletions.
93 changes: 0 additions & 93 deletions libs/providers/flagd/src/lib/flagd-provider.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -200,99 +200,6 @@ describe(FlagdProvider.name, () => {
});
});

describe('basic flag resolution with zero values', () => {
let client: Client;

const basicServiceClientMock: ServiceClient = {
eventStream: jest.fn(() => {
return {
on: jest.fn((event: string, callback: (message: unknown) => void) => {
if (event === 'data') {
callback({ type: EVENT_PROVIDER_READY });
}
}),
cancel: jest.fn(),
};
}),
close: jest.fn(),
resolveBoolean: jest.fn((request: ResolveBooleanRequest, callback: (error: ServiceError | null, response: ResolveBooleanResponse) => void) => {
callback(null, {
variant: BOOLEAN_VARIANT,
} as ResolveBooleanResponse);
}),
resolveString: jest.fn((request: ResolveStringRequest, callback: (error: ServiceError | null, response: ResolveStringResponse) => void) => {
callback(null, {
variant: STRING_VARIANT,
} as ResolveStringResponse);
}),
resolveFloat: jest.fn((request: ResolveFloatRequest, callback: (error: ServiceError | null, response: ResolveFloatResponse) => void) => {
callback(null, {
variant: NUMBER_VARIANT,
} as ResolveFloatResponse);
}),
resolveInt: jest.fn((): UnaryCall<ResolveIntRequest, ResolveIntResponse> => {
throw new Error('resolveInt should not be called'); // we never call this method, we resolveFloat for all numbers.
}),
resolveObject: jest.fn((request: ResolveObjectRequest, callback: (error: ServiceError | null, response: ResolveObjectResponse) => void) => {
callback(null, {
variant: OBJECT_VARIANT,
} as ResolveObjectResponse);
}),
} as unknown as ServiceClient;

beforeEach(() => {
// inject our mock GRPCService and ServiceClient
OpenFeature.setProvider('zero test',
new FlagdProvider(undefined, undefined, new GRPCService({ host: '', port: 123, tls: false }, basicServiceClientMock))
);
client = OpenFeature.getClient('zero test');
});

describe(FlagdProvider.prototype.resolveBooleanEvaluation.name, () => {
it(`should call ${ServiceClient.prototype.resolveBoolean} with key and context and return falsy value`, async () => {
const val = await client.getBooleanDetails(BOOLEAN_KEY, false, TEST_CONTEXT);
expect(basicServiceClientMock.resolveBoolean).toHaveBeenCalledWith({
flagKey: BOOLEAN_KEY,
context: TEST_CONTEXT,
}, expect.any(Function));
expect(val.value).toEqual(false);
});
});

describe(FlagdProvider.prototype.resolveStringEvaluation.name, () => {
it(`should call ${ServiceClient.prototype.resolveString} with key and context and return falsy value`, async () => {
const val = await client.getStringDetails(STRING_KEY, '', TEST_CONTEXT);
expect(basicServiceClientMock.resolveString).toHaveBeenCalledWith({
flagKey: STRING_KEY,
context: TEST_CONTEXT,
}, expect.any(Function));
expect(val.value).toEqual('');
});
});

describe(FlagdProvider.prototype.resolveNumberEvaluation.name, () => {
it(`should call ${ServiceClient.prototype.resolveFloat} with key and context and return falsy value`, async () => {
const val = await client.getNumberDetails(NUMBER_KEY, 0, TEST_CONTEXT);
expect(basicServiceClientMock.resolveFloat).toHaveBeenCalledWith({
flagKey: NUMBER_KEY,
context: TEST_CONTEXT,
}, expect.any(Function));
expect(val.value).toEqual(0);
});
});

describe(FlagdProvider.prototype.resolveObjectEvaluation.name, () => {
it(`should call ${ServiceClient.prototype.resolveObject} with key and context and return falsy value`, async () => {
const val = await client.getObjectDetails(OBJECT_KEY, {}, TEST_CONTEXT);
expect(basicServiceClientMock.resolveObject).toHaveBeenCalledWith({
flagKey: OBJECT_KEY,
context: TEST_CONTEXT,
}, expect.any(Function));
expect(val.value).toEqual({});
});
});
});

describe('streaming', () => {
const STATIC_BOOLEAN_KEY_1 = 'staticBoolflagOne';
const STATIC_BOOLEAN_KEY_2 = 'staticBoolflagTwo';
Expand Down
40 changes: 5 additions & 35 deletions libs/providers/flagd/src/lib/service/grpc/grpc-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -122,23 +122,23 @@ export class GRPCService implements Service {
context: EvaluationContext,
logger: Logger,
): Promise<ResolutionDetails<boolean>> {
return this.resolve(this._client.resolveBoolean, flagKey, context, logger, this.booleanParser);
return this.resolve(this._client.resolveBoolean, flagKey, context, logger);
}

async resolveString(flagKey: string, context: EvaluationContext, logger: Logger): Promise<ResolutionDetails<string>> {
return this.resolve(this._client.resolveString, flagKey, context, logger, this.stringParser);
return this.resolve(this._client.resolveString, flagKey, context, logger);
}

async resolveNumber(flagKey: string, context: EvaluationContext, logger: Logger): Promise<ResolutionDetails<number>> {
return this.resolve(this._client.resolveFloat, flagKey, context, logger, this.numberParser);
return this.resolve(this._client.resolveFloat, flagKey, context, logger);
}

async resolveObject<T extends JsonValue>(
flagKey: string,
context: EvaluationContext,
logger: Logger,
): Promise<ResolutionDetails<T>> {
return this.resolve(this._client.resolveObject, flagKey, context, logger, this.objectParser);
return this.resolve(this._client.resolveObject, flagKey, context, logger);
}

private connectStream(
Expand Down Expand Up @@ -231,34 +231,6 @@ export class GRPCService implements Service {
this._streamAlive = false;
}

private objectParser = <T extends JsonValue>(struct: T): T => {
if (struct) {
return struct;
}
return {} as T;
};

private booleanParser = (value: boolean): boolean => {
if (value) {
return value;
}
return false;
};

private stringParser = (value: string): string => {
if (value) {
return value;
}
return '';
};

private numberParser = (value: number): number => {
if (value) {
return value;
}
return 0;
};

private async resolve<T extends FlagValue>(
promise: (
request: AnyRequest,
Expand All @@ -267,7 +239,6 @@ export class GRPCService implements Service {
flagKey: string,
context: EvaluationContext,
logger: Logger,
parser: (value: T) => T,
): Promise<ResolutionDetails<T>> {
const resolver = promisify(promise);
if (this._cacheActive) {
Expand All @@ -283,8 +254,7 @@ export class GRPCService implements Service {
.then((resolved) => resolved, this.onRejected);

const resolved: ResolutionDetails<T> = {
// invoke the parser method if passed
value: parser.call(this, response.value as T),
value: response.value as T,
reason: response.reason,
variant: response.variant,
flagMetadata: response.metadata,
Expand Down

0 comments on commit 552be83

Please sign in to comment.