122 lines
3.6 KiB
TypeScript
122 lines
3.6 KiB
TypeScript
import Contract from 'libs/contract';
|
||
|
||
describe('Contract', () => {
|
||
// From the ABI docs
|
||
// https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI#json
|
||
const testAbi = [
|
||
{
|
||
type: 'event',
|
||
name: 'Event',
|
||
inputs: [
|
||
{ name: 'a', type: 'uint256', indexed: true },
|
||
{ name: 'b', type: 'bytes32', indexed: false }
|
||
]
|
||
},
|
||
{
|
||
type: 'function',
|
||
name: 'foo',
|
||
inputs: [{ name: 'a', type: 'uint256' }],
|
||
outputs: []
|
||
}
|
||
];
|
||
const testContract = new Contract(testAbi);
|
||
|
||
// ----------------------------------------------------------------------
|
||
|
||
describe('constructor', () => {
|
||
it('should create an instance given a valid ABI', () => {
|
||
expect(testContract).toBeTruthy();
|
||
});
|
||
});
|
||
|
||
// ----------------------------------------------------------------------
|
||
|
||
describe('getMethodAbi', () => {
|
||
it('should return the a method, given the right name', () => {
|
||
const method = testContract.getMethodAbi('foo');
|
||
expect(method.name).toBe('foo');
|
||
expect(method.type).toBe('function');
|
||
expect(method.inputs.constructor).toBe(Array);
|
||
});
|
||
|
||
it('should throw if given an unknown method name', () => {
|
||
expect(() => {
|
||
testContract.getMethodAbi('gnjwakgnawk');
|
||
}).toThrow();
|
||
});
|
||
|
||
it('should throw if given a method isn’t a function', () => {
|
||
expect(() => {
|
||
testContract.getMethodAbi('Event');
|
||
}).toThrow();
|
||
});
|
||
});
|
||
|
||
// ----------------------------------------------------------------------
|
||
|
||
describe('call / encodeArgs', () => {
|
||
it('should return hex data for the method', () => {
|
||
const result = testContract.call('foo', ['1337']);
|
||
expect(result).toBe(
|
||
'0x2fbebd380000000000000000000000000000000000000000000000000000000000000539'
|
||
);
|
||
});
|
||
|
||
it('should throw, if given too few method args', () => {
|
||
expect(() => {
|
||
testContract.call('foo', []);
|
||
}).toThrow();
|
||
});
|
||
|
||
it('should throw, if given too many method args', () => {
|
||
expect(() => {
|
||
testContract.call('foo', ['1', '2']);
|
||
}).toThrow();
|
||
});
|
||
|
||
it('should throw, if given invalid args', () => {
|
||
expect(() => {
|
||
testContract.call('foo', [{ some: 'object?' }]);
|
||
}).toThrow();
|
||
});
|
||
});
|
||
|
||
// ----------------------------------------------------------------------
|
||
|
||
describe('$call / decodeArgs', () => {
|
||
it('should decode some data', () => {
|
||
const decoded = testContract.$call(
|
||
'0x2fbebd380000000000000000000000000000000000000000000000000000000000000539'
|
||
);
|
||
expect(decoded.method.name).toBe('foo');
|
||
expect(decoded.args[0].toString(10)).toBe('1337');
|
||
});
|
||
|
||
it('should return identical data from a call return', () => {
|
||
const callMethod = 'foo';
|
||
const callArgs = ['42891048912084012480129'];
|
||
const callData = testContract.call(callMethod, callArgs);
|
||
const decoded = testContract.$call(callData);
|
||
|
||
expect(decoded.method.name).toBe(callMethod);
|
||
expect(decoded.args[0].toString(10)).toBe(callArgs[0]);
|
||
});
|
||
|
||
it('should throw, if given invalid data', () => {
|
||
expect(() => {
|
||
// ETH address
|
||
testContract.$call('0x7cB57B5A97eAbe94205C07890BE4c1aD31E486A8');
|
||
}).toThrow();
|
||
});
|
||
|
||
it('should throw, if given an unknown method’s data', () => {
|
||
expect(() => {
|
||
// GNT token send data
|
||
testContract.$call(
|
||
'0xa9059cbb0000000000000000000000007cb57b5a97eabe94205c07890be4c1ad31e486a8000000000000000000000000000000000000000000000000130d2a539ba80000'
|
||
);
|
||
}).toThrow();
|
||
});
|
||
});
|
||
});
|