diff --git a/contracts/cw1155-base/src/contract.rs b/contracts/cw1155-base/src/contract.rs index 5e70c6f8c..a441ac577 100644 --- a/contracts/cw1155-base/src/contract.rs +++ b/contracts/cw1155-base/src/contract.rs @@ -123,17 +123,17 @@ fn execute_transfer_inner<'a>( fn check_can_approve( deps: Deps, env: &Env, - sender: &HumanAddr, owner: &HumanAddr, + operator: &HumanAddr, ) -> StdResult { // owner can approve let owner_raw = deps.api.canonical_address(owner)?; - let sender_raw = deps.api.canonical_address(sender)?; - if owner_raw == sender_raw { + let operator_raw = deps.api.canonical_address(operator)?; + if owner_raw == operator_raw { return Ok(true); } // operator can approve - let op = APPROVES.may_load(deps.storage, (&owner_raw, &sender_raw))?; + let op = APPROVES.may_load(deps.storage, (&owner_raw, &operator_raw))?; Ok(match op { Some(ex) => !ex.is_expired(&env.block), None => false, @@ -1091,32 +1091,89 @@ mod tests { } // FIXME test failed, query result out of order - // assert_eq!( - // query( - // deps.as_ref(), - // mock_env(), - // Cw1155QueryMsg::ApprovedForAll { - // owner: users[0].clone(), - // include_expired: None, - // start_after: None, - // limit: None, - // }, - // ), - // to_binary(&ApprovedForAllResponse { - // operators: users[1..] - // .iter() - // .map(|user| cw1155::Approval { - // spender: user.clone(), - // expires: Expiration::Never {} - // }) - // .collect::>() - // }) - // ); + assert_eq!( + query( + deps.as_ref(), + mock_env(), + Cw1155QueryMsg::ApprovedForAll { + owner: users[0].clone(), + include_expired: None, + start_after: Some("user2".into()), + limit: Some(1), + }, + ), + to_binary(&ApprovedForAllResponse { + operators: vec![cw1155::Approval { + spender: users[3].clone().into(), + expires: Expiration::Never {} + }], + }) + ); } #[test] fn approval_expires() { - // TODO + let mut deps = mock_dependencies(&[]); + let token1 = "token1".to_owned(); + let minter: HumanAddr = "minter".into(); + let user1: HumanAddr = "user1".into(); + let user2: HumanAddr = "user2".into(); + + let env = { + let mut env = mock_env(); + env.block.height = 1; + env + }; + + let msg = InitMsg { + minter: minter.clone(), + }; + let res = instantiate(deps.as_mut(), env.clone(), mock_info("operator", &[]), msg).unwrap(); + assert_eq!(0, res.messages.len()); + + execute( + deps.as_mut(), + env.clone(), + mock_info(minter.clone(), &[]), + Cw1155HandleMsg::Mint { + to: user1.clone(), + token_id: token1.clone(), + value: 1u64.into(), + msg: None, + }, + ) + .unwrap(); + + execute( + deps.as_mut(), + env.clone(), + mock_info(user1.clone(), &[]), + Cw1155HandleMsg::ApproveAll { + operator: user2.clone(), + expires: Some(Expiration::AtHeight(100)), + }, + ) + .unwrap(); + + let query_msg = Cw1155QueryMsg::IsApprovedForAll { + owner: user1.clone(), + operator: user2.clone(), + }; + assert_eq!( + query(deps.as_ref(), env, query_msg.clone()), + to_binary(&IsApprovedForAllResponse { approved: true }) + ); + + let env = { + let mut env = mock_env(); + env.block.height = 100; + env + }; + + assert_eq!( + query(deps.as_ref(), env, query_msg,), + to_binary(&IsApprovedForAllResponse { approved: false }) + ); } #[test]