@@ -52,7 +52,8 @@ mod tests {
52
52
53
53
use super :: IErc721Burnable ;
54
54
use crate :: token:: erc721:: {
55
- tests:: random_token_id, Erc721 , Error , IErc721 ,
55
+ tests:: random_token_id, ERC721InsufficientApproval ,
56
+ ERC721NonexistentToken , Erc721 , Error , IErc721 ,
56
57
} ;
57
58
58
59
const BOB : Address = address ! ( "F4EaCDAbEf3c8f1EdE91b6f2A6840bc2E4DD3526" ) ;
@@ -70,21 +71,94 @@ mod tests {
70
71
. expect ( "should return the balance of Alice" ) ;
71
72
72
73
let result = contract. burn ( token_id) ;
74
+ assert ! ( result. is_ok( ) ) ;
75
+
73
76
let balance = contract
74
77
. balance_of ( alice)
75
78
. expect ( "should return the balance of Alice" ) ;
76
79
77
- let err = contract. owner_of ( token_id) . unwrap_err ( ) ;
80
+ assert_eq ! ( initial_balance - one, balance) ;
81
+
82
+ let err = contract
83
+ . owner_of ( token_id)
84
+ . expect_err ( "should return Error::NonexistentToken" ) ;
85
+
86
+ assert ! ( matches!(
87
+ err,
88
+ Error :: NonexistentToken ( ERC721NonexistentToken {
89
+ token_id: t_id
90
+ } ) if t_id == token_id
91
+ ) ) ;
92
+ }
93
+
94
+ #[ motsu:: test]
95
+ fn burns_with_approval ( contract : Erc721 ) {
96
+ let alice = msg:: sender ( ) ;
97
+ let token_id = random_token_id ( ) ;
98
+
99
+ contract. _mint ( BOB , token_id) . expect ( "should mint a token for Bob" ) ;
100
+
101
+ let initial_balance =
102
+ contract. balance_of ( BOB ) . expect ( "should return the balance of Bob" ) ;
78
103
79
- assert ! ( matches! ( err , Error :: NonexistentToken ( _ ) ) ) ;
104
+ contract . _token_approvals . setter ( token_id ) . set ( alice ) ;
80
105
106
+ let result = contract. burn ( token_id) ;
81
107
assert ! ( result. is_ok( ) ) ;
82
108
83
- assert_eq ! ( initial_balance - one, balance) ;
109
+ let err = contract
110
+ . owner_of ( token_id)
111
+ . expect_err ( "should return Error::NonexistentToken" ) ;
112
+
113
+ assert ! ( matches!(
114
+ err,
115
+ Error :: NonexistentToken ( ERC721NonexistentToken {
116
+ token_id: t_id
117
+ } ) if t_id == token_id
118
+ ) ) ;
119
+
120
+ let balance =
121
+ contract. balance_of ( BOB ) . expect ( "should return the balance of Bob" ) ;
122
+
123
+ assert_eq ! ( initial_balance - uint!( 1_ U256 ) , balance) ;
84
124
}
85
125
86
126
#[ motsu:: test]
87
- fn get_approved_errors_when_previous_approval_burned ( contract : Erc721 ) {
127
+ fn burns_with_approval_for_all ( contract : Erc721 ) {
128
+ let alice = msg:: sender ( ) ;
129
+ let token_id = random_token_id ( ) ;
130
+
131
+ contract. _mint ( BOB , token_id) . expect ( "should mint a token for Bob" ) ;
132
+
133
+ let initial_balance =
134
+ contract. balance_of ( BOB ) . expect ( "should return the balance of Bob" ) ;
135
+
136
+ // As we cannot change `msg::sender()`, we need to use this workaround.
137
+ contract. _operator_approvals . setter ( BOB ) . setter ( alice) . set ( true ) ;
138
+
139
+ let result = contract. burn ( token_id) ;
140
+
141
+ assert ! ( result. is_ok( ) ) ;
142
+
143
+ let err = contract
144
+ . owner_of ( token_id)
145
+ . expect_err ( "should return Error::NonexistentToken" ) ;
146
+
147
+ assert ! ( matches!(
148
+ err,
149
+ Error :: NonexistentToken ( ERC721NonexistentToken {
150
+ token_id: t_id
151
+ } ) if t_id == token_id
152
+ ) ) ;
153
+
154
+ let balance =
155
+ contract. balance_of ( BOB ) . expect ( "should return the balance of Bob" ) ;
156
+
157
+ assert_eq ! ( initial_balance - uint!( 1_ U256 ) , balance) ;
158
+ }
159
+
160
+ #[ motsu:: test]
161
+ fn error_when_get_approved_of_previous_approval_burned ( contract : Erc721 ) {
88
162
let alice = msg:: sender ( ) ;
89
163
let token_id = random_token_id ( ) ;
90
164
@@ -95,31 +169,50 @@ mod tests {
95
169
96
170
contract. burn ( token_id) . expect ( "should burn previously minted token" ) ;
97
171
98
- let err = contract. get_approved ( token_id) . unwrap_err ( ) ;
172
+ let err = contract
173
+ . get_approved ( token_id)
174
+ . expect_err ( "should return Error::NonexistentToken" ) ;
99
175
100
- assert ! ( matches!( err, Error :: NonexistentToken ( _) ) ) ;
176
+ assert ! ( matches!(
177
+ err,
178
+ Error :: NonexistentToken ( ERC721NonexistentToken {
179
+ token_id: t_id
180
+ } ) if t_id == token_id
181
+ ) ) ;
101
182
}
102
183
103
184
#[ motsu:: test]
104
- fn burn_errors_when_no_previous_approval ( contract : Erc721 ) {
185
+ fn error_when_burn_without_approval ( contract : Erc721 ) {
105
186
let token_id = random_token_id ( ) ;
106
187
107
188
contract. _mint ( BOB , token_id) . expect ( "should mint a token for Bob" ) ;
108
189
109
- let err = contract. burn ( token_id) . unwrap_err ( ) ;
110
-
111
- assert ! ( matches!( err, Error :: InsufficientApproval ( _) ) ) ;
190
+ let err = contract
191
+ . burn ( token_id)
192
+ . expect_err ( "should not burn unapproved token" ) ;
193
+
194
+ assert ! ( matches!(
195
+ err,
196
+ Error :: InsufficientApproval ( ERC721InsufficientApproval {
197
+ operator,
198
+ token_id: t_id,
199
+ } ) if operator == msg:: sender( ) && t_id == token_id
200
+ ) ) ;
112
201
}
113
202
114
203
#[ motsu:: test]
115
- fn burn_errors_when_unknown_token ( contract : Erc721 ) {
116
- let alice = msg:: sender ( ) ;
204
+ fn error_when_burn_nonexistent_token ( contract : Erc721 ) {
117
205
let token_id = random_token_id ( ) ;
118
206
119
- contract . _mint ( alice , token_id ) . expect ( "should mint a token for Alice" ) ;
120
-
121
- let err = contract . burn ( token_id + uint ! ( 1_ U256 ) ) . unwrap_err ( ) ;
207
+ let err = contract
208
+ . burn ( token_id )
209
+ . expect_err ( "should return Error::NonexistentToken" ) ;
122
210
123
- assert ! ( matches!( err, Error :: NonexistentToken ( _) ) ) ;
211
+ assert ! ( matches!(
212
+ err,
213
+ Error :: NonexistentToken ( ERC721NonexistentToken {
214
+ token_id: t_id
215
+ } ) if t_id == token_id
216
+ ) ) ;
124
217
}
125
218
}
0 commit comments