Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 90 additions & 0 deletions __tests__/actiontoken-expired.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
require('dotenv').config();

const request = require('supertest');
const { expect } = require('chai');
const sinon = require('sinon');
const chai = require('chai');
const seed = require('./seed');
const server = require('../server/app');

chai.use(require('chai-uuid'));


describe( 'Expired ActionToken Transfer ', ()=>{
let bearerToken;
let bearerTokenB;
let actionToken ;
let clock ;
before(async () => {

await seed.clear();
await seed.seed();
sinon.restore();

{
// Authorizes before each of the follow tests
const res = await request(server)
.post('/auth')
.set('treetracker-api-key', seed.apiKey)
.send({
wallet: seed.wallet.name,
password: seed.wallet.password,
});
expect(res).to.have.property('statusCode', 200);
bearerToken = res.body.token;
expect(bearerToken).to.match(/\S+/);
}

{
// Authorizes before each of the follow tests
const res = await request(server)
.post('/auth')
.set('treetracker-api-key', seed.apiKey)
.send({
wallet: seed.walletB.name,
password: seed.walletB.password,
});
expect(res).to.have.property('statusCode', 200);
bearerTokenB = res.body.token;
expect(bearerTokenB).to.match(/\S+/);
}
});


beforeEach(() => {
const now = new Date(); // Current date/time
const sevenDaysAgo = new Date(now.getTime() - 8 * 24 * 60 * 60 * 1000); // 7 days ago
clock = sinon.stub(Date, 'now').returns(sevenDaysAgo.getTime());

});

afterEach(() => {
clock.restore();
});


it(`Generate access tokens for walletB`, async () => {
await seed.addTokenToWallet(seed.wallet.id);
const res = await request(server)
.get(`/actiontoken/generate?email_id=rohit@gmail.com&limit=5`)
.set('treetracker-api-key', seed.apiKey)
.set('Authorization', `Bearer ${bearerToken}`);


expect(res).to.have.property('statusCode', 200);
expect(res.body).to.have.property('actionToken');
actionToken = res.body.actionToken;
});

it('WalletB User should not be able to transfer on expiry', async ()=> {
clock.restore();
const res = await request(server)
.post(`/actiontoken/transfer`)
.set('treetracker-api-key', seed.apiKey)
.set('Authorization', `Bearer ${bearerTokenB}`)
.send({actionToken});

expect(res).to.have.property('statusCode',401);
})

})
112 changes: 112 additions & 0 deletions __tests__/actiontoken-transfer.spec.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
/*
* The integration test to test the whole business, with DB
*/
require('dotenv').config();

const request = require('supertest');
const { expect } = require('chai');
const sinon = require('sinon');
const chai = require('chai');
const seed = require('./seed');
const server = require('../server/app');

chai.use(require('chai-uuid'));

