const assert = require("assert"); const anchor = require("@project-serum/anchor"); describe("basic-1", () => { // Use a local provider. const provider = anchor.Provider.local(); // Configure the client to use the local cluster. anchor.setProvider(provider); it("Creates and initializes an account in two different transactions", async () => { // The program owning the account to create. const program = anchor.workspace.Basic1; // The Account to create. const myAccount = anchor.web3.Keypair.generate(); // Create account transaction. const tx = new anchor.web3.Transaction(); tx.add( anchor.web3.SystemProgram.createAccount({ fromPubkey: provider.wallet.publicKey, newAccountPubkey: myAccount.publicKey, space: 8 + 8, lamports: await provider.connection.getMinimumBalanceForRentExemption( 8 + 8 ), programId: program.programId, }) ); // Execute the transaction against the cluster. await provider.send(tx, [myAccount]); // Execute the RPC. // #region code-separated await program.rpc.initialize(new anchor.BN(1234), { accounts: { myAccount: myAccount.publicKey, rent: anchor.web3.SYSVAR_RENT_PUBKEY, }, }); // #endregion code-separated // Fetch the newly created account from the cluster. const account = await program.account.myAccount(myAccount.publicKey); // Check it's state was initialized. assert.ok(account.data.eq(new anchor.BN(1234))); }); // Reference to an account to use between multiple tests. let _myAccount = undefined; it("Creates and initializes an account in a single atomic transaction", async () => { // The program to execute. const program = anchor.workspace.Basic1; // #region code // The Account to create. const myAccount = anchor.web3.Keypair.generate(); // Atomically create the new account and initialize it with the program. await program.rpc.initialize(new anchor.BN(1234), { accounts: { myAccount: myAccount.publicKey, rent: anchor.web3.SYSVAR_RENT_PUBKEY, }, signers: [myAccount], instructions: [ anchor.web3.SystemProgram.createAccount({ fromPubkey: provider.wallet.publicKey, newAccountPubkey: myAccount.publicKey, space: 8 + 8, // Add 8 for the account discriminator. lamports: await provider.connection.getMinimumBalanceForRentExemption( 8 + 8 ), programId: program.programId, }), ], }); // Fetch the newly created account from the cluster. const account = await program.account.myAccount(myAccount.publicKey); // Check it's state was initialized. assert.ok(account.data.eq(new anchor.BN(1234))); // #endregion code }); it("Creates and initializes an account in a single atomic transaction (simplified)", async () => { // The program to execute. const program = anchor.workspace.Basic1; // The Account to create. const myAccount = anchor.web3.Keypair.generate(); // Atomically create the new account and initialize it with the program. // #region code-simplified await program.rpc.initialize(new anchor.BN(1234), { accounts: { myAccount: myAccount.publicKey, rent: anchor.web3.SYSVAR_RENT_PUBKEY, }, signers: [myAccount], instructions: [await program.account.myAccount.createInstruction(myAccount)], }); // #endregion code-simplified // Fetch the newly created account from the cluster. const account = await program.account.myAccount(myAccount.publicKey); // Check it's state was initialized. assert.ok(account.data.eq(new anchor.BN(1234))); // Store the account for the next test. _myAccount = myAccount; }); it("Updates a previously created account", async () => { const myAccount = _myAccount; // #region update-test // The program to execute. const program = anchor.workspace.Basic1; // Invoke the update rpc. await program.rpc.update(new anchor.BN(4321), { accounts: { myAccount: myAccount.publicKey, }, }); // Fetch the newly updated account. const account = await program.account.myAccount(myAccount.publicKey); // Check it's state was mutated. assert.ok(account.data.eq(new anchor.BN(4321))); // #endregion update-test }); });