test.ts 6.2 KB

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