Update harness and chat tests

This commit is contained in:
Rodrigo Rodriguez (Pragmatismo) 2025-12-12 16:39:45 -03:00
parent 1480cdd56f
commit 3476080ac6
4 changed files with 451 additions and 33 deletions

405
Cargo.lock generated
View file

@ -334,6 +334,19 @@ dependencies = [
"syn 2.0.111", "syn 2.0.111",
] ]
[[package]]
name = "atom_syndication"
version = "0.12.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d2f68d23e2cb4fd958c705b91a6b4c80ceeaf27a9e11651272a8389d5ce1a4a3"
dependencies = [
"chrono",
"derive_builder 0.20.2",
"diligent-date-parser",
"never",
"quick-xml 0.37.5",
]
[[package]] [[package]]
name = "atomic" name = "atomic"
version = "0.6.1" version = "0.6.1"
@ -1037,11 +1050,13 @@ dependencies = [
"reqwest", "reqwest",
"rhai", "rhai",
"ring", "ring",
"rss",
"rust_xlsxwriter", "rust_xlsxwriter",
"rustls 0.23.35", "rustls 0.23.35",
"rustls-native-certs 0.6.3", "rustls-native-certs 0.6.3",
"rustls-pemfile 2.2.0", "rustls-pemfile 2.2.0",
"scopeguard", "scopeguard",
"scraper",
"serde", "serde",
"serde_json", "serde_json",
"sha2", "sha2",
@ -1182,7 +1197,7 @@ dependencies = [
"codepage", "codepage",
"encoding_rs", "encoding_rs",
"log", "log",
"quick-xml", "quick-xml 0.31.0",
"serde", "serde",
"zip", "zip",
] ]
@ -1535,6 +1550,29 @@ dependencies = [
"typenum", "typenum",
] ]
[[package]]
name = "cssparser"
version = "0.36.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dae61cf9c0abb83bd659dab65b7e4e38d8236824c85f0f804f173567bda257d2"
dependencies = [
"cssparser-macros",
"dtoa-short",
"itoa",
"phf",
"smallvec",
]
[[package]]
name = "cssparser-macros"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
dependencies = [
"quote",
"syn 2.0.111",
]
[[package]] [[package]]
name = "ctr" name = "ctr"
version = "0.9.2" version = "0.9.2"
@ -1554,6 +1592,16 @@ dependencies = [
"darling_macro 0.14.4", "darling_macro 0.14.4",
] ]
[[package]]
name = "darling"
version = "0.20.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee"
dependencies = [
"darling_core 0.20.11",
"darling_macro 0.20.11",
]
[[package]] [[package]]
name = "darling" name = "darling"
version = "0.21.3" version = "0.21.3"
@ -1578,6 +1626,20 @@ dependencies = [
"syn 1.0.109", "syn 1.0.109",
] ]
[[package]]
name = "darling_core"
version = "0.20.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0d00b9596d185e565c2207a0b01f8bd1a135483d02d9b7b0a54b11da8d53412e"
dependencies = [
"fnv",
"ident_case",
"proc-macro2",
"quote",
"strsim 0.11.1",
"syn 2.0.111",
]
[[package]] [[package]]
name = "darling_core" name = "darling_core"
version = "0.21.3" version = "0.21.3"
@ -1603,6 +1665,17 @@ dependencies = [
"syn 1.0.109", "syn 1.0.109",
] ]
[[package]]
name = "darling_macro"
version = "0.20.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead"
dependencies = [
"darling_core 0.20.11",
"quote",
"syn 2.0.111",
]
[[package]] [[package]]
name = "darling_macro" name = "darling_macro"
version = "0.21.3" version = "0.21.3"
@ -1708,7 +1781,16 @@ version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d67778784b508018359cbc8696edb3db78160bab2c2a28ba7f56ef6932997f8" checksum = "8d67778784b508018359cbc8696edb3db78160bab2c2a28ba7f56ef6932997f8"
dependencies = [ dependencies = [
"derive_builder_macro", "derive_builder_macro 0.12.0",
]
[[package]]
name = "derive_builder"
version = "0.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "507dfb09ea8b7fa618fcf76e953f4f5e192547945816d5358edffe39f6f94947"
dependencies = [
"derive_builder_macro 0.20.2",
] ]
[[package]] [[package]]
@ -1723,16 +1805,59 @@ dependencies = [
"syn 1.0.109", "syn 1.0.109",
] ]
[[package]]
name = "derive_builder_core"
version = "0.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2d5bcf7b024d6835cfb3d473887cd966994907effbe9227e8c8219824d06c4e8"
dependencies = [
"darling 0.20.11",
"proc-macro2",
"quote",
"syn 2.0.111",
]
[[package]] [[package]]
name = "derive_builder_macro" name = "derive_builder_macro"
version = "0.12.0" version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebcda35c7a396850a55ffeac740804b40ffec779b98fffbb1738f4033f0ee79e" checksum = "ebcda35c7a396850a55ffeac740804b40ffec779b98fffbb1738f4033f0ee79e"
dependencies = [ dependencies = [
"derive_builder_core", "derive_builder_core 0.12.0",
"syn 1.0.109", "syn 1.0.109",
] ]
[[package]]
name = "derive_builder_macro"
version = "0.20.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c"
dependencies = [
"derive_builder_core 0.20.2",
"syn 2.0.111",
]
[[package]]
name = "derive_more"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "10b768e943bed7bf2cab53df09f4bc34bfd217cdb57d971e769874c9a6710618"
dependencies = [
"derive_more-impl",
]
[[package]]
name = "derive_more-impl"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d286bfdaf75e988b4a78e013ecd79c581e06399ab53fbacd2d916c2f904f30b"
dependencies = [
"proc-macro2",
"quote",
"rustc_version",
"syn 2.0.111",
]
[[package]] [[package]]
name = "diesel" name = "diesel"
version = "2.3.4" version = "2.3.4"
@ -1801,6 +1926,15 @@ dependencies = [
"subtle", "subtle",
] ]
[[package]]
name = "diligent-date-parser"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8ede7d79366f419921e2e2f67889c12125726692a313bffb474bd5f37a581e9"
dependencies = [
"chrono",
]
[[package]] [[package]]
name = "dirs" name = "dirs"
version = "5.0.1" version = "5.0.1"
@ -1881,6 +2015,21 @@ dependencies = [
"syn 2.0.111", "syn 2.0.111",
] ]
[[package]]
name = "dtoa"
version = "1.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d6add3b8cff394282be81f3fc1a0605db594ed69890078ca6e2cab1c408bcf04"
[[package]]
name = "dtoa-short"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cd1511a7b6a56299bd043a9c167a6d2bfb37bf84a6dfceaba651168adfb43c87"
dependencies = [
"dtoa",
]
[[package]] [[package]]
name = "dunce" name = "dunce"
version = "1.0.5" version = "1.0.5"
@ -1908,6 +2057,12 @@ dependencies = [
"signature", "signature",
] ]
[[package]]
name = "ego-tree"
version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2972feb8dffe7bc8c5463b1dacda1b0dfbed3710e50f977d965429692d74cd8"
[[package]] [[package]]
name = "either" name = "either"
version = "1.15.0" version = "1.15.0"
@ -2169,6 +2324,16 @@ version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c"
[[package]]
name = "futf"
version = "0.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843"
dependencies = [
"mac",
"new_debug_unreachable",
]
[[package]] [[package]]
name = "futures" name = "futures"
version = "0.3.31" version = "0.3.31"
@ -2274,6 +2439,15 @@ dependencies = [
"version_check", "version_check",
] ]
[[package]]
name = "getopts"
version = "0.2.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cfe4fbac503b8d1f88e6676011885f34b7174f46e59956bba534ba83abded4df"
dependencies = [
"unicode-width",
]
[[package]] [[package]]
name = "getrandom" name = "getrandom"
version = "0.2.16" version = "0.2.16"
@ -2444,6 +2618,16 @@ dependencies = [
"digest", "digest",
] ]
[[package]]
name = "html5ever"
version = "0.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6452c4751a24e1b99c3260d505eaeee76a050573e61f30ac2c924ddc7236f01e"
dependencies = [
"log",
"markup5ever",
]
[[package]] [[package]]
name = "http" name = "http"
version = "0.2.12" version = "0.2.12"
@ -3069,6 +3253,23 @@ dependencies = [
"pkg-config", "pkg-config",
] ]
[[package]]
name = "mac"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4"
[[package]]
name = "markup5ever"
version = "0.36.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c3294c4d74d0742910f8c7b466f44dda9eb2d5742c1e430138df290a1e8451c"
dependencies = [
"log",
"tendril",
"web_atoms",
]
[[package]] [[package]]
name = "matchers" name = "matchers"
version = "0.2.0" version = "0.2.0"
@ -3223,6 +3424,18 @@ dependencies = [
"tempfile", "tempfile",
] ]
[[package]]
name = "never"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c96aba5aa877601bb3f6dd6a63a969e1f82e60646e81e71b14496995e9853c91"
[[package]]
name = "new_debug_unreachable"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086"
[[package]] [[package]]
name = "nix" name = "nix"
version = "0.29.0" version = "0.29.0"
@ -3563,6 +3776,59 @@ version = "2.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
[[package]]
name = "phf"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf"
dependencies = [
"phf_macros",
"phf_shared",
"serde",
]
[[package]]
name = "phf_codegen"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1"
dependencies = [
"phf_generator",
"phf_shared",
]
[[package]]
name = "phf_generator"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737"
dependencies = [
"fastrand",
"phf_shared",
]
[[package]]
name = "phf_macros"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef"
dependencies = [
"phf_generator",
"phf_shared",
"proc-macro2",
"quote",
"syn 2.0.111",
]
[[package]]
name = "phf_shared"
version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266"
dependencies = [
"siphasher",
]
[[package]] [[package]]
name = "pin-project-lite" name = "pin-project-lite"
version = "0.2.16" version = "0.2.16"
@ -3678,6 +3944,12 @@ dependencies = [
"vcpkg", "vcpkg",
] ]
[[package]]
name = "precomputed-hash"
version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
[[package]] [[package]]
name = "pretty_assertions" name = "pretty_assertions"
version = "1.4.1" version = "1.4.1"
@ -3757,6 +4029,16 @@ dependencies = [
"memchr", "memchr",
] ]
[[package]]
name = "quick-xml"
version = "0.37.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb"
dependencies = [
"encoding_rs",
"memchr",
]
[[package]] [[package]]
name = "quinn" name = "quinn"
version = "0.11.9" version = "0.11.9"
@ -4109,6 +4391,18 @@ dependencies = [
"windows-sys 0.52.0", "windows-sys 0.52.0",
] ]
[[package]]
name = "rss"
version = "2.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2107738f003660f0a91f56fd3e3bd3ab5d918b2ddaf1e1ec2136fb1c46f71bf"
dependencies = [
"atom_syndication",
"derive_builder 0.20.2",
"never",
"quick-xml 0.37.5",
]
[[package]] [[package]]
name = "rust_xlsxwriter" name = "rust_xlsxwriter"
version = "0.79.4" version = "0.79.4"
@ -4333,6 +4627,21 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "scraper"
version = "0.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "93cecd86d6259499c844440546d02f55f3e17bd286e529e48d1f9f67e92315cb"
dependencies = [
"cssparser",
"ego-tree",
"getopts",
"html5ever",
"precomputed-hash",
"selectors",
"tendril",
]
[[package]] [[package]]
name = "sct" name = "sct"
version = "0.7.1" version = "0.7.1"
@ -4393,6 +4702,25 @@ dependencies = [
"libc", "libc",
] ]
[[package]]
name = "selectors"
version = "0.33.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "feef350c36147532e1b79ea5c1f3791373e61cbd9a6a2615413b3807bb164fb7"
dependencies = [
"bitflags",
"cssparser",
"derive_more",
"log",
"new_debug_unreachable",
"phf",
"phf_codegen",
"precomputed-hash",
"rustc-hash",
"servo_arc",
"smallvec",
]
[[package]] [[package]]
name = "semver" name = "semver"
version = "1.0.27" version = "1.0.27"
@ -4483,6 +4811,15 @@ dependencies = [
"serde", "serde",
] ]
[[package]]
name = "servo_arc"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "170fb83ab34de17dc69aa7c67482b22218ddb85da56546f9bd6b929e32a05930"
dependencies = [
"stable_deref_trait",
]
[[package]] [[package]]
name = "sha1" name = "sha1"
version = "0.10.6" version = "0.10.6"
@ -4569,6 +4906,12 @@ dependencies = [
"time", "time",
] ]
[[package]]
name = "siphasher"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d"
[[package]] [[package]]
name = "slab" name = "slab"
version = "0.4.11" version = "0.4.11"
@ -4655,6 +4998,31 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]]
name = "string_cache"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901"
dependencies = [
"new_debug_unreachable",
"parking_lot",
"phf_shared",
"precomputed-hash",
"serde",
]
[[package]]
name = "string_cache_codegen"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69"
dependencies = [
"phf_generator",
"phf_shared",
"proc-macro2",
"quote",
]
[[package]] [[package]]
name = "stringprep" name = "stringprep"
version = "0.1.5" version = "0.1.5"
@ -4783,6 +5151,17 @@ dependencies = [
"windows-sys 0.61.2", "windows-sys 0.61.2",
] ]
[[package]]
name = "tendril"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0"
dependencies = [
"futf",
"mac",
"utf-8",
]
[[package]] [[package]]
name = "thin-vec" name = "thin-vec"
version = "0.2.14" version = "0.2.14"
@ -5346,6 +5725,12 @@ version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493"
[[package]]
name = "unicode-width"
version = "0.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254"
[[package]] [[package]]
name = "unicode-xid" name = "unicode-xid"
version = "0.2.6" version = "0.2.6"
@ -5430,7 +5815,7 @@ checksum = "f81eb4d9221ca29bad43d4b6871b6d2e7656e1af2cfca624a87e5d17880d831d"
dependencies = [ dependencies = [
"async-trait", "async-trait",
"bytes", "bytes",
"derive_builder", "derive_builder 0.12.0",
"http 1.4.0", "http 1.4.0",
"reqwest", "reqwest",
"rustify", "rustify",
@ -5575,6 +5960,18 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
] ]
[[package]]
name = "web_atoms"
version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "acd0c322f146d0f8aad130ce6c187953889359584497dac6561204c8e17bb43d"
dependencies = [
"phf",
"phf_codegen",
"string_cache",
"string_cache_codegen",
]
[[package]] [[package]]
name = "webdriver" name = "webdriver"
version = "0.50.0" version = "0.50.0"