describe('Generate Action Token and Transfer ', () => {
let bearerToken;
let bearerTokenB;
let actionToken ;

before(async () => {

await seed.clear();
await seed.seed(); // this inserts one token to walletA but not walletB among other
sinon.restore();

{
// Authorizes before each of the follow tests
const res = await request(server)
.post('/auth')
.set('treetracker-api-key', seed.apiKey)
.send({
wallet: seed.wallet.name,
password: seed.wallet.password,
});
expect(res).to.have.property('statusCode', 200);
bearerToken = res.body.token;
expect(bearerToken).to.match(/\S+/);
}

{
// Authorizes before each of the follow tests
const res = await request(server)
.post('/auth')
.set('treetracker-api-key', seed.apiKey)
.send({
wallet: seed.walletB.name,
password: seed.walletB.password,
});

expect(res).to.have.property('statusCode', 200);
bearerTokenB = res.body.token;
expect(bearerTokenB).to.match(/\S+/);
}
});



it(`Generate Actiontoken by wallet A`, async () => {
await seed.addTokenToWallet(seed.wallet.id);
const res = await request(server)
.get(`/actiontoken/generate?email_id=rohit@gmail.com&limit=5`)
.set('treetracker-api-key', seed.apiKey)
.set('Authorization', `Bearer ${bearerToken}`);


expect(res).to.have.property('statusCode', 200);
expect(res.body).to.have.property('actionToken');
actionToken = res.body.actionToken;

});


it(`Transfer actiontoken when B loggedIn`, async () => {
const res = await request(server)
.post(`/actiontoken/transfer`)
.set('treetracker-api-key', seed.apiKey)
.set('Authorization', `Bearer ${bearerTokenB}`)
.send({actionToken });

expect(res).to.have.property('statusCode', 200);
expect(res.body).to.have.property('id')
expect(res.body).to.have.property('state','completed')
expect(res.body.parameters.tokens.length).to.equal(2);

});



it('Get all transfers Belonging to walletA, should have one and completed', async () => {
const res = await request(server)
.get(`/transfers?wallet=${seed.walletB.name}&limit=10`)
.set('treetracker-api-key', seed.apiKey)
.set('Authorization', `Bearer ${bearerTokenB}`);

expect(res).to.have.property('statusCode', 200);
expect(res.body.transfers).lengthOf(1);
expect(res.body.transfers[0]).to.have.property('state','completed')
});


it(`walletB, GET /tokens Should have 2 tokens now`, async () => {
const res = await request(server)
.get(`/tokens?limit=10`)
.set('treetracker-api-key', seed.apiKey)
.set('Authorization', `Bearer ${bearerTokenB}`);

expect(res).to.have.property('statusCode', 200);
expect(res.body.tokens.length).to.equal(2);
});

});

40 changes: 40 additions & 0 deletions server/handlers/actiontokenHandler/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@

const ActionTokenService = require('../../services/ActionTokenService')

const { actiontokenGenerateSchema , actionTokenTransferSchema } = require('./schemas');

const generate = async (req, res) => {
const validatedQuery = await actiontokenGenerateSchema.validateAsync(req.query, { abortEarly: false });
const { email_id,limit} = validatedQuery;
const { wallet_id } = req
// send payload and this will return us the accessToken

const actionTokenService = new ActionTokenService();
const actionToken = await actionTokenService.generate(
email_id,
wallet_id,
limit
)

res.json({actionToken})
};


const transfer = async ( req,res ) => {
const validatedBody = await actionTokenTransferSchema.validateAsync(req.body, { abortEarly: false });
const { actionToken } = validatedBody
const { wallet_id } = req;

const actionTokenService = new ActionTokenService();

// verfiy actionToken
const tokens = await ActionTokenService.verify(actionToken);


const result = await actionTokenService.transferTokens( tokens , wallet_id )
// then do the transfer using the payload , if possibel
res.status(200).json(result)

}

module.exports = {generate,transfer}
13 changes: 13 additions & 0 deletions server/handlers/actiontokenHandler/schemas.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
const Joi = require('joi');

// Define the schema for validation
const actiontokenGenerateSchema = Joi.object({
email_id: Joi.string().email().required(),
limit: Joi.number().integer().min(1).max(10).required(), // Adjust the max limit as needed
});

const actionTokenTransferSchema = Joi.object({
actionToken: Joi.string().required()
});

module.exports = {actiontokenGenerateSchema,actionTokenTransferSchema}
22 changes: 22 additions & 0 deletions server/routes/actionTokenRouter.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
const express = require('express');

const router = express.Router();
const routerWrapper = express.Router();

const {
handlerWrapper,
verifyJWTHandler,
apiKeyHandler,
} = require('../utils/utils');

const {
generate,
transfer,
} = require('../handlers/actiontokenHandler');

router.get('/generate', handlerWrapper(generate));
router.post('/transfer', handlerWrapper(transfer));


routerWrapper.use('/actiontoken', apiKeyHandler, verifyJWTHandler, router);
module.exports = routerWrapper;
1 change: 1 addition & 0 deletions server/routes/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,5 @@ module.exports = [
require('./trustRouter'),
require('./walletRouter'),
require('./eventRouter'),
require('./actionTokenRouter')
];
Loading