From 3abd4db425bdb2c89ceb3f38eb15942bc3ebaf1d Mon Sep 17 00:00:00 2001
From: cgeek <cem.moreau@gmail.com>
Date: Sun, 16 Jun 2013 19:14:28 +0200
Subject: [PATCH] NodeCoin can now be installed via NPM and run (with no HTTP
 API implementation)

---
 bin/nodecoin    |  18 ++++++
 bin/server.js   |  15 +++++
 config.js       |   3 +
 lib/main.js     |   6 --
 lib/nodecoin.js |  62 ++++++++++++++++++
 lib/pks.js      |   8 +++
 lib/udc.js      |   1 +
 package.json    |  13 +++-
 test/main.js    | 163 +++++++++++++++++++++++++++++++++++++++++++++---
 9 files changed, 272 insertions(+), 17 deletions(-)
 create mode 100755 bin/nodecoin
 create mode 100644 bin/server.js
 create mode 100644 config.js
 delete mode 100644 lib/main.js
 create mode 100644 lib/nodecoin.js
 create mode 100644 lib/pks.js
 create mode 100644 lib/udc.js

diff --git a/bin/nodecoin b/bin/nodecoin
new file mode 100755
index 000000000..1b7a6771d
--- /dev/null
+++ b/bin/nodecoin
@@ -0,0 +1,18 @@
+#!/usr/bin/env node
+var config      = require('../config'),
+    http        = require('http'),
+    nodecoin    = require('../lib/nodecoin'),
+    program   = require('commander');
+
+program
+  .version('0.0.1')
+  .option('-p, --port <port>', 'Port to listen for requests', parseInt)
+  .parse(process.argv);
+
+config.server.port = program.port || config.server.port;
+
+var app = nodecoin.express.app(config);
+
+http.createServer(app).listen(app.get('port'), function(){
+  console.log('NodeCoin server listening on port ' + app.get('port'));
+});
\ No newline at end of file
diff --git a/bin/server.js b/bin/server.js
new file mode 100644
index 000000000..727feb359
--- /dev/null
+++ b/bin/server.js
@@ -0,0 +1,15 @@
+/**
+
+  This file is for development purposes only.
+
+*/
+
+var config      = require('../config'),
+    http        = require('http'),
+    nodecoin    = require('../lib/nodecoin');
+
+var app = nodecoin.express.app(config);
+
+http.createServer(app).listen(app.get('port'), function(){
+  console.log('NodeCoin server listening on port ' + app.get('port'));
+});
diff --git a/config.js b/config.js
new file mode 100644
index 000000000..f9e10d003
--- /dev/null
+++ b/config.js
@@ -0,0 +1,3 @@
+exports.server = {
+  port     : 8081
+};
diff --git a/lib/main.js b/lib/main.js
deleted file mode 100644
index 7e132219a..000000000
--- a/lib/main.js
+++ /dev/null
@@ -1,6 +0,0 @@
-
-function emptyArray(){
-	return [];
-}
-
-module.exports = emptyArray;
\ No newline at end of file
diff --git a/lib/nodecoin.js b/lib/nodecoin.js
new file mode 100644
index 000000000..de9d1db40
--- /dev/null
+++ b/lib/nodecoin.js
@@ -0,0 +1,62 @@
+var pks      = require('./pks'),
+    udc      = require('./udc'),
+    express  = require('express'),
+    path     = require('path'),
+    nodecoin = require('../lib/nodecoin');
+// orm         = require('orm');
+
+module.exports.pks = pks;
+module.exports.udc = udc;
+module.exports.express = {
+
+  route: function(app){
+
+    function notImplemented (req, res) {
+      res.writeHead(501);
+      res.end();
+    }
+
+    app.get(    '/pks/lookup',                                  notImplemented);
+    app.post(   '/pks/add',                                     notImplemented);
+    app.post(   '/udc/amendments/submit',                       notImplemented);
+    app.get(    '/udc/amendments/view/:amendment_id/members',   notImplemented);
+    app.get(    '/udc/amendments/view/:amendment_id/self',      notImplemented);
+    app.get(    '/udc/amendments/view/:amendment_id/voters',    notImplemented);
+    app.post(   '/udc/coins/submit',                            notImplemented);
+    app.get(    '/udc/coins/view/:coin_id',                     notImplemented);
+    app.get(    '/udc/peer/list',                               notImplemented);
+    app.post(   '/udc/peer/register',                           notImplemented);
+    app.get(    '/udc/peer/self',                               notImplemented);
+    app.get(    '/udc/transactions/coin/:coin_id',              notImplemented);
+    app.get(    '/udc/transactions/recipient/:fingerprint',     notImplemented);
+    app.get(    '/udc/transactions/search',                     notImplemented);
+    app.get(    '/udc/transactions/sender/:fingerprint',        notImplemented);
+    app.post(   '/udc/transactions/submit',                     notImplemented);
+    app.get(    '/udc/transactions/view/:transaction_id',       notImplemented);
+  },
+
+  app: function (someConfig) {
+    var app = express();
+    var config = someConfig || {
+      server: { port: 8001 },
+      db: "somedb"
+    };
+
+    // all environments
+    app.set('port', process.env.PORT || config.server.port);
+    app.use(express.logger('dev'));
+    app.use(express.bodyParser());
+    app.use(express.methodOverride());
+    app.use(express.cookieParser('your secret here'));
+    app.use(express.session());
+    app.use(app.router);
+
+    // development only
+    if ('development' == app.get('env')) {
+      app.use(express.errorHandler());
+    }
+
+    this.route(app);
+    return app;
+  }
+};
\ No newline at end of file
diff --git a/lib/pks.js b/lib/pks.js
new file mode 100644
index 000000000..1e066b45e
--- /dev/null
+++ b/lib/pks.js
@@ -0,0 +1,8 @@
+module.exports = {
+
+	lookup: function (req, res) {
+	},
+
+	add: function (req, res) {
+	}
+};
\ No newline at end of file
diff --git a/lib/udc.js b/lib/udc.js
new file mode 100644
index 000000000..a09954537
--- /dev/null
+++ b/lib/udc.js
@@ -0,0 +1 @@
+module.exports = {};
\ No newline at end of file
diff --git a/package.json b/package.json
index ce077ef46..33bf0d018 100644
--- a/package.json
+++ b/package.json
@@ -2,7 +2,7 @@
   "name": "nodecoin",
   "version": "0.0.1",
   "description": "OpenUDC-like implementation using Node.js",
