Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
187 changes: 187 additions & 0 deletions contracts/predictify-hybrid/src/event_creation_tests.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
#![cfg(test)]

use crate::errors::Error;
use crate::types::{MarketState, OracleConfig, OracleProvider};
use crate::{PredictifyHybrid, PredictifyHybridClient};
use soroban_sdk::testutils::{Address as _, Ledger};
use soroban_sdk::{vec, Address, Env, String, Symbol, Vec};

// Test helper structure
struct TestSetup {
env: Env,
contract_id: Address,
admin: Address,
}

impl TestSetup {
fn new() -> Self {
let env = Env::default();
env.mock_all_auths();

// Set a non-zero timestamp to avoid overflow in tests
env.ledger().with_mut(|li| {
li.timestamp = 10000;
});

let admin = Address::generate(&env);
let contract_id = env.register(PredictifyHybrid, ());

// Initialize the contract
let client = PredictifyHybridClient::new(&env, &contract_id);
client.initialize(&admin, &None);

Self {
env,
contract_id,
admin,
}
}
}

#[test]
fn test_create_event_success() {
let setup = TestSetup::new();
let client = PredictifyHybridClient::new(&setup.env, &setup.contract_id);

let description = String::from_str(&setup.env, "Will prediction markets be the future?");
let outcomes = vec![
&setup.env,
String::from_str(&setup.env, "Yes"),
String::from_str(&setup.env, "No"),
];
let end_time = setup.env.ledger().timestamp() + 3600; // 1 hour from now
let oracle_config = OracleConfig {
provider: OracleProvider::Reflector,
feed_id: String::from_str(&setup.env, "BTC/USD"),
threshold: 50000,
comparison: String::from_str(&setup.env, "gt"),
};

let event_id = client.create_event(
&setup.admin,
&description,
&outcomes,
&end_time,
&oracle_config,
);

// Verify event details using the new get_event method
let event = client.get_event(&event_id).unwrap();
assert_eq!(event.description, description);
assert_eq!(event.end_time, end_time);
assert_eq!(event.outcomes.len(), outcomes.len());
}

#[test]
fn test_create_market_success() {
let setup = TestSetup::new();
let client = PredictifyHybridClient::new(&setup.env, &setup.contract_id);

let description = String::from_str(&setup.env, "Will this market be created?");
let outcomes = vec![
&setup.env,
String::from_str(&setup.env, "Yes"),
String::from_str(&setup.env, "No"),
];
let duration_days = 30;
let oracle_config = OracleConfig {
provider: OracleProvider::Reflector,
feed_id: String::from_str(&setup.env, "BTC/USD"),
threshold: 50000,
comparison: String::from_str(&setup.env, "gt"),
};

let market_id = client.create_market(
&setup.admin,
&description,
&outcomes,
&duration_days,
&oracle_config,
);

assert!(client.get_market(&market_id).is_some());
}

#[test]
#[should_panic(expected = "HostError: Error(Contract, #100)")] // Error::Unauthorized = 100
fn test_create_event_unauthorized() {
let setup = TestSetup::new();
let client = PredictifyHybridClient::new(&setup.env, &setup.contract_id);

let non_admin = Address::generate(&setup.env);
let description = String::from_str(&setup.env, "Test event?");
let outcomes = vec![
&setup.env,
String::from_str(&setup.env, "Yes"),
String::from_str(&setup.env, "No"),
];
let end_time = setup.env.ledger().timestamp() + 3600;
let oracle_config = OracleConfig {
provider: OracleProvider::Reflector,
feed_id: String::from_str(&setup.env, "BTC/USD"),
threshold: 50000,
comparison: String::from_str(&setup.env, "gt"),
};

client.create_event(
&non_admin,
&description,
&outcomes,
&end_time,
&oracle_config,
);
}

#[test]
#[should_panic(expected = "HostError: Error(Contract, #302)")] // Error::InvalidDuration = 302
fn test_create_event_invalid_end_time() {
let setup = TestSetup::new();
let client = PredictifyHybridClient::new(&setup.env, &setup.contract_id);

let description = String::from_str(&setup.env, "Test event?");
let outcomes = vec![
&setup.env,
String::from_str(&setup.env, "Yes"),
String::from_str(&setup.env, "No"),
];
let end_time = setup.env.ledger().timestamp() - 3600; // Past time
let oracle_config = OracleConfig {
provider: OracleProvider::Reflector,
feed_id: String::from_str(&setup.env, "BTC/USD"),
threshold: 50000,
comparison: String::from_str(&setup.env, "gt"),
};

client.create_event(
&setup.admin,
&description,
&outcomes,
&end_time,
&oracle_config,
);
}

#[test]
#[should_panic(expected = "HostError: Error(Contract, #301)")] // Error::InvalidDuration = 302
fn test_create_event_empty_outcomes() {
let setup = TestSetup::new();
let client = PredictifyHybridClient::new(&setup.env, &setup.contract_id);

let description = String::from_str(&setup.env, "Test event?");
let outcomes = Vec::new(&setup.env);
let end_time = setup.env.ledger().timestamp() - 3600; // Past time
let oracle_config = OracleConfig {
provider: OracleProvider::Reflector,
feed_id: String::from_str(&setup.env, "BTC/USD"),
threshold: 50000,
comparison: String::from_str(&setup.env, "gt"),
};

client.create_event(
&setup.admin,
&description,
&outcomes,
&end_time,
&oracle_config,
);
}
39 changes: 39 additions & 0 deletions contracts/predictify-hybrid/src/events.rs
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,24 @@ pub struct MarketCreatedEvent {
pub timestamp: u64,
}

/// Event emitted when a new prediction event is successfully created.
#[contracttype]
#[derive(Clone, Debug, Eq, PartialEq)]
pub struct EventCreatedEvent {
/// Unique event ID
pub event_id: Symbol,
/// Event description
pub description: String,
/// Event outcomes
pub outcomes: Vec<String>,
/// Event end time
pub end_time: u64,
/// Event admin
pub admin: Address,
/// Creation timestamp
pub timestamp: u64,
}

/// Event emitted when a user successfully casts a vote on a prediction market.
///
/// This event captures all details of voting activity, including voter identity,
Expand Down Expand Up @@ -1372,6 +1390,27 @@ impl EventEmitter {
Self::store_event(env, &symbol_short!("mkt_crt"), &event);
}

/// Emit event created event
pub fn emit_event_created(
env: &Env,
event_id: &Symbol,
description: &String,
outcomes: &Vec<String>,
admin: &Address,
end_time: u64,
) {
let event = EventCreatedEvent {
event_id: event_id.clone(),
description: description.clone(),
outcomes: outcomes.clone(),
admin: admin.clone(),
end_time,
timestamp: env.ledger().timestamp(),
};

Self::store_event(env, &symbol_short!("evt_crt"), &event);
}

/// Emit vote cast event
pub fn emit_vote_cast(
env: &Env,
Expand Down
Loading
Loading