use http::StatusCode;
use std::path::PathBuf;

use crate::service::dto;
use crate::service::test::{constants::*, protocol, ServiceType, TestService};
use crate::test_name;

#[actix_web::test]
async fn lastfm_scrobble_ignores_unlinked_user() {
	let mut service = ServiceType::new(&test_name!()).await;
	service.complete_initial_setup().await;
	service.login_admin().await;
	service.index().await;
	service.login().await;

	let path: PathBuf = [TEST_MOUNT_NAME, "Khemmis", "Hunted", "02 - Candlelight.mp3"]
		.iter()
		.collect();

	let request = protocol::lastfm_scrobble(&path);
	let response = service.fetch(&request).await;
	assert_eq!(response.status(), StatusCode::NO_CONTENT);
}

#[actix_web::test]
async fn lastfm_now_playing_ignores_unlinked_user() {
	let mut service = ServiceType::new(&test_name!()).await;
	service.complete_initial_setup().await;
	service.login_admin().await;
	service.index().await;
	service.login().await;

	let path: PathBuf = [TEST_MOUNT_NAME, "Khemmis", "Hunted", "02 - Candlelight.mp3"]
		.iter()
		.collect();

	let request = protocol::lastfm_now_playing(&path);
	let response = service.fetch(&request).await;
	assert_eq!(response.status(), StatusCode::NO_CONTENT);
}

#[actix_web::test]
async fn lastfm_link_token_requires_auth() {
	let mut service = ServiceType::new(&test_name!()).await;
	let request = protocol::lastfm_link_token();
	let response = service.fetch(&request).await;
	assert_eq!(response.status(), StatusCode::UNAUTHORIZED);
}

#[actix_web::test]
async fn lastfm_link_token_golden_path() {
	let mut service = ServiceType::new(&test_name!()).await;
	service.complete_initial_setup().await;
	service.login().await;

	let request = protocol::lastfm_link_token();
	let response = service
		.fetch_json::<_, dto::LastFMLinkToken>(&request)
		.await;
	assert_eq!(response.status(), StatusCode::OK);
	let link_token = response.body();
	assert!(!link_token.value.is_empty());
}