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
117 changes: 41 additions & 76 deletions contract/contracts/content-access/src/content_query_test.rs
Original file line number Diff line number Diff line change
@@ -1,123 +1,88 @@
//! Tests for Issue #312 – get_content_info catalog query.
//! Tests for content catalog query (get_content_price / set_content_price).

#[cfg(test)]
mod content_query_tests {
use crate::{ContentAccess, ContentAccessClient, ContentInfo};
use soroban_sdk::{testutils::Address as _, Address, BytesN, Env};
use crate::{ContentAccess, ContentAccessClient};
use soroban_sdk::{testutils::Address as _, Address, Env};

fn make_content_id(env: &Env, seed: u8) -> BytesN<32> {
let mut bytes = [0u8; 32];
bytes[0] = seed;
BytesN::from_array(env, &bytes)
fn setup() -> (Env, Address) {
let env = Env::default();
env.mock_all_auths();
env.ledger().with_mut(|li| li.sequence_number = 1000);
let contract_id = env.register_contract(None, ContentAccess);
(env, contract_id)
}

// ── positive test ────────────────────────────────────────────────────────

/// Register content with a known price, then assert get_content_info returns it.
/// Set a price for content, then assert get_content_price returns it.
#[test]
fn test_get_content_info_returns_registered_content() {
let env = Env::default();
env.mock_all_auths();

let contract_id = env.register_contract(None, ContentAccess);
fn test_get_content_price_returns_registered_price() {
let (env, contract_id) = setup();
let client = ContentAccessClient::new(&env, &contract_id);

let creator = Address::generate(&env);
let content_id = make_content_id(&env, 1);

client.register_content(&creator, &content_id, &500, &true);
client.set_content_price(&creator, &1, &500);

let result = client.get_content_info(&creator, &content_id);
assert!(result.is_some());
let info = result.unwrap();
assert_eq!(info.price, 500);
assert!(info.is_active);
let result = client.get_content_price(&creator, &1);
assert_eq!(result, Some(500));
}

// ── negative test ────────────────────────────────────────────────────────

/// Query a content_id that was never registered – must return None.
#[test]
fn test_get_content_info_returns_none_for_unknown_content() {
let env = Env::default();
env.mock_all_auths();

let contract_id = env.register_contract(None, ContentAccess);
fn test_get_content_price_returns_none_for_unknown_content() {
let (env, contract_id) = setup();
let client = ContentAccessClient::new(&env, &contract_id);

let creator = Address::generate(&env);
let unknown_id = make_content_id(&env, 99);

let result = client.get_content_info(&creator, &unknown_id);
let result = client.get_content_price(&creator, &99);
assert!(result.is_none());
}

// ── boundary / caller test ───────────────────────────────────────────────

/// A third-party caller (not the creator) can query without auth errors.
/// A third-party caller can query price without auth errors (view-only).
#[test]
fn test_get_content_info_accessible_by_any_caller() {
let env = Env::default();
env.mock_all_auths();

let contract_id = env.register_contract(None, ContentAccess);
fn test_get_content_price_accessible_by_any_caller() {
let (env, contract_id) = setup();
let client = ContentAccessClient::new(&env, &contract_id);

let creator = Address::generate(&env);
let third_party = Address::generate(&env);
let content_id = make_content_id(&env, 7);

// Creator registers the content.
client.register_content(&creator, &content_id, &1_000, &true);

// Third-party queries – no auth mocking needed for the query itself.
// (mock_all_auths covers register_content above; the query needs none.)
let _ = third_party; // illustrative – the client call below uses no auth
let result = client.get_content_info(&creator, &content_id);
assert!(result.is_some());
assert_eq!(result.unwrap().price, 1_000);

client.set_content_price(&creator, &7, &1_000);

let result = client.get_content_price(&creator, &7);
assert_eq!(result, Some(1_000));
}

// ── additional: inactive content is still returned ───────────────────────
// ── update: re-setting overwrites previous value ─────────────────────────

#[test]
fn test_get_content_info_returns_inactive_content() {
let env = Env::default();
env.mock_all_auths();

let contract_id = env.register_contract(None, ContentAccess);
fn test_set_content_price_update_overwrites() {
let (env, contract_id) = setup();
let client = ContentAccessClient::new(&env, &contract_id);

let creator = Address::generate(&env);
let content_id = make_content_id(&env, 2);

client.register_content(&creator, &content_id, &200, &false);
client.set_content_price(&creator, &3, &100);
client.set_content_price(&creator, &3, &999);

let result = client.get_content_info(&creator, &content_id);
assert!(result.is_some());
let info = result.unwrap();
assert_eq!(info.price, 200);
assert!(!info.is_active);
assert_eq!(client.get_content_price(&creator, &3), Some(999));
}

// ── update: re-registering overwrites previous values ───────────────────
// ── multiple creators ────────────────────────────────────────────────────

#[test]
fn test_register_content_update_overwrites() {
let env = Env::default();
env.mock_all_auths();

let contract_id = env.register_contract(None, ContentAccess);
fn test_prices_are_creator_scoped() {
let (env, contract_id) = setup();
let client = ContentAccessClient::new(&env, &contract_id);
let creator1 = Address::generate(&env);
let creator2 = Address::generate(&env);

let creator = Address::generate(&env);
let content_id = make_content_id(&env, 3);

client.register_content(&creator, &content_id, &100, &true);
client.register_content(&creator, &content_id, &999, &false);
client.set_content_price(&creator1, &1, &100);
client.set_content_price(&creator2, &1, &200);

let info = client.get_content_info(&creator, &content_id).unwrap();
assert_eq!(info.price, 999);
assert!(!info.is_active);
assert_eq!(client.get_content_price(&creator1, &1), Some(100));
assert_eq!(client.get_content_price(&creator2, &1), Some(200));
}
}
Loading