test.ts 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. import { Connection, Keypair, PublicKey, SystemProgram, Transaction, sendAndConfirmTransaction } from '@solana/web3.js';
  2. import { describe, it } from 'mocha';
  3. import {
  4. type AddCarArgs,
  5. Car,
  6. RentalOrder,
  7. RentalOrderStatus,
  8. createAddCarInstruction,
  9. createBookRentalInstruction,
  10. createPickUpCarInstruction,
  11. createReturnCarInstruction,
  12. } from './generated';
  13. function loadKeypairFromFile(path: string): Keypair {
  14. return Keypair.fromSecretKey(Buffer.from(JSON.parse(require('node:fs').readFileSync(path, 'utf-8'))));
  15. }
  16. const carBmw: AddCarArgs = {
  17. year: 2020,
  18. make: 'BMW',
  19. model: 'iX1',
  20. };
  21. const carMercedes: AddCarArgs = {
  22. year: 2019,
  23. make: 'Mercedes-Benz',
  24. model: 'EQS',
  25. };
  26. const rentalInfo = {
  27. name: 'Fred Flinstone',
  28. pickUpDate: '01/28/2023 8:00 AM',
  29. returnDate: '01/28/2023 10:00 PM',
  30. price: 300,
  31. };
  32. describe('Car Rental Service', () => {
  33. const connection = new Connection('https://api.devnet.solana.com', 'confirmed');
  34. const payer = loadKeypairFromFile(`${require('node:os').homedir()}/.config/solana/id.json`);
  35. const program = loadKeypairFromFile('./program/target/deploy/car_rental_service-keypair.json');
  36. let bmwPublicKey: PublicKey;
  37. let mercedesPublicKey: PublicKey;
  38. async function createCar(car: AddCarArgs): Promise<PublicKey> {
  39. const carAccountPublicKey = PublicKey.findProgramAddressSync(
  40. [Buffer.from('car'), Buffer.from(car.make), Buffer.from(car.model)],
  41. program.publicKey,
  42. )[0];
  43. const ix = createAddCarInstruction(
  44. {
  45. carAccount: carAccountPublicKey,
  46. payer: payer.publicKey,
  47. systemProgram: SystemProgram.programId,
  48. },
  49. { addCarArgs: { ...car } },
  50. );
  51. const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer], { skipPreflight: true });
  52. await connection.confirmTransaction(sx);
  53. const carData = await Car.fromAccountAddress(connection, carAccountPublicKey);
  54. console.log('New car created:');
  55. console.log(` Year : ${carData.year}`);
  56. console.log(` Make : ${carData.make}`);
  57. console.log(` Model : ${carData.model}`);
  58. return carAccountPublicKey;
  59. }
  60. it('Create a car that can be rented', async () => {
  61. bmwPublicKey = await createCar(carBmw);
  62. });
  63. it('Create another car that can be rented', async () => {
  64. mercedesPublicKey = await createCar(carMercedes);
  65. });
  66. const evaluateStatus = (status: RentalOrderStatus): string => {
  67. if (status === RentalOrderStatus.Created) return 'Created';
  68. if (status === RentalOrderStatus.PickedUp) return 'Picked Up';
  69. return 'Returned';
  70. };
  71. async function printRentalDetails(rentalPublicKey: PublicKey, carPublicKey: PublicKey) {
  72. const rentalData = await RentalOrder.fromAccountAddress(connection, rentalPublicKey);
  73. const carData = await Car.fromAccountAddress(connection, carPublicKey);
  74. console.log('Rental booked:');
  75. console.log(' Vehicle details:');
  76. console.log(` Year : ${carData.year}`);
  77. console.log(` Make : ${carData.make}`);
  78. console.log(` Model : ${carData.model}`);
  79. console.log(` Name : ${rentalData.name}`);
  80. console.log(` Pick Up : ${rentalData.pickUpDate}`);
  81. console.log(` Return : ${rentalData.returnDate}`);
  82. console.log(` Price : ${rentalData.price}`);
  83. console.log(` Status : ${evaluateStatus(rentalData.status)}`);
  84. }
  85. it('Book a new rental', async () => {
  86. const rentalAccountPublicKey = PublicKey.findProgramAddressSync(
  87. [Buffer.from('rental_order'), bmwPublicKey.toBuffer(), payer.publicKey.toBuffer()],
  88. program.publicKey,
  89. )[0];
  90. const ix = createBookRentalInstruction(
  91. {
  92. rentalAccount: rentalAccountPublicKey,
  93. carAccount: bmwPublicKey,
  94. payer: payer.publicKey,
  95. systemProgram: SystemProgram.programId,
  96. },
  97. {
  98. bookRentalArgs: { ...rentalInfo },
  99. },
  100. );
  101. const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]);
  102. await connection.confirmTransaction(sx);
  103. await printRentalDetails(rentalAccountPublicKey, bmwPublicKey);
  104. });
  105. it('Pick up your rental car', async () => {
  106. const rentalAccountPublicKey = PublicKey.findProgramAddressSync(
  107. [Buffer.from('rental_order'), bmwPublicKey.toBuffer(), payer.publicKey.toBuffer()],
  108. program.publicKey,
  109. )[0];
  110. const ix = createPickUpCarInstruction({
  111. rentalAccount: rentalAccountPublicKey,
  112. carAccount: bmwPublicKey,
  113. payer: payer.publicKey,
  114. });
  115. const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]);
  116. await connection.confirmTransaction(sx);
  117. await printRentalDetails(rentalAccountPublicKey, bmwPublicKey);
  118. });
  119. it('Return your rental car', async () => {
  120. const rentalAccountPublicKey = PublicKey.findProgramAddressSync(
  121. [Buffer.from('rental_order'), bmwPublicKey.toBuffer(), payer.publicKey.toBuffer()],
  122. program.publicKey,
  123. )[0];
  124. const ix = createReturnCarInstruction({
  125. rentalAccount: rentalAccountPublicKey,
  126. carAccount: bmwPublicKey,
  127. payer: payer.publicKey,
  128. });
  129. const sx = await sendAndConfirmTransaction(connection, new Transaction().add(ix), [payer]);
  130. await connection.confirmTransaction(sx);
  131. await printRentalDetails(rentalAccountPublicKey, bmwPublicKey);
  132. });
  133. });