-
Notifications
You must be signed in to change notification settings - Fork 9
/
EngineSupplychainSpec.js
157 lines (121 loc) · 6.99 KB
/
EngineSupplychainSpec.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
'use strict'
const AdminConnection = require('composer-admin').AdminConnection
const BusinessNetworkConnection = require('composer-client').BusinessNetworkConnection
const { BusinessNetworkDefinition, CertificateUtil, IdCard } = require('composer-common')
const path = require('path')
const helpers = require('./helpers')
require('chai').should()
const namespace = 'org.acme.enginesupplychain'
describe('EngineSupplychainSpec', () => {
// In-memory card store for testing so cards are not persisted to the file system
const cardStore = require('composer-common').NetworkCardStoreManager.getCardStore( { type: 'composer-wallet-inmemory' } )
let adminConnection
let bnc
// test resources
let testManufacturer
let testMerchant
let testEngine
let testCar
// and their registries
let manufacturerRegistry
let merchantRegistry
let engineRegistry
let carRegistry
before(async () => {
// Embedded connection used for local testing
const connectionProfile = { name: 'embedded', 'x-type': 'embedded' }
// Generate certificates for use with the embedded connection
const credentials = CertificateUtil.generate({ commonName: 'admin' })
// PeerAdmin identity used with the admin connection to deploy business networks
const deployerMetadata = { version: 1, userName: 'PeerAdmin', roles: [ 'PeerAdmin', 'ChannelAdmin' ] }
const deployerCard = new IdCard(deployerMetadata, connectionProfile)
deployerCard.setCredentials(credentials)
const deployerCardName = 'PeerAdmin'
adminConnection = new AdminConnection({ cardStore: cardStore })
await adminConnection.importCard(deployerCardName, deployerCard)
await adminConnection.connect(deployerCardName)
})
beforeEach(async () => {
bnc = new BusinessNetworkConnection({ cardStore: cardStore })
const adminUserName = 'admin'
let adminCardName
let businessNetworkDefinition = await BusinessNetworkDefinition.fromDirectory(path.resolve(__dirname, '..'))
// Install the Composer runtime for the new business network
await adminConnection.install(businessNetworkDefinition)
// Start the business network and configure an network admin identity
const startOptions = { networkAdmins: [ { userName: adminUserName, enrollmentSecret: 'adminpw' } ] }
const adminCards = await adminConnection.start(businessNetworkDefinition.getName(), businessNetworkDefinition.getVersion(), startOptions)
// Import the network admin identity for us to use
adminCardName = `${adminUserName}@${businessNetworkDefinition.getName()}`
await adminConnection.importCard(adminCardName, adminCards.get(adminUserName))
// Connect to the business network using the network admin identity
await bnc.connect(adminCardName)
const factory = bnc.getBusinessNetwork().getFactory()
manufacturerRegistry = await bnc.getParticipantRegistry(namespace + '.Manufacturer')
merchantRegistry = await bnc.getParticipantRegistry(namespace + '.Merchant')
engineRegistry = await bnc.getAssetRegistry(namespace + '.Engine')
carRegistry = await bnc.getAssetRegistry(namespace + '.Car')
testManufacturer = helpers.createManufacturer(namespace, factory, 'test-manufacturer')
testMerchant = helpers.createMerchant(namespace, factory, 'test-merchant')
testEngine = helpers.createEngine(namespace, factory, 'test-engine', testManufacturer)
testCar = helpers.createCar(namespace, factory, 'test-car')
await manufacturerRegistry.addAll([testManufacturer])
await merchantRegistry.addAll([testMerchant])
await engineRegistry.addAll([testEngine])
await carRegistry.addAll([testCar])
})
describe('createEngineAsset', () => {
it('should create an Engine by submitting a valid EngineCreation transaction', async () => {
const factory = bnc.getBusinessNetwork().getFactory()
const engineCreationTrans = factory.newTransaction(namespace, 'EngineCreation')
engineCreationTrans.data = factory.newConcept(namespace, 'EngineProperties')
engineCreationTrans.data.brand = 'Audi'
engineCreationTrans.data.model = 'Fancy engine model'
engineCreationTrans.data.horsePower = 400
engineCreationTrans.data.cubicCapacity = 4000
engineCreationTrans.data.cylindersAmount = 10
const manufacturerRegistry = await bnc.getParticipantRegistry(namespace + '.Manufacturer')
await manufacturerRegistry.addAll([])
engineCreationTrans.manufacturer = factory.newRelationship(namespace, 'Manufacturer', testManufacturer.$identifier)
await bnc.submitTransaction(engineCreationTrans)
const allEngines = await engineRegistry.getAll()
allEngines.length.should.equal(2)
})
})
describe('transferEngineToMerchant', () => {
it('should set the reference to a merchant for an engine', async () => {
const factory = bnc.getBusinessNetwork().getFactory()
const transferTrans = factory.newTransaction(namespace, 'EngineMerchantTransfer')
transferTrans.merchant = factory.newRelationship(namespace, 'Merchant', testMerchant.$identifier)
transferTrans.engine = factory.newRelationship(namespace, 'Engine', testEngine.$identifier)
await bnc.submitTransaction(transferTrans)
const allEngines = await engineRegistry.getAll()
allEngines.length.should.equal(1)
allEngines[0].merchant.$identifier.should.equal(testMerchant.$identifier)
})
})
describe('installEngineToCar', () => {
it('should set the reference to a car for an engine', async () => {
const factory = bnc.getBusinessNetwork().getFactory()
const installTrans = factory.newTransaction(namespace, 'EngineCarInstallation')
installTrans.engine = factory.newRelationship(namespace, 'Engine', testEngine.$identifier)
installTrans.car = factory.newRelationship(namespace, 'Car', testCar.$identifier)
await bnc.submitTransaction(installTrans)
const allEngines = await engineRegistry.getAll()
allEngines.length.should.equal(1)
allEngines[0].currentCar.$identifier.should.equal(testCar.$identifier)
})
})
describe('createCar', () => {
it('should insert a new Car asset', async () => {
const factory = bnc.getBusinessNetwork().getFactory()
const createCarTrans = factory.newTransaction(namespace, 'CarCreation')
createCarTrans.legalIdDocument = 'some-important-car-id'
await bnc.submitTransaction(createCarTrans)
const allCars = await carRegistry.getAll()
allCars.length.should.equal(2)
allCars[0].legalDocumentId.should.equal('some-important-car-id')
allCars[1].legalDocumentId.should.equal('legal-id-of-this-car')
})
})
})