registration.spec.js 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262
  1. 'use strict';
  2. const { expect } = require('chai');
  3. const { v4 } = require('uuid');
  4. const { sequelize } = require('../../../db');
  5. const {
  6. cancelParty,
  7. query,
  8. registerParty,
  9. } = require('../../../processes/registration');
  10. describe('VEN registration', function() {
  11. before(async () => {
  12. await sequelize.sync();
  13. });
  14. describe('registerParty', function() {
  15. let venId, commonName, registrationResponse;
  16. beforeEach(async () => {
  17. venId = v4().replace(/-/g, '').substring(0, 20).toUpperCase().match(/.{2}/g).join(':');
  18. const requestId = v4().replace(/-/g, '');
  19. commonName = v4().replace(/-/g, '').substring(0, 12);
  20. const request = {
  21. requestId: requestId,
  22. venId: venId,
  23. oadrProfileName: '2.0b',
  24. oadrTransportName: 'simplehttp',
  25. oadrReportOnly: false,
  26. oadrXmlSignature: false,
  27. oadrVenName: `VEN ${commonName}`,
  28. oadrHttpPullModel: true
  29. };
  30. registrationResponse = await registerParty(request, commonName, venId);
  31. });
  32. it('allows registration of a new VEN', async () => {
  33. expect(registrationResponse.registrationId).to.be.a('string');
  34. });
  35. it('rejects VEN with non-matching venId', async () => {
  36. const venId = v4().replace(/-/g, '').substring(0, 20).toUpperCase().match(/.{2}/g).join(':');
  37. const requestId = v4().replace(/-/g, '');
  38. const commonName = v4().replace(/-/g, '').substring(0, 12);
  39. const request = {
  40. requestId: requestId,
  41. venId: venId,
  42. oadrProfileName: '2.0b',
  43. oadrTransportName: 'simplehttp',
  44. oadrReportOnly: false,
  45. oadrXmlSignature: false,
  46. oadrVenName: `VEN ${commonName}`,
  47. oadrHttpPullModel: true
  48. };
  49. let exception;
  50. try {
  51. await registerParty(request, commonName, `${venId}:FF`);
  52. } catch (e) {
  53. exception = e;
  54. }
  55. expect(exception).is.an('error');
  56. expect(exception.message).to.eql('VenID does not match certificate');
  57. });
  58. it('rejects registration when common name changes', async () => {
  59. const requestId = v4().replace(/-/g, '');
  60. const commonName2 = v4().replace(/-/g, '').substring(0, 12);
  61. const request = {
  62. requestId: requestId,
  63. venId: venId,
  64. oadrProfileName: '2.0b',
  65. oadrTransportName: 'simplehttp',
  66. oadrReportOnly: false,
  67. oadrXmlSignature: false,
  68. oadrVenName: `VEN ${commonName}`,
  69. oadrHttpPullModel: true
  70. };
  71. let exception;
  72. try {
  73. await registerParty(request, commonName2, venId);
  74. } catch (e) {
  75. exception = e;
  76. }
  77. expect(exception).is.an('error');
  78. expect(exception.message).to.eql('Client certificate CN mismatch');
  79. });
  80. it('rejects registration with existing common name but different venId', async () => {
  81. const requestId = v4().replace(/-/g, '');
  82. const venId2 = v4().replace(/-/g, '').substring(0, 20).toUpperCase().match(/.{2}/g).join(':');
  83. const request = {
  84. requestId: requestId,
  85. venId: venId2,
  86. oadrProfileName: '2.0b',
  87. oadrTransportName: 'simplehttp',
  88. oadrReportOnly: false,
  89. oadrXmlSignature: false,
  90. oadrVenName: `VEN ${commonName}`,
  91. oadrHttpPullModel: true
  92. };
  93. let exception;
  94. try {
  95. await registerParty(request, commonName, venId2);
  96. } catch (e) {
  97. exception = e;
  98. }
  99. expect(exception).is.an('error');
  100. expect(exception.message).to.eql('Ven already exists with that CN');
  101. });
  102. });
  103. describe('query', function() {
  104. let venId, commonName, queryResponse;
  105. beforeEach(async () => {
  106. venId = v4().replace(/-/g, '').substring(0, 20).toUpperCase().match(/.{2}/g).join(':');
  107. const requestId = v4().replace(/-/g, '');
  108. commonName = v4().replace(/-/g, '').substring(0, 12);
  109. const request = {
  110. requestId: requestId
  111. };
  112. queryResponse = await query(request, commonName, venId);
  113. });
  114. it('does not return venId or registrationId for new device', async () => {
  115. expect(queryResponse.registrationId).to.be.undefined;
  116. expect(queryResponse.venId).to.be.undefined;
  117. });
  118. it('returns registrationId if already registered', async () => {
  119. venId = v4().replace(/-/g, '').substring(0,20).toUpperCase().match(/.{2}/g).join(':');
  120. const requestId = v4().replace(/-/g, '');
  121. commonName = v4().replace(/-/g, '').substring(0, 12);
  122. const registerRequest = {
  123. requestId: requestId,
  124. venId: venId,
  125. oadrProfileName: '2.0b',
  126. oadrTransportName: 'simplehttp',
  127. oadrReportOnly: false,
  128. oadrXmlSignature: false,
  129. oadrVenName: `VEN ${commonName}`,
  130. oadrHttpPullModel: true
  131. };
  132. const registrationResponse = await registerParty(registerRequest, commonName, venId);
  133. const initialRegistrationId = registrationResponse.registrationId;
  134. const queryRequest = {
  135. requestId: requestId
  136. };
  137. queryResponse = await query(queryRequest, commonName, venId);
  138. expect(queryResponse.registrationId).to.eql(initialRegistrationId);
  139. expect(queryResponse.venId).to.eql(venId);
  140. });
  141. });
  142. describe('cancelParty', function() {
  143. let venId, commonName, registrationResponse;
  144. beforeEach(async () => {
  145. venId = v4().replace(/-/g, '').substring(0, 20).toUpperCase().match(/.{2}/g).join(':');
  146. const requestId = v4().replace(/-/g, '');
  147. commonName = v4().replace(/-/g, '').substring(0, 12);
  148. const request = {
  149. requestId: requestId,
  150. venId: venId,
  151. oadrProfileName: '2.0b',
  152. oadrTransportName: 'simplehttp',
  153. oadrReportOnly: false,
  154. oadrXmlSignature: false,
  155. oadrVenName: `VEN ${commonName}`,
  156. oadrHttpPullModel: true
  157. };
  158. registrationResponse = await registerParty(request, commonName, venId);
  159. });
  160. it('successfully cancels an existing registration', async () => {
  161. const cancelRequestId = v4().replace(/-/g, '');
  162. const cancelRequest = {
  163. requestId: cancelRequestId,
  164. registrationId: registrationResponse.registrationId,
  165. venId: venId
  166. };
  167. const cancelResponse = await cancelParty(cancelRequest, commonName, venId);
  168. expect(cancelResponse.responseCode).to.eql('200');
  169. expect(cancelResponse.responseDescription).to.eql('OK');
  170. expect(cancelResponse.responseRequestId).to.eql(cancelRequestId);
  171. expect(cancelResponse.venId).to.eql(venId);
  172. });
  173. it('fails if no registrationId is specified', async () => {
  174. const cancelRequestId = v4().replace(/-/g, '');
  175. const cancelRequest = {
  176. requestId: cancelRequestId,
  177. venId: venId
  178. };
  179. let error;
  180. try {
  181. await cancelParty(cancelRequest, commonName, venId);
  182. } catch (e) {
  183. error = e;
  184. }
  185. expect(error).to.be.an('error');
  186. expect(error.message).to.eql('No registrationID in request');
  187. });
  188. it('fails if venID does not match certificate', async () => {
  189. const otherVenId = v4().replace(/-/g, '');
  190. const cancelRequestId = v4().replace(/-/g, '');
  191. const cancelRequest = {
  192. requestId: cancelRequestId,
  193. registrationId: registrationResponse.registrationId,
  194. venId: venId
  195. };
  196. let error;
  197. try {
  198. await cancelParty(cancelRequest, commonName, otherVenId);
  199. } catch (e) {
  200. error = e;
  201. }
  202. expect(error).to.be.an('error');
  203. expect(error.message).to.eql('VenID does not match certificate');
  204. });
  205. it('fails if no current registration to cancel', async () => {
  206. const cancelRequestId = v4().replace(/-/g, '');
  207. const cancelRequest = {
  208. requestId: cancelRequestId,
  209. registrationId: registrationResponse.registrationId,
  210. venId: venId
  211. };
  212. // first cancellation
  213. await cancelParty(cancelRequest, commonName, venId);
  214. let error;
  215. try {
  216. // second cancellation
  217. await cancelParty(cancelRequest, commonName, venId);
  218. } catch (e) {
  219. error = e;
  220. }
  221. expect(error).to.be.an('error');
  222. expect(error.message).to.eql('No current registration for VenID');
  223. });
  224. });
  225. });