feat(codegen): add A/B test 3: channel handles in search results
This commit is contained in:
parent
f7b7c1954c
commit
fe8ff37f66
2 changed files with 30 additions and 5 deletions
|
|
@ -3,6 +3,8 @@ use futures::{stream, StreamExt};
|
||||||
use indicatif::{ProgressBar, ProgressStyle};
|
use indicatif::{ProgressBar, ProgressStyle};
|
||||||
use num_enum::TryFromPrimitive;
|
use num_enum::TryFromPrimitive;
|
||||||
use rustypipe::client::{ClientType, RustyPipe, YTContext};
|
use rustypipe::client::{ClientType, RustyPipe, YTContext};
|
||||||
|
use rustypipe::model::YouTubeItem;
|
||||||
|
use rustypipe::param::search_filter::{Entity, SearchFilter};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
#[derive(
|
#[derive(
|
||||||
|
|
@ -12,9 +14,13 @@ use serde::{Deserialize, Serialize};
|
||||||
pub enum ABTest {
|
pub enum ABTest {
|
||||||
AttributedTextDescription = 1,
|
AttributedTextDescription = 1,
|
||||||
ThreeTabChannelLayout = 2,
|
ThreeTabChannelLayout = 2,
|
||||||
|
ChannelHandlesInSearchResults = 3,
|
||||||
}
|
}
|
||||||
|
|
||||||
const N_TESTS: u16 = 2;
|
const TESTS_TO_RUN: [ABTest; 2] = [
|
||||||
|
ABTest::AttributedTextDescription,
|
||||||
|
ABTest::ChannelHandlesInSearchResults,
|
||||||
|
];
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize)]
|
#[derive(Debug, Serialize, Deserialize)]
|
||||||
pub struct ABTestRes {
|
pub struct ABTestRes {
|
||||||
|
|
@ -63,6 +69,9 @@ pub async fn run_test(
|
||||||
ABTest::ThreeTabChannelLayout => {
|
ABTest::ThreeTabChannelLayout => {
|
||||||
three_tab_channel_layout(&rp, &visitor_data).await
|
three_tab_channel_layout(&rp, &visitor_data).await
|
||||||
}
|
}
|
||||||
|
ABTest::ChannelHandlesInSearchResults => {
|
||||||
|
channel_handles_in_search_results(&rp, &visitor_data).await
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.unwrap();
|
.unwrap();
|
||||||
pb.inc(1);
|
pb.inc(1);
|
||||||
|
|
@ -103,11 +112,10 @@ async fn get_visitor_data(http: &reqwest::Client) -> String {
|
||||||
pub async fn run_all_tests(n: usize, concurrency: usize) -> Vec<ABTestRes> {
|
pub async fn run_all_tests(n: usize, concurrency: usize) -> Vec<ABTestRes> {
|
||||||
let mut results = Vec::new();
|
let mut results = Vec::new();
|
||||||
|
|
||||||
for id in 1..=N_TESTS {
|
for ab in TESTS_TO_RUN {
|
||||||
let ab = ABTest::try_from(id).unwrap();
|
|
||||||
let (occurrences, _, _) = run_test(ab, n, concurrency).await;
|
let (occurrences, _, _) = run_test(ab, n, concurrency).await;
|
||||||
results.push(ABTestRes {
|
results.push(ABTestRes {
|
||||||
id,
|
id: ab as u16,
|
||||||
name: ab,
|
name: ab,
|
||||||
tests: n,
|
tests: n,
|
||||||
occurrences,
|
occurrences,
|
||||||
|
|
@ -145,3 +153,20 @@ pub async fn three_tab_channel_layout(rp: &RustyPipe, visitor_data: &str) -> Res
|
||||||
.unwrap();
|
.unwrap();
|
||||||
Ok(channel.has_live || channel.has_shorts)
|
Ok(channel.has_live || channel.has_shorts)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub async fn channel_handles_in_search_results(rp: &RustyPipe, visitor_data: &str) -> Result<bool> {
|
||||||
|
let search = rp
|
||||||
|
.query()
|
||||||
|
.visitor_data(visitor_data)
|
||||||
|
.search_filter("rust", &SearchFilter::new().entity(Entity::Channel))
|
||||||
|
.await
|
||||||
|
.unwrap();
|
||||||
|
|
||||||
|
Ok(search.items.items.iter().any(|itm| match itm {
|
||||||
|
YouTubeItem::Channel(channel) => channel
|
||||||
|
.subscriber_count
|
||||||
|
.map(|sc| sc > 100 && channel.video_count.is_none())
|
||||||
|
.unwrap_or_default(),
|
||||||
|
_ => false,
|
||||||
|
}))
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -86,7 +86,7 @@ async fn main() {
|
||||||
}
|
}
|
||||||
None => {
|
None => {
|
||||||
let res = abtest::run_all_tests(n, cli.concurrency).await;
|
let res = abtest::run_all_tests(n, cli.concurrency).await;
|
||||||
println!("{}", serde_json::to_string(&res).unwrap())
|
println!("{}", serde_json::to_string_pretty(&res).unwrap())
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Reference in a new issue