-
Notifications
You must be signed in to change notification settings - Fork 0
/
2_square.ts
125 lines (118 loc) · 3.8 KB
/
2_square.ts
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
import { SolCerberus, addressTypes } from "sol-cerberus-js";
import { DEMO_PROGRAM, SC_APP_ID, ALLOWED_WALLET, PROVIDER } from "./constants";
import { expect } from "chai";
import { demo_pda } from "./common";
describe("Square master", () => {
let solCerberus: SolCerberus = null; // Populated on before() block
let demoPda = null;
let resource = "Square";
let role = "SquareMaster";
let addPerm = "Add";
let updatePerm = "Update";
let deletePerm = "Delete";
before(async () => {
solCerberus = new SolCerberus(PROVIDER.connection, PROVIDER.wallet, {
appId: SC_APP_ID,
});
demoPda = await demo_pda(SC_APP_ID);
});
it(`Assign "${role}" role to Wallet`, async () => {
await solCerberus.assignRole(
role,
addressTypes.Wallet,
ALLOWED_WALLET.publicKey
);
});
it("Not allowed to: Add, Update, Delete", async () => {
await solCerberus.login({ wallet: ALLOWED_WALLET.publicKey });
let results: any = await Promise.allSettled([
DEMO_PROGRAM.methods
.addSquare("ff0000", 50)
.accounts({
demo: demoPda,
signer: ALLOWED_WALLET.publicKey,
...(await solCerberus.accounts("Square", "Add")),
})
.signers([ALLOWED_WALLET])
.rpc(),
DEMO_PROGRAM.methods
.updateSquare("ff0000", 50)
.accounts({
demo: demoPda,
signer: ALLOWED_WALLET.publicKey,
...(await solCerberus.accounts("Square", "Update")),
})
.signers([ALLOWED_WALLET])
.rpc(),
DEMO_PROGRAM.methods
.deleteSquare()
.accounts({
demo: demoPda,
signer: ALLOWED_WALLET.publicKey,
...(await solCerberus.accounts("Square", "Delete")),
})
.signers([ALLOWED_WALLET])
.rpc(),
]);
// Assert Add, Update, Delete are Unauthorized:
expect(3).to.equal(
results.filter(
(e) =>
e.status === "rejected" &&
e.reason.error.errorCode.code === "Unauthorized"
).length
);
// Login as authority to create "Add", "Update" and "Delete" rules
await solCerberus.login({ wallet: PROVIDER.wallet.publicKey });
await solCerberus.addRule(role, resource, addPerm);
await solCerberus.addRule(role, resource, updatePerm);
await solCerberus.addRule(role, resource, deletePerm);
// Login back as the allowed wallet
await solCerberus.login({ wallet: ALLOWED_WALLET.publicKey });
await solCerberus.fetchPerms();
});
it("Allow Add", async () => {
await DEMO_PROGRAM.methods
.addSquare("ff0000", 50)
.accounts({
demo: demoPda,
signer: ALLOWED_WALLET.publicKey,
...(await solCerberus.accounts("Square", "Add")),
})
.signers([ALLOWED_WALLET])
.rpc();
let demo = await DEMO_PROGRAM.account.demo.fetch(demoPda);
expect(demo.square.size).to.equal(50);
expect(demo.square.color).to.equal("ff0000");
});
it("Allow Update", async () => {
await DEMO_PROGRAM.methods
.updateSquare("0f0f0f", 60)
.accounts({
demo: demoPda,
signer: ALLOWED_WALLET.publicKey,
...(await solCerberus.accounts("Square", "Update")),
})
.signers([ALLOWED_WALLET])
.rpc();
let demo = await DEMO_PROGRAM.account.demo.fetch(demoPda);
expect(demo.square.size).to.equal(60);
expect(demo.square.color).to.equal("0f0f0f");
});
it("Allow Delete", async () => {
await DEMO_PROGRAM.methods
.deleteSquare()
.accounts({
demo: demoPda,
signer: ALLOWED_WALLET.publicKey,
...(await solCerberus.accounts("Square", "Delete")),
})
.signers([ALLOWED_WALLET])
.rpc();
let demo = await DEMO_PROGRAM.account.demo.fetch(demoPda);
expect(demo.square).to.equal(null);
});
after(async () => {
solCerberus.disconnect();
});
});