-  "main": "lib/main.js",
+  "main": "lib/nodecoin.js",
   "directories": {
     "test": "test"
   },
@@ -24,8 +24,17 @@
   "bugs": {
     "url": "https://github.com/c-geek/nodecoin/issues"
   },
+  "dependencies": {
+    "express": "",
+    "commander": ""
+  },
   "devDependencies": {
     "mocha": "",
-    "should": ""
+    "should": "",
+    "supertest": ""
+  },
+  "private": true,
+  "bin": {
+    "nodecoin": "./bin/nodecoin"
   }
 }
diff --git a/test/main.js b/test/main.js
index 0b0eb2f72..e540fb034 100644
--- a/test/main.js
+++ b/test/main.js
@@ -1,12 +1,157 @@
 
 var should = require('should');
-var emptyArray = require('../lib/main');
-
-describe('emptyArray', function () {
-	describe('with no arguments', function () {
-		it('returns an empty array', function () {
-			var result = emptyArray();
-			result.should.eql([]);
-		});
-	});
+var request = require('supertest');
+var nodecoin = require('../lib/nodecoin');
+
+var app = nodecoin.express.app();
+
+//----------- PKS -----------
+describe('Request on /pks/lookup', function(){
+  it('GET should respond 501', function(done){
+    request(app)
+      .get('/pks/lookup')
+      .expect(501, done);
+  });
+  it('POST should respond 404', function(done){
+    request(app)
+      .post('/pks/lookup')
+      .expect(404, done);
+  });
+});
+
+describe('Request on /pks/add', function(){
+  it('POST should respond 501', function(done){
+    request(app)
+      .post('/pks/add')
+      .expect(501, done);
+  });
+  it('GET should respond 404', function(done){
+    request(app)
+      .get('/pks/add')
+      .expect(404, done);
+  });
+});
+
+//----------- AMENDMENTS -----------
+describe('Request on /udc/amendments/view/:amendment_id/members', function(){
+  it('GET should respond 501', function(done){
+    request(app)
+      .get('/udc/amendments/view/1/members')
+      .expect(501, done);
+  });
+});
+
+describe('Request on /udc/amendments/view/:amendment_id/voters', function(){
+  it('GET should respond 501', function(done){
+    request(app)
+      .get('/udc/amendments/view/1/voters')
+      .expect(501, done);
+  });
+});
+
+describe('Request on /udc/amendments/view/:amendment_id/self', function(){
+  it('GET should respond 501', function(done){
+    request(app)
+      .get('/udc/amendments/view/1/self')
+      .expect(501, done);
+  });
+});
+
+describe('Request on /udc/amendments/submit', function(){
+  it('POST should respond 501', function(done){
+    request(app)
+      .post('/udc/amendments/submit')
+      .expect(501, done);
+  });
+});
+
+//----------- COINS -----------
+describe('Request on /udc/coins/submit', function(){
+  it('POST should respond 501', function(done){
+    request(app)
+      .post('/udc/coins/submit')
+      .expect(501, done);
+  });
+});
+
+describe('Request on /udc/coins/view/:coin_id', function(){
+  it('GET should respond 501', function(done){
+    request(app)
+      .get('/udc/coins/view/2')
+      .expect(501, done);
+  });
+});
+
+//----------- PEER -----------
+describe('Request on /udc/peer/register', function(){
+  it('POST should respond 501', function(done){
+    request(app)
+      .post('/udc/peer/register')
+      .expect(501, done);
+  });
+});
+
+describe('Request on /udc/peer/list', function(){
+  it('GET should respond 501', function(done){
+    request(app)
+      .get('/udc/peer/list')
+      .expect(501, done);
+  });
+});
+
+describe('Request on /udc/peer/self', function(){
+  it('GET should respond 501', function(done){
+    request(app)
+      .get('/udc/peer/self')
+      .expect(501, done);
+  });
+});
+
+//----------- TRANSACTIONS -----------
+describe('Request on /udc/transactions/submit', function(){
+  it('POST should respond 501', function(done){
+    request(app)
+      .post('/udc/transactions/submit')
+      .expect(501, done);
+  });
+});
+
+describe('Request on /udc/transactions/search', function(){
+  it('GET should respond 501', function(done){
+    request(app)
+      .get('/udc/transactions/search')
+      .expect(501, done);
+  });
+});
+
+describe('Request on /udc/transactions/coin/:coin_id', function(){
+  it('GET should respond 501', function(done){
+    request(app)
+      .get('/udc/transactions/coin/2')
+      .expect(501, done);
+  });
+});
+
+describe('Request on /udc/transactions/recipient/:fingerprint', function(){
+  it('GET should respond 501', function(done){
+    request(app)
+      .get('/udc/transactions/recipient/RECIPIENT_FPR')
+      .expect(501, done);
+  });
+});
+
+describe('Request on /udc/transactions/sender/:fingerprint', function(){
+  it('GET should respond 501', function(done){
+    request(app)
+      .get('/udc/transactions/sender/SENDER_FPR')
+      .expect(501, done);
+  });
+});
+
+describe('Request on /udc/transactions/view/:transaction_id', function(){
+  it('GET should respond 501', function(done){
+    request(app)
+      .get('/udc/transactions/view/TX_ID')
+      .expect(501, done);
+  });
 });
\ No newline at end of file
-- 
GitLab