# Тестирование контрактов CosmWasm

### Тестирование модуля

Для проведения теста добавьте строчку:

```
#[cfg(test)]
mod tests { ...
}
```

Для запуска теста необходимо набрать команду:

```
cargo test 
```

Справочник по Cosmwasm <https://docs.cosmwasm.com/tutorials/simple-option/testing/>

Пример простого контракта и его тестирования <https://github.com/InterWasm/cw-contracts/blob/main/contracts/simple-option/src/contract.rs>

### Интеграционный тест

Пакет cw-multi-test позволяет проводить интеграционные тесты (<https://docs.rs/cw-multi-test/latest/cw_multi_test/>)

Необходимо выполнить следующие шаги:

1\) Инициировать тестовую установку пакета. Ниже мы приводим пример с использованием `instantiate_contract()`и дальнейшей работой с `execute_contract()` соответственно:

```
fn setup_test(
    app: &mut App<
        BankKeeper,
        MockApi,
        MockStorage,
        SeiModule,
        WasmKeeper<SeiMsg, SeiQueryWrapper>,
        FailingStaking,
        FailingDistribution,
    >,
) -> (Addr, Addr) {
    let example_contract_code = app.store_code(Box::new(
        ContractWrapper::new(
            example_crate::contract::execute,
            example_crate::contract::instantiate,
            example_crate::contract::query,
        )
        .with_reply(example_crate::contract::reply),
    ));

    let example_contract_addr = app
        .instantiate_contract(
            example_contract_code,
            Addr::unchecked(ADMIN),
            &example_crate::msg::InstantiateMsg {
                example_param: Uint64::new(100),
            },
            &[],
            "example",
            Some(ADMIN.to_string()),
        )
        .unwrap();

    app.execute_contract(
        Addr::unchecked(ADMIN),
        example_contract_addr.clone(),
        &ExampleExecuteMsg::ExampleCall {
            asset_denom: "usei".to_string(),
        },
        &[],
    )
    .unwrap();

    example_contract_addr
}
```

2\) Провести интеграционный тест:

```
#[test]
fn test_example_contract() {
    let mut app = mock_app(init_default_balances);
    let example_contract_addr = setup_test(&mut app);
    
    app.execute_contract(
        Addr::unchecked("admin"),
        example_contract_addr.clone(),
        &ExampleExecuteMsg::ExampleCall {
            underlying_asset: "usei".to_string(),
            param_1: Decimal::new(Uint128::new(10_000))
        },
        &[Coin {
            denom: "usei".to_string(),
            amount: Uint128::new(10_000),
        }],
    )
    .unwrap();
    
    ... // Do other logic 
    
 
    // Assert that correct amount is refunded to `bob`
    let res: BalanceResponse = get_balance(&app, "bob".to_string(), "usei".to_string());
    assert_eq!(res.amount.amount, Uint128::new(10_000_000));
    assert_eq!(res.amount.denom, "usei");
    
    ... // Other checks include calling query_wasm_smart() on a given contract  

    // Query some object no longer exists
    let example_obj: Result<ExampleObj, StdError> = app.wrap().query_wasm_smart(
        example_contract_addr.clone(),
        &QueryMsg::GetExampleObj { obj_id: 0 },
    );

    let error = example_obj.err().unwrap();
    assert_eq!(
        error.to_string(),
        StdError::generic_err("Querier contract error: object not found")
            .to_string()
    );
}
```

Ссылка на документацию Cosmwasm <https://docs.cosmwasm.com/docs/1.0/smart-contracts/testing/>

### Сквозное тестирование в блокчейне Sei

Для проведения сквозного тестирования вам необходимо вновь выполнить следующие шаги:

1\) запустите блокчейн на локальной машине или в сети разработчиков (devnet) <https://docs.seinetwork.io/smart-contracts-and-local-development/set-up-a-local-network>

2\) задеплойте свой контракт <https://docs.seinetwork.io/smart-contracts-and-local-development/deploy-a-generic-contract>

Пример контракта, который может быть использован для локального тестирования можно посмотреть здесь <https://github.com/sei-protocol/sei-cosmwasm>

Для получения отладочной информации, такой как ошибочный ордер, вы можете использовать набор инструментов на стороне ПО по созданию контракта. Компилятор Rust может выводить ошибки во время компиляции. Также для любой структуры, для которой реализована функция отладки, можно использовать `println!` Наконец, вы можете добавить логи в `deps.api.debug(err).`


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://seinetwork.gitbook.io/docs/smart-contracts-and-local-development/cosmwasm-contract-testing.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
