103 lines
3.1 KiB
TypeScript
103 lines
3.1 KiB
TypeScript
import * as anchor from "@coral-xyz/anchor";
|
|
import { AnchorError, Program } from "@coral-xyz/anchor";
|
|
import { InitIfNeeded } from "../../target/types/init_if_needed";
|
|
import { SystemProgram, LAMPORTS_PER_SOL } from "@solana/web3.js";
|
|
import { expect } from "chai";
|
|
|
|
describe("init-if-needed", () => {
|
|
const provider = anchor.AnchorProvider.env();
|
|
anchor.setProvider(provider);
|
|
|
|
const program = anchor.workspace.InitIfNeeded as Program<InitIfNeeded>;
|
|
|
|
it("init_if_needed should reject a CLOSED discriminator if init is NOT NEEDED", async () => {
|
|
const account = anchor.web3.Keypair.generate();
|
|
|
|
await program.methods
|
|
.initialize(1)
|
|
.accounts({
|
|
acc: account.publicKey,
|
|
})
|
|
.signers([account])
|
|
.rpc();
|
|
|
|
const oldState = await program.account.myData.fetch(account.publicKey);
|
|
expect(oldState.val.toNumber()).to.equal(1000);
|
|
|
|
// This initialize call should fail because the account has the account discriminator
|
|
// set to the CLOSED one
|
|
try {
|
|
await program.methods
|
|
.initialize(5)
|
|
.accounts({
|
|
acc: account.publicKey,
|
|
})
|
|
.signers([account])
|
|
.preInstructions([
|
|
await program.methods
|
|
.close()
|
|
.accounts({
|
|
acc: account.publicKey,
|
|
receiver: provider.wallet.publicKey,
|
|
})
|
|
.instruction(),
|
|
SystemProgram.transfer({
|
|
fromPubkey: provider.wallet.publicKey,
|
|
toPubkey: account.publicKey,
|
|
lamports: 1 * LAMPORTS_PER_SOL,
|
|
}),
|
|
])
|
|
.rpc();
|
|
} catch (_err) {
|
|
expect(_err).to.be.instanceOf(AnchorError);
|
|
const err: AnchorError = _err;
|
|
expect(err.error.errorCode.code).to.equal("AccountDiscriminatorMismatch");
|
|
}
|
|
});
|
|
|
|
it("init_if_needed should reject a discriminator of a different account if init is NOT NEEDED", async () => {
|
|
const account = anchor.web3.Keypair.generate();
|
|
console.log("account: ", account.publicKey.toBase58());
|
|
const otherAccount = anchor.web3.Keypair.generate();
|
|
console.log("otherAccount: ", otherAccount.publicKey.toBase58());
|
|
|
|
await program.methods
|
|
.initialize(1)
|
|
.accounts({
|
|
acc: account.publicKey,
|
|
})
|
|
.signers([account])
|
|
.rpc();
|
|
|
|
const oldState = await program.account.myData.fetch(account.publicKey);
|
|
expect(oldState.val.toNumber()).to.equal(1000);
|
|
|
|
await program.methods
|
|
.secondInitialize(1)
|
|
.accounts({
|
|
acc: otherAccount.publicKey,
|
|
})
|
|
.signers([otherAccount])
|
|
.rpc();
|
|
|
|
const secondState = await program.account.otherData.fetch(
|
|
otherAccount.publicKey
|
|
);
|
|
expect(secondState.otherVal.toNumber()).to.equal(2000);
|
|
|
|
try {
|
|
await program.methods
|
|
.initialize(3)
|
|
.accounts({
|
|
acc: otherAccount.publicKey,
|
|
})
|
|
.signers([otherAccount])
|
|
.rpc();
|
|
} catch (_err) {
|
|
expect(_err).to.be.instanceOf(AnchorError);
|
|
const err: AnchorError = _err;
|
|
expect(err.error.errorCode.code).to.equal("AccountDiscriminatorMismatch");
|
|
}
|
|
});
|
|
});
|