Add update by shop id functions
This commit is contained in:
parent
32aaa29522
commit
1805bbb4dc
16
bindings.h
16
bindings.h
@ -169,6 +169,10 @@ FFIResult<RawMerchandiseVec> get_merchandise_list(const char *api_url,
|
|||||||
const char *api_key,
|
const char *api_key,
|
||||||
int32_t merchandise_list_id);
|
int32_t merchandise_list_id);
|
||||||
|
|
||||||
|
FFIResult<RawMerchandiseVec> get_merchandise_list_by_shop_id(const char *api_url,
|
||||||
|
const char *api_key,
|
||||||
|
int32_t shop_id);
|
||||||
|
|
||||||
FFIResult<RawShop> get_shop(const char *api_url, const char *api_key, int32_t shop_id);
|
FFIResult<RawShop> get_shop(const char *api_url, const char *api_key, int32_t shop_id);
|
||||||
|
|
||||||
bool init();
|
bool init();
|
||||||
@ -177,6 +181,18 @@ FFIResult<RawShopVec> list_shops(const char *api_url, const char *api_key);
|
|||||||
|
|
||||||
FFIResult<bool> status_check(const char *api_url);
|
FFIResult<bool> status_check(const char *api_url);
|
||||||
|
|
||||||
|
FFIResult<int32_t> update_interior_ref_list(const char *api_url,
|
||||||
|
const char *api_key,
|
||||||
|
int32_t shop_id,
|
||||||
|
const RawInteriorRef *raw_interior_ref_ptr,
|
||||||
|
uintptr_t raw_interior_ref_len);
|
||||||
|
|
||||||
|
FFIResult<int32_t> update_merchandise_list(const char *api_url,
|
||||||
|
const char *api_key,
|
||||||
|
int32_t shop_id,
|
||||||
|
const RawMerchandise *raw_merchandise_ptr,
|
||||||
|
uintptr_t raw_merchandise_len);
|
||||||
|
|
||||||
FFIResult<RawOwner> update_owner(const char *api_url,
|
FFIResult<RawOwner> update_owner(const char *api_url,
|
||||||
const char *api_key,
|
const char *api_key,
|
||||||
uint32_t id,
|
uint32_t id,
|
||||||
|
@ -94,7 +94,6 @@ pub struct RawInteriorRefVec {
|
|||||||
pub cap: usize,
|
pub cap: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Because C++ does not have Result, -1 means that the request was unsuccessful
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn create_interior_ref_list(
|
pub extern "C" fn create_interior_ref_list(
|
||||||
api_url: *const c_char,
|
api_url: *const c_char,
|
||||||
@ -170,6 +169,82 @@ pub extern "C" fn create_interior_ref_list(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn update_interior_ref_list(
|
||||||
|
api_url: *const c_char,
|
||||||
|
api_key: *const c_char,
|
||||||
|
shop_id: i32,
|
||||||
|
raw_interior_ref_ptr: *const RawInteriorRef,
|
||||||
|
raw_interior_ref_len: usize,
|
||||||
|
) -> FFIResult<i32> {
|
||||||
|
let api_url = unsafe { CStr::from_ptr(api_url) }.to_string_lossy();
|
||||||
|
let api_key = unsafe { CStr::from_ptr(api_key) }.to_string_lossy();
|
||||||
|
info!("update_interior_ref_list api_url: {:?}, api_key: {:?}, shop_id: {:?}, raw_interior_ref_len: {:?}", api_url, api_key, shop_id, raw_interior_ref_len);
|
||||||
|
let raw_interior_ref_slice = unsafe {
|
||||||
|
assert!(!raw_interior_ref_ptr.is_null());
|
||||||
|
slice::from_raw_parts(raw_interior_ref_ptr, raw_interior_ref_len)
|
||||||
|
};
|
||||||
|
|
||||||
|
fn inner(
|
||||||
|
api_url: &str,
|
||||||
|
api_key: &str,
|
||||||
|
shop_id: i32,
|
||||||
|
raw_interior_ref_slice: &[RawInteriorRef],
|
||||||
|
) -> Result<InteriorRefList> {
|
||||||
|
#[cfg(not(test))]
|
||||||
|
let url = Url::parse(api_url)?.join(&format!("v1/shops/{}/interior_ref_list", shop_id))?;
|
||||||
|
#[cfg(test)]
|
||||||
|
let url = Url::parse(&mockito::server_url())?
|
||||||
|
.join(&format!("v1/shops/{}/interior_ref_list", shop_id))?;
|
||||||
|
|
||||||
|
let interior_ref_list = InteriorRefList::from_game(shop_id, raw_interior_ref_slice);
|
||||||
|
info!(
|
||||||
|
"created interior_ref_list from game: shop_id: {}",
|
||||||
|
&interior_ref_list.shop_id
|
||||||
|
);
|
||||||
|
let client = reqwest::blocking::Client::new();
|
||||||
|
let resp = client
|
||||||
|
.patch(url)
|
||||||
|
.header("Api-Key", api_key)
|
||||||
|
.json(&interior_ref_list)
|
||||||
|
.send()?;
|
||||||
|
info!("update interior_ref_list response from api: {:?}", &resp);
|
||||||
|
let bytes = resp.bytes()?;
|
||||||
|
let json: InteriorRefList = serde_json::from_slice(&bytes)?;
|
||||||
|
if let Some(id) = json.id {
|
||||||
|
update_file_cache(
|
||||||
|
&file_cache_dir(api_url)?.join(format!("shops_{}_interior_ref_list.json", shop_id)),
|
||||||
|
&bytes,
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
Ok(json)
|
||||||
|
}
|
||||||
|
|
||||||
|
match inner(&api_url, &api_key, shop_id, raw_interior_ref_slice) {
|
||||||
|
Ok(interior_ref_list) => {
|
||||||
|
if let Some(id) = interior_ref_list.id {
|
||||||
|
FFIResult::Ok(id)
|
||||||
|
} else {
|
||||||
|
error!("update_interior_ref_list failed. API did not return an interior ref list with an ID");
|
||||||
|
let err_string =
|
||||||
|
CString::new("API did not return an interior ref list with an ID".to_string())
|
||||||
|
.expect("could not create CString")
|
||||||
|
.into_raw();
|
||||||
|
// TODO: also need to drop this CString once C++ is done reading it
|
||||||
|
FFIResult::Err(err_string)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
error!("update_interior_ref_list failed. {}", err);
|
||||||
|
// TODO: also need to drop this CString once C++ is done reading it
|
||||||
|
let err_string = CString::new(err.to_string())
|
||||||
|
.expect("could not create CString")
|
||||||
|
.into_raw();
|
||||||
|
FFIResult::Err(err_string)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn get_interior_ref_list(
|
pub extern "C" fn get_interior_ref_list(
|
||||||
api_url: *const c_char,
|
api_url: *const c_char,
|
||||||
@ -281,7 +356,7 @@ pub extern "C" fn get_interior_ref_list_by_shop_id(
|
|||||||
|
|
||||||
let client = reqwest::blocking::Client::new();
|
let client = reqwest::blocking::Client::new();
|
||||||
let cache_path =
|
let cache_path =
|
||||||
file_cache_dir(api_url)?.join(format!("interior_ref_list_{}.json", shop_id));
|
file_cache_dir(api_url)?.join(format!("shops_{}_interior_ref_list.json", shop_id));
|
||||||
|
|
||||||
match client.get(url).header("Api-Key", api_key).send() {
|
match client.get(url).header("Api-Key", api_key).send() {
|
||||||
Ok(resp) => {
|
Ok(resp) => {
|
||||||
@ -435,6 +510,83 @@ mod tests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_update_interior_ref_list() {
|
||||||
|
let mock = mock("PATCH", "/v1/shops/1/interior_ref_list")
|
||||||
|
.with_status(201)
|
||||||
|
.with_header("content-type", "application/json")
|
||||||
|
.with_body(r#"{ "created_at": "2020-08-18T00:00:00.000", "id": 1, "shop_id": 1, "ref_list": [], "updated_at": "2020-08-18T00:00:00.000" }"#)
|
||||||
|
.create();
|
||||||
|
|
||||||
|
let api_url = CString::new("url").unwrap().into_raw();
|
||||||
|
let api_key = CString::new("api-key").unwrap().into_raw();
|
||||||
|
let (ptr, len, _cap) = vec![RawInteriorRef {
|
||||||
|
base_mod_name: CString::new("Skyrim.esm").unwrap().into_raw(),
|
||||||
|
base_local_form_id: 1,
|
||||||
|
ref_mod_name: CString::new("BazaarRealm.esp").unwrap().into_raw(),
|
||||||
|
ref_local_form_id: 1,
|
||||||
|
position_x: 100.,
|
||||||
|
position_y: 0.,
|
||||||
|
position_z: 100.,
|
||||||
|
angle_x: 0.,
|
||||||
|
angle_y: 0.,
|
||||||
|
angle_z: 0.,
|
||||||
|
scale: 1,
|
||||||
|
}]
|
||||||
|
.into_raw_parts();
|
||||||
|
let result = update_interior_ref_list(api_url, api_key, 1, ptr, len);
|
||||||
|
mock.assert();
|
||||||
|
match result {
|
||||||
|
FFIResult::Ok(interior_ref_list_id) => {
|
||||||
|
assert_eq!(interior_ref_list_id, 1);
|
||||||
|
}
|
||||||
|
FFIResult::Err(error) => {
|
||||||
|
panic!("update_interior_ref_list returned error: {:?}", unsafe {
|
||||||
|
CStr::from_ptr(error).to_string_lossy()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_update_interior_ref_list_server_error() {
|
||||||
|
let mock = mock("PATCH", "/v1/shops/1/interior_ref_list")
|
||||||
|
.with_status(500)
|
||||||
|
.with_body("Internal Server Error")
|
||||||
|
.create();
|
||||||
|
|
||||||
|
let api_url = CString::new("url").unwrap().into_raw();
|
||||||
|
let api_key = CString::new("api-key").unwrap().into_raw();
|
||||||
|
let (ptr, len, _cap) = vec![RawInteriorRef {
|
||||||
|
base_mod_name: CString::new("Skyrim.esm").unwrap().into_raw(),
|
||||||
|
base_local_form_id: 1,
|
||||||
|
ref_mod_name: CString::new("BazaarRealm.esp").unwrap().into_raw(),
|
||||||
|
ref_local_form_id: 1,
|
||||||
|
position_x: 100.,
|
||||||
|
position_y: 0.,
|
||||||
|
position_z: 100.,
|
||||||
|
angle_x: 0.,
|
||||||
|
angle_y: 0.,
|
||||||
|
angle_z: 0.,
|
||||||
|
scale: 1,
|
||||||
|
}]
|
||||||
|
.into_raw_parts();
|
||||||
|
let result = update_interior_ref_list(api_url, api_key, 1, ptr, len);
|
||||||
|
mock.assert();
|
||||||
|
match result {
|
||||||
|
FFIResult::Ok(interior_ref_list_id) => panic!(
|
||||||
|
"update_interior_ref_list returned Ok result: {:?}",
|
||||||
|
interior_ref_list_id
|
||||||
|
),
|
||||||
|
FFIResult::Err(error) => {
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { CStr::from_ptr(error).to_string_lossy() },
|
||||||
|
"expected value at line 1 column 1"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_get_interior_ref_list() {
|
fn test_get_interior_ref_list() {
|
||||||
let mock = mock("GET", "/v1/interior_ref_lists/1")
|
let mock = mock("GET", "/v1/interior_ref_lists/1")
|
||||||
|
@ -154,7 +154,84 @@ pub extern "C" fn create_merchandise_list(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: fetch by shop_id
|
#[no_mangle]
|
||||||
|
pub extern "C" fn update_merchandise_list(
|
||||||
|
api_url: *const c_char,
|
||||||
|
api_key: *const c_char,
|
||||||
|
shop_id: i32,
|
||||||
|
raw_merchandise_ptr: *const RawMerchandise,
|
||||||
|
raw_merchandise_len: usize,
|
||||||
|
) -> FFIResult<i32> {
|
||||||
|
let api_url = unsafe { CStr::from_ptr(api_url) }.to_string_lossy();
|
||||||
|
let api_key = unsafe { CStr::from_ptr(api_key) }.to_string_lossy();
|
||||||
|
info!("create_merchandise_list api_url: {:?}, api_key: {:?}, shop_id: {:?}, raw_merchandise_len: {:?}", api_url, api_key, shop_id, raw_merchandise_len);
|
||||||
|
let raw_merchandise_slice = unsafe {
|
||||||
|
assert!(!raw_merchandise_ptr.is_null());
|
||||||
|
slice::from_raw_parts(raw_merchandise_ptr, raw_merchandise_len)
|
||||||
|
};
|
||||||
|
|
||||||
|
fn inner(
|
||||||
|
api_url: &str,
|
||||||
|
api_key: &str,
|
||||||
|
shop_id: i32,
|
||||||
|
raw_merchandise_slice: &[RawMerchandise],
|
||||||
|
) -> Result<MerchandiseList> {
|
||||||
|
#[cfg(not(test))]
|
||||||
|
let url = Url::parse(api_url)?.join(&format!("v1/shops/{}/merchandise_list", shop_id))?;
|
||||||
|
#[cfg(test)]
|
||||||
|
let url = Url::parse(&mockito::server_url())?
|
||||||
|
.join(&format!("v1/shops/{}/merchandise_list", shop_id))?;
|
||||||
|
|
||||||
|
let merchandise_list = MerchandiseList::from_game(shop_id, raw_merchandise_slice);
|
||||||
|
info!(
|
||||||
|
"created merchandise_list from game: shop_id: {}",
|
||||||
|
&merchandise_list.shop_id
|
||||||
|
);
|
||||||
|
let client = reqwest::blocking::Client::new();
|
||||||
|
let resp = client
|
||||||
|
.patch(url)
|
||||||
|
.header("Api-Key", api_key)
|
||||||
|
.json(&merchandise_list)
|
||||||
|
.send()?;
|
||||||
|
info!("update merchandise_list response from api: {:?}", &resp);
|
||||||
|
let bytes = resp.bytes()?;
|
||||||
|
let json: MerchandiseList = serde_json::from_slice(&bytes)?;
|
||||||
|
if let Some(id) = json.id {
|
||||||
|
update_file_cache(
|
||||||
|
&file_cache_dir(api_url)?.join(format!("shops_{}_merchandise_list.json", id)),
|
||||||
|
&bytes,
|
||||||
|
)?;
|
||||||
|
}
|
||||||
|
Ok(json)
|
||||||
|
}
|
||||||
|
|
||||||
|
match inner(&api_url, &api_key, shop_id, raw_merchandise_slice) {
|
||||||
|
Ok(merchandise_list) => {
|
||||||
|
if let Some(id) = merchandise_list.id {
|
||||||
|
FFIResult::Ok(id)
|
||||||
|
} else {
|
||||||
|
error!(
|
||||||
|
"update_merchandise failed. API did not return an interior ref list with an ID"
|
||||||
|
);
|
||||||
|
let err_string =
|
||||||
|
CString::new("API did not return an interior ref list with an ID".to_string())
|
||||||
|
.expect("could not create CString")
|
||||||
|
.into_raw();
|
||||||
|
// TODO: also need to drop this CString once C++ is done reading it
|
||||||
|
FFIResult::Err(err_string)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
error!("update_merchandise_list failed. {}", err);
|
||||||
|
// TODO: also need to drop this CString once C++ is done reading it
|
||||||
|
let err_string = CString::new(err.to_string())
|
||||||
|
.expect("could not create CString")
|
||||||
|
.into_raw();
|
||||||
|
FFIResult::Err(err_string)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern "C" fn get_merchandise_list(
|
pub extern "C" fn get_merchandise_list(
|
||||||
api_url: *const c_char,
|
api_url: *const c_char,
|
||||||
@ -237,6 +314,89 @@ pub extern "C" fn get_merchandise_list(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C" fn get_merchandise_list_by_shop_id(
|
||||||
|
api_url: *const c_char,
|
||||||
|
api_key: *const c_char,
|
||||||
|
shop_id: i32,
|
||||||
|
) -> FFIResult<RawMerchandiseVec> {
|
||||||
|
let api_url = unsafe { CStr::from_ptr(api_url) }.to_string_lossy();
|
||||||
|
let api_key = unsafe { CStr::from_ptr(api_key) }.to_string_lossy();
|
||||||
|
info!(
|
||||||
|
"get_merchandise_list_by_shop_id api_url: {:?}, api_key: {:?}, shop_id: {:?}",
|
||||||
|
api_url, api_key, shop_id
|
||||||
|
);
|
||||||
|
|
||||||
|
fn inner(api_url: &str, api_key: &str, shop_id: i32) -> Result<MerchandiseList> {
|
||||||
|
#[cfg(not(test))]
|
||||||
|
let url = Url::parse(api_url)?.join(&format!("v1/shops/{}/merchandise_list", shop_id))?;
|
||||||
|
#[cfg(test)]
|
||||||
|
let url = Url::parse(&mockito::server_url())?
|
||||||
|
.join(&format!("v1/shops/{}/merchandise_list", shop_id))?;
|
||||||
|
info!("api_url: {:?}", url);
|
||||||
|
|
||||||
|
let client = reqwest::blocking::Client::new();
|
||||||
|
let cache_path =
|
||||||
|
file_cache_dir(api_url)?.join(format!("shops_{}_merchandise_list.json", shop_id));
|
||||||
|
|
||||||
|
match client.get(url).header("Api-Key", api_key).send() {
|
||||||
|
Ok(resp) => {
|
||||||
|
info!(
|
||||||
|
"get_merchandise_list_by_shop_id response from api: {:?}",
|
||||||
|
&resp
|
||||||
|
);
|
||||||
|
if resp.status().is_success() {
|
||||||
|
let bytes = resp.bytes()?;
|
||||||
|
update_file_cache(&cache_path, &bytes)?;
|
||||||
|
let json = serde_json::from_slice(&bytes)?;
|
||||||
|
Ok(json)
|
||||||
|
} else {
|
||||||
|
log_server_error(resp);
|
||||||
|
from_file_cache(&cache_path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
error!("get_merchandise_list_by_shop_id api request error: {}", err);
|
||||||
|
from_file_cache(&cache_path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
match inner(&api_url, &api_key, shop_id) {
|
||||||
|
Ok(merchandise_list) => {
|
||||||
|
let (ptr, len, cap) = merchandise_list
|
||||||
|
.form_list
|
||||||
|
.into_iter()
|
||||||
|
.map(|merchandise| RawMerchandise {
|
||||||
|
mod_name: CString::new(merchandise.mod_name)
|
||||||
|
.unwrap_or_default()
|
||||||
|
.into_raw(),
|
||||||
|
local_form_id: merchandise.local_form_id,
|
||||||
|
name: CString::new(merchandise.name)
|
||||||
|
.unwrap_or_default()
|
||||||
|
.into_raw(),
|
||||||
|
quantity: merchandise.quantity,
|
||||||
|
form_type: merchandise.form_type,
|
||||||
|
is_food: merchandise.is_food as u8,
|
||||||
|
price: merchandise.price,
|
||||||
|
})
|
||||||
|
.collect::<Vec<RawMerchandise>>()
|
||||||
|
.into_raw_parts();
|
||||||
|
// TODO: need to pass this back into Rust once C++ is done with it so it can be manually dropped and the CStrings dropped from raw pointers.
|
||||||
|
FFIResult::Ok(RawMerchandiseVec { ptr, len, cap })
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
error!("get_merchandise_list_by_shop_id failed. {}", err);
|
||||||
|
// TODO: how to do error handling?
|
||||||
|
let err_string = CString::new(err.to_string())
|
||||||
|
.expect("could not create CString")
|
||||||
|
.into_raw();
|
||||||
|
// TODO: also need to drop this CString once C++ is done reading it
|
||||||
|
FFIResult::Err(err_string)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
mod tests {
|
mod tests {
|
||||||
use std::ffi::CString;
|
use std::ffi::CString;
|
||||||
@ -313,6 +473,74 @@ mod tests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_update_merchandise_list() {
|
||||||
|
let mock = mock("PATCH", "/v1/shops/1/merchandise_list")
|
||||||
|
.with_status(201)
|
||||||
|
.with_header("content-type", "application/json")
|
||||||
|
.with_body(r#"{ "created_at": "2020-08-18T00:00:00.000", "id": 1, "shop_id": 1, "form_list": [], "updated_at": "2020-08-18T00:00:00.000" }"#)
|
||||||
|
.create();
|
||||||
|
|
||||||
|
let api_url = CString::new("url").unwrap().into_raw();
|
||||||
|
let api_key = CString::new("api-key").unwrap().into_raw();
|
||||||
|
let (ptr, len, _cap) = vec![RawMerchandise {
|
||||||
|
mod_name: CString::new("Skyrim.esm").unwrap().into_raw(),
|
||||||
|
local_form_id: 1,
|
||||||
|
name: CString::new("Iron Sword").unwrap().into_raw(),
|
||||||
|
quantity: 1,
|
||||||
|
form_type: 1,
|
||||||
|
is_food: 0,
|
||||||
|
price: 100,
|
||||||
|
}]
|
||||||
|
.into_raw_parts();
|
||||||
|
let result = update_merchandise_list(api_url, api_key, 1, ptr, len);
|
||||||
|
mock.assert();
|
||||||
|
match result {
|
||||||
|
FFIResult::Ok(merchandise_list_id) => {
|
||||||
|
assert_eq!(merchandise_list_id, 1);
|
||||||
|
}
|
||||||
|
FFIResult::Err(error) => {
|
||||||
|
panic!("update_merchandise_list returned error: {:?}", unsafe {
|
||||||
|
CStr::from_ptr(error).to_string_lossy()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_update_interior_ref_list_server_error() {
|
||||||
|
let mock = mock("PATCH", "/v1/shops/1/merchandise_list")
|
||||||
|
.with_status(500)
|
||||||
|
.with_body("Internal Server Error")
|
||||||
|
.create();
|
||||||
|
|
||||||
|
let api_url = CString::new("url").unwrap().into_raw();
|
||||||
|
let api_key = CString::new("api-key").unwrap().into_raw();
|
||||||
|
let (ptr, len, _cap) = vec![RawMerchandise {
|
||||||
|
mod_name: CString::new("Skyrim.esm").unwrap().into_raw(),
|
||||||
|
local_form_id: 1,
|
||||||
|
name: CString::new("Iron Sword").unwrap().into_raw(),
|
||||||
|
quantity: 1,
|
||||||
|
form_type: 1,
|
||||||
|
is_food: 0,
|
||||||
|
price: 100,
|
||||||
|
}]
|
||||||
|
.into_raw_parts();
|
||||||
|
let result = update_merchandise_list(api_url, api_key, 1, ptr, len);
|
||||||
|
mock.assert();
|
||||||
|
match result {
|
||||||
|
FFIResult::Ok(merchandise_list_id) => panic!(
|
||||||
|
"update_merchandise_list returned Ok result: {:?}",
|
||||||
|
merchandise_list_id
|
||||||
|
),
|
||||||
|
FFIResult::Err(error) => {
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { CStr::from_ptr(error).to_string_lossy() },
|
||||||
|
"expected value at line 1 column 1"
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
#[test]
|
#[test]
|
||||||
fn test_get_merchandise_list() {
|
fn test_get_merchandise_list() {
|
||||||
let mock = mock("GET", "/v1/merchandise_lists/1")
|
let mock = mock("GET", "/v1/merchandise_lists/1")
|
||||||
@ -399,4 +627,92 @@ mod tests {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_get_merchandise_list_by_shop_id() {
|
||||||
|
let mock = mock("GET", "/v1/shops/1/merchandise_list")
|
||||||
|
.with_status(201)
|
||||||
|
.with_header("content-type", "application/json")
|
||||||
|
.with_body(
|
||||||
|
r#"{
|
||||||
|
"created_at": "2020-08-18T00:00:00.000",
|
||||||
|
"id": 1,
|
||||||
|
"shop_id": 1,
|
||||||
|
"form_list": [
|
||||||
|
{
|
||||||
|
"mod_name": "Skyrim.esm",
|
||||||
|
"local_form_id": 1,
|
||||||
|
"name": "Iron Sword",
|
||||||
|
"quantity": 1,
|
||||||
|
"form_type": 1,
|
||||||
|
"is_food": false,
|
||||||
|
"price": 100
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"updated_at": "2020-08-18T00:00:00.000"
|
||||||
|
}"#,
|
||||||
|
)
|
||||||
|
.create();
|
||||||
|
|
||||||
|
let api_url = CString::new("url").unwrap().into_raw();
|
||||||
|
let api_key = CString::new("api-key").unwrap().into_raw();
|
||||||
|
let result = get_merchandise_list_by_shop_id(api_url, api_key, 1);
|
||||||
|
mock.assert();
|
||||||
|
match result {
|
||||||
|
FFIResult::Ok(raw_merchandise_vec) => {
|
||||||
|
assert_eq!(raw_merchandise_vec.len, 1);
|
||||||
|
let raw_merchandise_slice = unsafe {
|
||||||
|
assert!(!raw_merchandise_vec.ptr.is_null());
|
||||||
|
slice::from_raw_parts(raw_merchandise_vec.ptr, raw_merchandise_vec.len)
|
||||||
|
};
|
||||||
|
let raw_merchandise = &raw_merchandise_slice[0];
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { CStr::from_ptr(raw_merchandise.mod_name) }
|
||||||
|
.to_string_lossy()
|
||||||
|
.to_string(),
|
||||||
|
"Skyrim.esm".to_string(),
|
||||||
|
);
|
||||||
|
assert_eq!(raw_merchandise.local_form_id, 1);
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { CStr::from_ptr(raw_merchandise.name) }
|
||||||
|
.to_string_lossy()
|
||||||
|
.to_string(),
|
||||||
|
"Iron Sword".to_string(),
|
||||||
|
);
|
||||||
|
assert_eq!(raw_merchandise.quantity, 1);
|
||||||
|
assert_eq!(raw_merchandise.form_type, 1);
|
||||||
|
assert_eq!(raw_merchandise.is_food, 0);
|
||||||
|
assert_eq!(raw_merchandise.price, 100);
|
||||||
|
}
|
||||||
|
FFIResult::Err(error) => panic!(
|
||||||
|
"get_merchandise_list_by_shop_id returned error: {:?}",
|
||||||
|
unsafe { CStr::from_ptr(error).to_string_lossy() }
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_get_merchandise_list_server_error_by_shop_id() {
|
||||||
|
let mock = mock("GET", "/v1/shops/1/merchandise_list")
|
||||||
|
.with_status(500)
|
||||||
|
.with_body("Internal Server Error")
|
||||||
|
.create();
|
||||||
|
|
||||||
|
let api_url = CString::new("url").unwrap().into_raw();
|
||||||
|
let api_key = CString::new("api-key").unwrap().into_raw();
|
||||||
|
let result = get_merchandise_list_by_shop_id(api_url, api_key, 1);
|
||||||
|
mock.assert();
|
||||||
|
match result {
|
||||||
|
FFIResult::Ok(raw_merchandise_vec) => panic!(
|
||||||
|
"get_merchandise_list_by_shop_id returned Ok result: {:#x?}",
|
||||||
|
raw_merchandise_vec
|
||||||
|
),
|
||||||
|
FFIResult::Err(error) => {
|
||||||
|
assert_eq!(
|
||||||
|
unsafe { CStr::from_ptr(error).to_string_lossy() },
|
||||||
|
"EOF while parsing a value at line 1 column 0" // empty tempfile
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user