node-onesky-utils
Version:
Node.js utils for working with OneSky translation service. Original package from @brainly/onesky-utils
187 lines (157 loc) • 5.49 kB
JavaScript
;
const privateFunctions = rootRequire('lib/privateFunctions.js');
describe('privateFunctions', function() {
let sandbox;
beforeEach(function() {
sandbox = sinon.createSandbox();
});
afterEach(function() {
sandbox.restore();
});
describe('getDevHash', function() {
it('should return an object with devHash and timestamp', function() {
const secret = 'test-secret';
const result = privateFunctions.getDevHash(secret);
expect(result).to.be.an('object');
expect(result).to.have.property('devHash');
expect(result).to.have.property('timestamp');
});
it('should return a string devHash', function() {
const secret = 'test-secret';
const result = privateFunctions.getDevHash(secret);
expect(result.devHash).to.be.a('string');
expect(result.devHash).to.have.length(32); // MD5 hash length
});
it('should return a numeric timestamp', function() {
const secret = 'test-secret';
const result = privateFunctions.getDevHash(secret);
expect(result.timestamp).to.be.a('number');
expect(result.timestamp).to.be.closeTo(Math.floor(Date.now() / 1000), 1);
});
it('should generate different hashes for different secrets', function() {
const secret1 = 'secret1';
const secret2 = 'secret2';
const result1 = privateFunctions.getDevHash(secret1);
const result2 = privateFunctions.getDevHash(secret2);
expect(result1.devHash).to.not.equal(result2.devHash);
});
it('should generate different hashes at different times', function(done) {
const secret = 'test-secret';
const result1 = privateFunctions.getDevHash(secret);
setTimeout(() => {
const result2 = privateFunctions.getDevHash(secret);
expect(result1.devHash).to.not.equal(result2.devHash);
expect(result1.timestamp).to.be.lessThan(result2.timestamp);
done();
}, 1100); // Wait for timestamp to change
});
});
describe('makeRequest', function() {
it('should make a request and handle responses', function() {
// Since makeRequest uses axios internally and we can't easily mock it
// without complex module replacement, we'll test the function signature
// and basic structure instead
const options = {
method: 'GET',
url: 'https://test.com/api'
};
const result = privateFunctions.makeRequest(options, 'Test error message');
expect(result).to.be.a('promise');
});
it('should accept request options and error message', function() {
const options = {
method: 'POST',
url: 'https://test.com/upload',
data: { field: 'value' }
};
const result = privateFunctions.makeRequest(options, 'Upload error');
expect(result).to.be.a('promise');
});
});
describe('handleError', function() {
it('should reject with parsed error from OneSky API response', function(done) {
const errorResponse = {
response: {
body: JSON.stringify({
meta: {
message: 'Invalid API key',
status: 401
}
})
}
};
privateFunctions.handleError('Custom message', errorResponse)
.catch(error => {
expect(error.message).to.equal('Invalid API key');
expect(error.code).to.equal(401);
done();
});
});
it('should handle axios-style error format', function(done) {
const errorResponse = {
response: {
body: JSON.stringify({
message: 'Request failed',
code: 500
})
}
};
privateFunctions.handleError('Request error', errorResponse)
.catch(error => {
expect(error.message).to.equal('Request failed');
expect(error.code).to.equal(500);
done();
});
});
it('should use fallback message when parsing fails', function(done) {
const errorResponse = {
response: {
body: 'invalid json'
}
};
privateFunctions.handleError('Fallback message', errorResponse)
.catch(error => {
expect(error.message).to.equal('Fallback message');
expect(error.code).to.equal(500);
done();
});
});
it('should handle response with statusCode', function(done) {
this.timeout(5000); // Increase timeout for debugging
const errorResponse = {
response: {
body: 'invalid json',
statusCode: 404
}
};
privateFunctions.handleError('Not found', errorResponse)
.then(() => {
done(new Error('Should not resolve'));
})
.catch(error => {
try {
expect(error.message).to.equal('Not found');
expect(error.code).to.equal(404);
done();
} catch (e) {
done(e);
}
})
.catch(done); // Catch any unhandled errors
});
it('should always reject (never resolve)', function(done) {
const errorResponse = {
response: {
body: JSON.stringify({ meta: { message: 'Test', status: 200 } })
}
};
privateFunctions.handleError('Test message', errorResponse)
.then(() => {
done(new Error('Should not resolve'));
})
.catch(() => {
done(); // Expected to reject
});
});
});
});