Current section
Files
Jump to
Current section
Files
src/startest/internal/runner/backend/javascript.gleam
//// The test runner implementation specific to the JavaScript target.
@target(javascript)
import gleam/dynamic.{type Dynamic}
@target(javascript)
import gleam/javascript/array.{type Array}
@target(javascript)
import gleam/javascript/promise.{type Promise}
@target(javascript)
import gleam/list
@target(javascript)
import startest/context.{type Context}
@target(javascript)
import startest/internal/gleam_toml
@target(javascript)
import startest/internal/runner/core
@target(javascript)
import startest/locator.{TestFunction, TestSourceFile}
@target(javascript)
pub fn run_tests(ctx: Context) -> Promise(Nil) {
let assert Ok(test_files) = locator.locate_test_files(ctx)
let assert Ok(package_name) = gleam_toml.read_name()
use tests <- promise.await(
test_files
|> list.map(fn(test_file) {
let js_module_path =
"../" <> package_name <> "/" <> test_file.module_name <> ".mjs"
get_exports(js_module_path)
|> promise.map(array.to_list)
|> promise.map(list.map(_, fn(export) {
let #(name, body) = export
TestFunction(module_name: test_file.module_name, name: name, body: body)
}))
|> promise.map(fn(tests) { TestSourceFile(..test_file, tests: tests) })
})
|> promise.await_list
|> promise.map(locator.identify_tests(_, ctx)),
)
tests
|> core.run_tests(ctx)
|> promise.resolve
}
@target(javascript)
@external(javascript, "../../../../startest_ffi.mjs", "get_exports")
fn get_exports(
module_path: String,
) -> Promise(Array(#(String, fn() -> Dynamic)))