1
0
mirror of https://github.com/oceanprotocol-archive/squid-js.git synced 2024-02-02 15:31:51 +01:00
squid-js/test/ocean/ServiceAgreement.test.ts

203 lines
8.2 KiB
TypeScript
Raw Normal View History

2018-10-29 17:28:40 +01:00
import {assert} from "chai"
import ConfigProvider from "../../src/ConfigProvider"
import { Condition } from "../../src/ddo/Condition"
import { DDO } from "../../src/ddo/DDO"
import { Service } from "../../src/ddo/Service"
2018-10-29 17:28:40 +01:00
import Account from "../../src/ocean/Account"
2018-12-17 15:54:58 +01:00
import DID from "../../src/ocean/DID"
2019-02-14 12:37:52 +01:00
import { generateId } from "../../src/utils/GeneratorHelpers"
2018-10-29 17:28:40 +01:00
import Ocean from "../../src/ocean/Ocean"
2018-11-05 14:56:14 +01:00
import ServiceAgreement from "../../src/ocean/ServiceAgreements/ServiceAgreement"
import ServiceAgreementTemplate from "../../src/ocean/ServiceAgreements/ServiceAgreementTemplate"
import Access from "../../src/ocean/ServiceAgreements/Templates/Access"
2018-11-19 12:16:11 +01:00
import WebServiceConnectorProvider from "../../src/utils/WebServiceConnectorProvider"
2018-10-30 08:30:05 +01:00
import config from "../config"
import TestContractHandler from "../keeper/TestContractHandler"
2018-11-19 12:16:11 +01:00
import WebServiceConnectorMock from "../mocks/WebServiceConnector.mock"
import { metadataMock } from "../testdata/MetaData"
2018-10-29 17:28:40 +01:00
let ocean: Ocean
let accounts: Account[]
let publisherAccount: Account
let consumerAccount: Account
2019-02-15 23:40:55 +01:00
let accessService: Service<"Access">
let metaDataService: Service<"Metadata">
2018-10-29 17:28:40 +01:00
2018-12-17 15:54:58 +01:00
const did: DID = DID.generate()
2018-11-20 10:43:11 +01:00
2018-10-29 17:28:40 +01:00
describe("ServiceAgreement", () => {
const metadata = metadataMock
2018-10-29 17:28:40 +01:00
before(async () => {
ConfigProvider.setConfig(config)
await TestContractHandler.prepareContracts()
2018-10-29 17:28:40 +01:00
ocean = await Ocean.getInstance(config)
accounts = await ocean.getAccounts()
publisherAccount = accounts[1]
consumerAccount = accounts[2]
const serviceAgreementTemplate: ServiceAgreementTemplate =
new ServiceAgreementTemplate(new Access())
2018-11-05 10:01:58 +01:00
2018-12-17 15:54:58 +01:00
const conditions: Condition[] = await serviceAgreementTemplate.getConditions(metadata, did.getId())
accessService = {
2018-11-14 15:44:25 +01:00
type: "Access",
serviceDefinitionId: "0",
2018-11-14 15:44:25 +01:00
templateId: serviceAgreementTemplate.getId(),
conditions,
}
metaDataService = {
type: "Metadata",
2018-11-20 10:43:11 +01:00
metadata,
}
2018-10-29 17:28:40 +01:00
})
2018-11-07 08:43:04 +01:00
describe("#signServiceAgreement()", () => {
2018-11-12 08:33:19 +01:00
it("should sign an service agreement", async () => {
2018-12-17 15:54:58 +01:00
const ddo = new DDO({id: did.getDid(), service: [accessService]})
2019-02-14 12:37:52 +01:00
const serviceAgreementId: string = generateId()
2018-11-12 08:33:19 +01:00
// @ts-ignore
2018-11-19 12:16:11 +01:00
WebServiceConnectorProvider.setConnector(new WebServiceConnectorMock(ddo))
2018-11-12 08:33:19 +01:00
const serviceAgreementSignature: string =
2018-12-17 15:54:58 +01:00
await ServiceAgreement.signServiceAgreement(ddo, accessService.serviceDefinitionId,
2018-11-14 15:44:25 +01:00
serviceAgreementId, consumerAccount)
2018-11-12 08:33:19 +01:00
assert(serviceAgreementSignature)
assert(serviceAgreementSignature.startsWith("0x"))
2018-11-26 11:04:05 +01:00
assert(serviceAgreementSignature.length === 132)
2018-11-12 08:33:19 +01:00
})
})
describe("#executeServiceAgreement()", () => {
2019-01-30 15:35:31 +01:00
it("should execute a service agreement", async () => {
2018-10-29 17:28:40 +01:00
2018-12-17 15:54:58 +01:00
const ddo = new DDO({id: did.getDid(), service: [accessService]})
2019-02-14 12:37:52 +01:00
const serviceAgreementId: string = generateId()
2018-11-05 10:01:58 +01:00
// @ts-ignore
2018-11-19 12:16:11 +01:00
WebServiceConnectorProvider.setConnector(new WebServiceConnectorMock(ddo))
2018-11-12 08:33:19 +01:00
const serviceAgreementSignature: string =
2018-12-17 15:54:58 +01:00
await ServiceAgreement.signServiceAgreement(ddo, accessService.serviceDefinitionId,
2018-11-14 15:44:25 +01:00
serviceAgreementId, consumerAccount)
2018-11-12 08:33:19 +01:00
2018-10-29 17:28:40 +01:00
const serviceAgreement: ServiceAgreement =
2018-12-17 15:54:58 +01:00
await ServiceAgreement.executeServiceAgreement(did, ddo, accessService.serviceDefinitionId,
2018-11-14 15:44:25 +01:00
serviceAgreementId, serviceAgreementSignature, consumerAccount, publisherAccount)
2018-10-29 17:28:40 +01:00
assert(serviceAgreement)
2018-11-05 10:01:58 +01:00
const serviceDefinitionId = serviceAgreement.getId()
assert(serviceDefinitionId)
2018-12-17 15:54:58 +01:00
assert(serviceDefinitionId !== did.getId())
2018-10-29 17:28:40 +01:00
})
it("should throw on invalid sig", (done) => {
const ddo = new DDO({id: did.getDid(), service: [accessService]})
2019-02-14 12:37:52 +01:00
const serviceAgreementId: string = generateId()
// @ts-ignore
WebServiceConnectorProvider.setConnector(new WebServiceConnectorMock(ddo))
ServiceAgreement.executeServiceAgreement(did, ddo, accessService.serviceDefinitionId,
serviceAgreementId, "0x00", consumerAccount, publisherAccount)
.catch((err) => {
done()
})
})
2018-10-29 17:28:40 +01:00
})
2018-11-23 16:09:31 +01:00
describe("#payAsset()", () => {
2018-11-22 09:22:27 +01:00
it("should lock the payment in that service agreement", async () => {
2018-12-17 15:54:58 +01:00
const ddo = new DDO({id: did.getDid(), service: [accessService, metaDataService]})
2019-02-14 12:37:52 +01:00
const serviceAgreementId: string = generateId()
// @ts-ignore
WebServiceConnectorProvider.setConnector(new WebServiceConnectorMock(ddo))
2018-11-22 13:14:38 +01:00
const serviceAgreementSignature: string =
2018-12-17 15:54:58 +01:00
await ServiceAgreement.signServiceAgreement(ddo, accessService.serviceDefinitionId,
serviceAgreementId, consumerAccount)
assert(serviceAgreementSignature)
const serviceAgreement: ServiceAgreement =
2018-12-17 15:54:58 +01:00
await ServiceAgreement.executeServiceAgreement(did, ddo, accessService.serviceDefinitionId,
serviceAgreementId, serviceAgreementSignature, consumerAccount, publisherAccount)
assert(serviceAgreement)
2018-11-22 09:22:27 +01:00
// get funds
await consumerAccount.requestTokens(metaDataService.metadata.base.price)
2018-12-17 15:54:58 +01:00
const paid: boolean = await serviceAgreement.payAsset(did.getId(), metaDataService.metadata.base.price,
consumerAccount)
assert(paid)
})
})
describe("#grantAccess()", () => {
2018-11-22 10:56:06 +01:00
it("should grant access in that service agreement", async () => {
2018-12-17 15:54:58 +01:00
const ddo = new DDO({id: did.getDid(), service: [accessService]})
2019-02-14 12:37:52 +01:00
const serviceAgreementId: string = generateId()
2018-11-05 10:01:58 +01:00
// @ts-ignore
2018-11-19 12:16:11 +01:00
WebServiceConnectorProvider.setConnector(new WebServiceConnectorMock(ddo))
2018-11-12 08:33:19 +01:00
const serviceAgreementSignature: string =
2018-12-17 15:54:58 +01:00
await ServiceAgreement.signServiceAgreement(ddo, accessService.serviceDefinitionId,
2018-11-14 15:44:25 +01:00
serviceAgreementId, consumerAccount)
2018-11-12 08:33:19 +01:00
assert(serviceAgreementSignature)
const serviceAgreement: ServiceAgreement =
2018-12-17 15:54:58 +01:00
await ServiceAgreement.executeServiceAgreement(did, ddo, accessService.serviceDefinitionId,
2018-11-14 15:44:25 +01:00
serviceAgreementId, serviceAgreementSignature, consumerAccount, publisherAccount)
assert(serviceAgreement)
2018-11-22 09:22:27 +01:00
// get funds
2019-02-14 12:37:52 +01:00
try {
// Allowing 1 more retry
await consumerAccount.requestTokens(metaDataService.metadata.base.price)
} catch(e) {
await consumerAccount.requestTokens(metaDataService.metadata.base.price)
}
2018-11-22 09:22:27 +01:00
2018-12-17 15:54:58 +01:00
const paid: boolean = await serviceAgreement.payAsset(did.getId(), metaDataService.metadata.base.price,
2018-11-22 09:22:27 +01:00
consumerAccount)
assert(paid)
2018-11-22 13:14:38 +01:00
// todo: use document id
2019-01-30 15:35:31 +01:00
const accessGranted: boolean = await serviceAgreement.grantAccess(did.getId(), publisherAccount)
assert(accessGranted)
2018-10-29 17:28:40 +01:00
})
2018-11-22 10:56:06 +01:00
2018-11-22 13:14:38 +01:00
it("should fail to grant grant access if there is no payment", async () => {
2018-11-22 10:56:06 +01:00
2018-12-17 15:54:58 +01:00
const ddo = new DDO({id: did.getDid(), service: [accessService]})
2019-02-14 12:37:52 +01:00
const serviceAgreementId: string = generateId()
2018-11-22 10:56:06 +01:00
// @ts-ignore
WebServiceConnectorProvider.setConnector(new WebServiceConnectorMock(ddo))
const serviceAgreementSignature: string =
2018-12-17 15:54:58 +01:00
await ServiceAgreement.signServiceAgreement(ddo, accessService.serviceDefinitionId,
2018-11-22 10:56:06 +01:00
serviceAgreementId, consumerAccount)
assert(serviceAgreementSignature)
const serviceAgreement: ServiceAgreement =
2018-12-17 15:54:58 +01:00
await ServiceAgreement.executeServiceAgreement(did, ddo, accessService.serviceDefinitionId,
2018-11-22 10:56:06 +01:00
serviceAgreementId, serviceAgreementSignature, consumerAccount, publisherAccount)
assert(serviceAgreement)
2018-11-22 13:14:38 +01:00
// todo: use document id
2019-01-30 15:35:31 +01:00
const accessGranted: boolean = await serviceAgreement.grantAccess(did.getId(), publisherAccount)
2018-11-22 10:56:06 +01:00
assert(!accessGranted)
})
2018-10-29 17:28:40 +01:00
})
})