@lightbend/akkaserverless-javascript-sdk
Version:
Akka Serverless JavaScript SDK
253 lines (230 loc) • 7.92 kB
text/typescript
/*
* Copyright 2021 Lightbend Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import {
AkkaServerless,
ComponentOptions,
EntityOptions,
} from '../src/akkaserverless';
import discovery from '../proto/akkaserverless/protocol/discovery_pb';
import { should } from 'chai';
should();
describe('Akkaserverless', () => {
it('should generate working links based on error codes', () => {
// Arrange
const akkasls = new AkkaServerless({
descriptorSetPath: 'test/user-function-test.desc',
});
// Act
const specificLink = akkasls.docLinkFor('AS-00112');
const componentLink = akkasls.docLinkFor('AS-001');
const unknownLink = akkasls.docLinkFor('???');
// Assert
specificLink.should.equal(
'https://developer.lightbend.com/docs/akka-serverless/javascript/views.html#changing',
);
componentLink.should.equal(
'https://developer.lightbend.com/docs/akka-serverless/javascript/views.html',
);
unknownLink.should.equal('');
});
it('format correctly the source code for errors', () => {
// Arrange
const akkasls = new AkkaServerless({
descriptorSetPath: 'test/user-function-test.desc',
});
const location = new discovery.UserFunctionError.SourceLocation();
location.setFileName('package.test.json');
location.setStartLine(1);
location.setStartCol(3);
location.setEndLine(2);
location.setEndCol(5);
location.setProtoPathList([]);
const component = {
serviceName: 'my-service',
options: {
includeDirs: ['./test'],
entityType: 'my-entity-type',
},
componentType: () => {
return 'my-type';
},
};
akkasls.addComponent(component);
// Act
const errorMsg = akkasls.formatSource(location);
// Assert
const result = `At package.test.json:2:4:
"name": "some-name",
"version": "some-version"`;
errorMsg.should.equal(result);
});
it('report correctly errors', () => {
// Arrange
const akkasls = new AkkaServerless({
descriptorSetPath: 'test/user-function-test.desc',
});
const location = new discovery.UserFunctionError.SourceLocation();
location.setFileName('package.test.json');
location.setStartLine(1);
location.setStartCol(3);
location.setEndLine(2);
location.setEndCol(5);
location.setProtoPathList([]);
const component = {
serviceName: 'my-service',
options: {
includeDirs: ['./test'],
entityType: 'my-entity-type',
},
componentType: () => {
return 'my-type';
},
};
akkasls.addComponent(component);
const userError = new discovery.UserFunctionError();
userError.setCode('AS-00112');
userError.setDetail('test details');
userError.setMessage('test message');
userError.setSourceLocationsList([location]);
// Act
const errorMsg = akkasls.reportErrorLogic(
userError.getCode(),
userError.getMessage(),
userError.getDetail(),
userError.getSourceLocationsList(),
);
// Assert
const result = `Error reported from Akka Serverless system: AS-00112 test message
test details
See documentation: https://developer.lightbend.com/docs/akka-serverless/javascript/views.html#changing
At package.test.json:2:4:
"name": "some-name",
"version": "some-version"`;
errorMsg.should.equal(result);
});
it('discovery service should return correct service info', () => {
// Arrange
const akkasls = new AkkaServerless({
descriptorSetPath: 'test/user-function-test.desc',
serviceName: 'my-service',
serviceVersion: '1.2.3',
});
const proxyInfo = new discovery.ProxyInfo();
// Act
const result = akkasls.discoveryLogic(proxyInfo);
const serviceInfo = result.getServiceInfo();
// Assert
result.getProto().should.equal('');
result.getComponentsList().length.should.equal(0);
serviceInfo?.getProtocolMajorVersion().should.equal(0);
serviceInfo?.getProtocolMinorVersion().should.equal(8);
serviceInfo?.getServiceName().should.equal('my-service');
serviceInfo?.getServiceVersion().should.equal('1.2.3');
serviceInfo?.getServiceRuntime().should.contains('node v');
serviceInfo
?.getSupportLibraryName()
.should.equal('@lightbend/akkaserverless-javascript-sdk');
serviceInfo?.getSupportLibraryVersion().should.equal('0.0.0');
});
it('discovery service should return correct components', () => {
// Arrange
const akkasls = new AkkaServerless({
descriptorSetPath: 'test/user-function-test.desc',
});
const proxyInfo = new discovery.ProxyInfo();
proxyInfo.setProtocolMajorVersion(1);
const entity = {
serviceName: 'my-service',
options: {
includeDirs: ['./test'],
entityType: 'my-entity-type',
forwardHeaders: ['x-my-header'],
},
componentType: () => {
return 'akkaserverless.component.valueentity.ValueEntities';
},
};
const action = {
serviceName: 'my-action',
options: {
includeDirs: ['./test'],
forwardHeaders: ['x-my-header'],
},
componentType: () => {
return 'akkaserverless.component.action.Actions';
},
};
// Act
akkasls.addComponent(entity);
akkasls.addComponent(action);
const result = akkasls.discoveryLogic(proxyInfo);
// Assert
result.getComponentsList().length.should.equal(2);
const entityResult = result.getComponentsList()[0];
entityResult.getServiceName().should.equal('my-service');
entityResult
.getComponentType()
.should.equal('akkaserverless.component.valueentity.ValueEntities');
entityResult.getEntity()?.should.not.be.undefined;
entityResult.getEntity()?.getEntityType().should.equal('my-entity-type');
entityResult.getEntity()?.getPassivationStrategy()?.should.be.undefined;
entityResult
.getEntity()
?.getForwardHeadersList()
.should.have.same.members(['x-my-header']);
const actionResult = result.getComponentsList()[1];
actionResult.getServiceName().should.equal('my-action');
actionResult
.getComponentType()
.should.equal('akkaserverless.component.action.Actions');
entityResult.getComponent()?.should.not.be.undefined;
entityResult
.getComponent()
?.getForwardHeadersList()
.should.have.same.members(['x-my-header']);
});
it('discovery service should return correct components with passivation', () => {
// Arrange
const akkasls = new AkkaServerless({
descriptorSetPath: 'test/user-function-test.desc',
});
const proxyInfo = new discovery.ProxyInfo();
proxyInfo.setProtocolMajorVersion(1);
const component = {
serviceName: 'my-service',
options: {
includeDirs: ['./test'],
entityType: 'my-entity-type-2',
entityPassivationStrategy: { timeout: 10 },
},
componentType: () => {
return 'akkaserverless.component.valueentity.ValueEntities';
},
};
// Act
akkasls.addComponent(component);
const result = akkasls.discoveryLogic(proxyInfo);
// Assert
result.getComponentsList().length.should.equal(1);
const comp = result.getComponentsList()[0];
comp
.getEntity()
?.getPassivationStrategy()
?.getTimeout()
?.getTimeout()
.should.equal(10);
});
});