1+ // SPDX-License-Identifier: MIT
2+ pragma solidity ^ 0.8.19 ;
3+
4+ import "forge-std/Test.sol " ;
5+ import "../src/HammerSupplyChain.sol " ;
6+
7+ contract HammerSupplyChainTest is Test {
8+ HammerSupplyChainFactory factory;
9+ address handleContract;
10+ address shaftContract;
11+ address headContract;
12+ address hammerContract;
13+
14+ address owner = address (0x1 );
15+ address customer = address (0x2 );
16+
17+ function setUp () public {
18+ vm.startPrank (owner);
19+
20+ factory = new HammerSupplyChainFactory ();
21+
22+ // Deploy the supply chain
23+ (handleContract, shaftContract, headContract, hammerContract) = factory.deploySupplyChain (
24+ // Handle parameters
25+ "Wood " , "Premium " , 0.05 ether, 10 ,
26+ // Shaft parameters
27+ "Metal " , "Standard " , 0.08 ether, 10 ,
28+ // Head parameters
29+ "Steel " , "Heavy-Duty " , 0.12 ether, 10
30+ );
31+
32+ vm.stopPrank ();
33+ }
34+
35+ function testComponentInventory () public {
36+ assertEq (HammerHandle (handleContract).getInventoryCount (), 10 );
37+ assertEq (HammerShaft (shaftContract).getInventoryCount (), 10 );
38+ assertEq (HammerHead (headContract).getInventoryCount (), 10 );
39+ }
40+
41+ function testAssembleHammer () public {
42+ vm.startPrank (owner);
43+
44+ // Owner must have enough funds to purchase components
45+ vm.deal (owner, 1 ether);
46+
47+ CompletedHammer (hammerContract).assembleHammer ("Claw Hammer " , 0.3 ether);
48+
49+ assertEq (CompletedHammer (hammerContract).getAvailableHammers (), 1 );
50+ assertEq (HammerHandle (handleContract).getInventoryCount (), 9 );
51+ assertEq (HammerShaft (shaftContract).getInventoryCount (), 9 );
52+ assertEq (HammerHead (headContract).getInventoryCount (), 9 );
53+
54+ vm.stopPrank ();
55+ }
56+
57+ function testPurchaseHammer () public {
58+ vm.startPrank (owner);
59+ vm.deal (owner, 1 ether);
60+
61+ // Assemble a hammer first
62+ CompletedHammer (hammerContract).assembleHammer ("Claw Hammer " , 0.3 ether);
63+
64+ vm.stopPrank ();
65+
66+ // Customer purchases the hammer
67+ vm.startPrank (customer);
68+ vm.deal (customer, 0.5 ether);
69+
70+ uint256 hammerIdPurchased = CompletedHammer (hammerContract).purchaseHammer {value: 0.3 ether }();
71+
72+ // Check hammer details
73+ (,,, string memory hammerType ,,bool isAvailable ) = CompletedHammer (hammerContract).getHammerDetails (hammerIdPurchased);
74+
75+ assertEq (hammerType, "Claw Hammer " );
76+ assertEq (isAvailable, false );
77+ assertEq (CompletedHammer (hammerContract).getAvailableHammers (), 0 );
78+
79+ vm.stopPrank ();
80+ }
81+
82+ function testUpgradeContract () public {
83+ // ToDo: Implement tests for the upgrade functionality
84+ // This would involve deploying a new implementation contract and using the upgradeTo function
85+ }
86+ }
0 commit comments