View file

@ -1,6 +1,6 @@
# BotTest Development Prompt # BotTest Development Prompt
**Version:** 7.0.0 **Version:** 6.1.0
**Purpose:** Test infrastructure for General Bots ecosystem **Purpose:** Test infrastructure for General Bots ecosystem
--- ---

View file

@ -57,6 +57,19 @@ impl TestConfig {
} }
} }
/// Auto-install mode: let botserver bootstrap all services
/// No need for pre-installed PostgreSQL binaries
pub fn auto_install() -> Self {
Self {
postgres: false, // Botserver will install PostgreSQL
minio: false, // Botserver will install MinIO
redis: false, // Botserver will install Redis
mock_zitadel: true,
mock_llm: true,
run_migrations: false, // Botserver handles migrations
}
}
pub fn database_only() -> Self { pub fn database_only() -> Self {
Self { Self {
postgres: true, postgres: true,
@ -481,17 +494,21 @@ impl BotServerInstance {
// Drive (MinIO) - use SecretsManager fallback env vars // Drive (MinIO) - use SecretsManager fallback env vars
.env("DRIVE_ACCESSKEY", "minioadmin") .env("DRIVE_ACCESSKEY", "minioadmin")
.env("DRIVE_SECRET", "minioadmin") .env("DRIVE_SECRET", "minioadmin")
// Skip service installation during tests // Allow botserver to install services if USE_BOTSERVER_BOOTSTRAP is set
.env("BOTSERVER_SKIP_INSTALL", "1") // Otherwise skip installation for faster tests with existing stack
.env("BOTSERVER_SKIP_INSTALL",
if std::env::var("USE_BOTSERVER_BOOTSTRAP").is_ok() { "0" } else { "1" })
.stdout(std::process::Stdio::inherit()) .stdout(std::process::Stdio::inherit())
.stderr(std::process::Stdio::inherit()) .stderr(std::process::Stdio::inherit())
.spawn() .spawn()
.ok(); .ok();
if process.is_some() { if process.is_some() {
log::info!("Waiting for botserver to bootstrap and become ready..."); // Give more time if using botserver bootstrap (needs to download Vault, PostgreSQL, etc.)
let max_wait = if std::env::var("USE_BOTSERVER_BOOTSTRAP").is_ok() { 600 } else { 120 };
log::info!("Waiting for botserver to bootstrap and become ready... (max {}s)", max_wait);
// Give more time for botserver to bootstrap services // Give more time for botserver to bootstrap services
for i in 0..120 { for i in 0..max_wait {
if let Ok(resp) = reqwest::get(&format!("{}/health", url)).await { if let Ok(resp) = reqwest::get(&format!("{}/health", url)).await {
if resp.status().is_success() { if resp.status().is_success() {
log::info!("Botserver is ready on port {}", port); log::info!("Botserver is ready on port {}", port);
@ -714,11 +731,18 @@ impl TestHarness {
pub async fn full() -> Result<TestContext> { pub async fn full() -> Result<TestContext> {
if std::env::var("USE_EXISTING_STACK").is_ok() { if std::env::var("USE_EXISTING_STACK").is_ok() {
Self::with_existing_stack().await Self::with_existing_stack().await
} else if std::env::var("USE_BOTSERVER_BOOTSTRAP").is_ok() {
Self::setup(TestConfig::auto_install()).await
} else { } else {
Self::setup(TestConfig::full()).await Self::setup(TestConfig::full()).await
} }
} }
/// Setup with botserver auto-installing all services
pub async fn with_auto_install() -> Result<TestContext> {
Self::setup(TestConfig::auto_install()).await
}
pub async fn minimal() -> Result<TestContext> { pub async fn minimal() -> Result<TestContext> {
Self::setup(TestConfig::minimal()).await Self::setup(TestConfig::minimal()).await
} }

View file

@ -32,7 +32,7 @@ async fn test_chat_page_loads() {
return; return;
} }
let chat_input = Locator::css("#chat-input, .chat-input, textarea[placeholder*='message']"); let chat_input = Locator::css("#messageInput");
match browser.wait_for(chat_input).await { match browser.wait_for(chat_input).await {
Ok(_) => println!("Chat input found"), Ok(_) => println!("Chat input found"),
@ -72,12 +72,9 @@ async fn test_chat_widget_elements() {
} }
let elements_to_check = vec![ let elements_to_check = vec![
("#chat-container, .chat-container", "chat container"), ("#chat-app, .chat-layout", "chat container"),
("#chat-input, .chat-input, textarea", "input field"), ("#messageInput", "input field"),
( ("#sendBtn", "send button"),
"#send-button, .send-button, button[type='submit']",
"send button",
),
]; ];
for (selector, name) in elements_to_check { for (selector, name) in elements_to_check {
@ -126,7 +123,7 @@ async fn test_send_message() {
return; return;
} }
let input_locator = Locator::css("#chat-input, .chat-input, textarea"); let input_locator = Locator::css("#messageInput");
if let Err(e) = browser.wait_for(input_locator.clone()).await { if let Err(e) = browser.wait_for(input_locator.clone()).await {
eprintln!("Input not ready: {}", e); eprintln!("Input not ready: {}", e);
ctx.close().await; ctx.close().await;
@ -139,7 +136,7 @@ async fn test_send_message() {
return; return;
} }
let send_button = Locator::css("#send-button, .send-button, button[type='submit']"); let send_button = Locator::css("#sendBtn");
if let Err(e) = browser.click(send_button).await { if let Err(e) = browser.click(send_button).await {
eprintln!("Failed to click send: {}", e); eprintln!("Failed to click send: {}", e);
} }
@ -182,14 +179,14 @@ async fn test_receive_bot_response() {
return; return;
} }
let input_locator = Locator::css("#chat-input, .chat-input, textarea"); let input_locator = Locator::css("#messageInput");
let _ = browser.wait_for(input_locator.clone()).await; let _ = browser.wait_for(input_locator.clone()).await;
let _ = browser.type_text(input_locator, "Test message").await; let _ = browser.type_text(input_locator, "Test message").await;
let send_button = Locator::css("#send-button, .send-button, button[type='submit']"); let send_button = Locator::css("#sendBtn");
let _ = browser.click(send_button).await; let _ = browser.click(send_button).await;
let response_locator = Locator::css(".bot-message, .message-bot, .response"); let response_locator = Locator::css(".message.bot .bot-message");
match browser.wait_for(response_locator).await { match browser.wait_for(response_locator).await {
Ok(_) => println!("Bot response received"), Ok(_) => println!("Bot response received"),
Err(e) => eprintln!("No bot response: {}", e), Err(e) => eprintln!("No bot response: {}", e),
@ -231,8 +228,8 @@ async fn test_chat_history() {
return; return;
} }
let input_locator = Locator::css("#chat-input, .chat-input, textarea"); let input_locator = Locator::css("#messageInput");
let send_button = Locator::css("#send-button, .send-button, button[type='submit']"); let send_button = Locator::css("#sendBtn");
for i in 1..=3 { for i in 1..=3 {
let _ = browser.wait_for(input_locator.clone()).await; let _ = browser.wait_for(input_locator.clone()).await;
@ -243,7 +240,7 @@ async fn test_chat_history() {
tokio::time::sleep(std::time::Duration::from_millis(500)).await; tokio::time::sleep(std::time::Duration::from_millis(500)).await;
} }
let messages_locator = Locator::css(".message, .chat-message"); let messages_locator = Locator::css(".message");
match browser.find_elements(messages_locator).await { match browser.find_elements(messages_locator).await {
Ok(elements) => { Ok(elements) => {
println!("Found {} messages in history", elements.len()); println!("Found {} messages in history", elements.len());
@ -288,8 +285,8 @@ async fn test_typing_indicator() {
return; return;
} }
let input_locator = Locator::css("#chat-input, .chat-input, textarea"); let input_locator = Locator::css("#messageInput");
let send_button = Locator::css("#send-button, .send-button, button[type='submit']"); let send_button = Locator::css("#sendBtn");
let _ = browser.wait_for(input_locator.clone()).await; let _ = browser.wait_for(input_locator.clone()).await;
let _ = browser.type_text(input_locator, "Hello").await; let _ = browser.type_text(input_locator, "Hello").await;
@ -337,7 +334,7 @@ async fn test_keyboard_shortcuts() {
return; return;
} }
let input_locator = Locator::css("#chat-input, .chat-input, textarea"); let input_locator = Locator::css("#messageInput");
let _ = browser.wait_for(input_locator.clone()).await; let _ = browser.wait_for(input_locator.clone()).await;
let _ = browser let _ = browser
.type_text(input_locator.clone(), "Test enter key") .type_text(input_locator.clone(), "Test enter key")
@ -379,7 +376,7 @@ async fn test_empty_message_prevention() {
return; return;
} }
let send_button = Locator::css("#send-button, .send-button, button[type='submit']"); let send_button = Locator::css("#sendBtn");
let _ = browser.wait_for(send_button.clone()).await; let _ = browser.wait_for(send_button.clone()).await;
match browser.is_element_enabled(send_button.clone()).await { match browser.is_element_enabled(send_button.clone()).await {
@ -435,7 +432,7 @@ async fn test_responsive_design() {
if browser.set_window_size(width, height).await.is_ok() { if browser.set_window_size(width, height).await.is_ok() {
tokio::time::sleep(std::time::Duration::from_millis(200)).await; tokio::time::sleep(std::time::Duration::from_millis(200)).await;
let chat_container = Locator::css("#chat-container, .chat-container, .chat-widget"); let chat_container = Locator::css("#chat-app, .chat-layout");
match browser.is_element_visible(chat_container).await { match browser.is_element_visible(chat_container).await {
Ok(visible) => { Ok(visible) => {
if visible { if visible {
@ -485,8 +482,8 @@ async fn test_conversation_reset() {
return; return;
} }
let input_locator = Locator::css("#chat-input, .chat-input, textarea"); let input_locator = Locator::css("#messageInput");
let send_button = Locator::css("#send-button, .send-button, button[type='submit']"); let send_button = Locator::css("#sendBtn");
let _ = browser.wait_for(input_locator.clone()).await; let _ = browser.wait_for(input_locator.clone()).await;
let _ = browser.type_text(input_locator, "Test message").await; let _ = browser.type_text(input_locator, "Test message").await;
@ -498,7 +495,7 @@ async fn test_conversation_reset() {
match browser.click(reset_button).await { match browser.click(reset_button).await {
Ok(_) => { Ok(_) => {
tokio::time::sleep(std::time::Duration::from_millis(300)).await; tokio::time::sleep(std::time::Duration::from_millis(300)).await;
let messages_locator = Locator::css(".message, .chat-message"); let messages_locator = Locator::css(".message");
match browser.find_elements(messages_locator).await { match browser.find_elements(messages_locator).await {
Ok(elements) if elements.is_empty() => { Ok(elements) if elements.is_empty() => {
println!("Conversation reset successfully"); println!("Conversation reset successfully");