You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

121 lines
3.4 KiB

  1. extern crate actix_demo;
  2. use actix_demo::{AppConfig, AppData, EnvConfig};
  3. use actix_web::test;
  4. use actix_web::App;
  5. use diesel::r2d2::{self, ConnectionManager};
  6. use std::io;
  7. use std::io::ErrorKind;
  8. use tracing::subscriber::set_global_default;
  9. use tracing_actix_web::TracingLogger;
  10. use tracing_log::LogTracer;
  11. use tracing_subscriber::fmt::{format::FmtSpan, Subscriber as FmtSubscriber};
  12. use tracing_subscriber::{layer::SubscriberExt, EnvFilter};
  13. use actix_demo::configure_app;
  14. use actix_http::Request;
  15. use actix_web::{dev as ax_dev, Error as AxError};
  16. pub async fn test_app() -> io::Result<
  17. impl ax_dev::Service<
  18. Request = Request,
  19. Response = ax_dev::ServiceResponse<impl ax_dev::MessageBody>,
  20. Error = AxError,
  21. >,
  22. > {
  23. let _ = dotenv::dotenv().map_err(|err| {
  24. io::Error::new(
  25. ErrorKind::Other,
  26. format!("Failed to set up env: {:?}", err),
  27. )
  28. })?;
  29. let _ = envy::prefixed("ACTIX_DEMO_")
  30. .from_env::<EnvConfig>()
  31. .map_err(|err| {
  32. io::Error::new(
  33. ErrorKind::Other,
  34. format!("Failed to parse config: {:?}", err),
  35. )
  36. })?;
  37. let env_filter =
  38. EnvFilter::try_from_env("ACTIX_DEMO_RUST_LOG").map_err(|err| {
  39. io::Error::new(
  40. ErrorKind::Other,
  41. format!("Failed to set up env logger: {:?}", err),
  42. )
  43. })?;
  44. let _ = LogTracer::init().map_err(|err| {
  45. io::Error::new(
  46. ErrorKind::Other,
  47. format!("Failed to set up log tracer: {:?}", err),
  48. )
  49. });
  50. let subscriber = FmtSubscriber::builder()
  51. .pretty()
  52. .with_test_writer()
  53. .with_span_events(FmtSpan::NEW)
  54. .with_span_events(FmtSpan::CLOSE)
  55. .finish()
  56. .with(env_filter);
  57. let _ = set_global_default(subscriber).map_err(|err| {
  58. io::Error::new(
  59. ErrorKind::Other,
  60. format!("Failed to set subscriber: {:?}", err),
  61. )
  62. });
  63. let connspec = ":memory:";
  64. let manager = ConnectionManager::<
  65. diesel_tracing::sqlite::InstrumentedSqliteConnection,
  66. >::new(connspec);
  67. let pool = r2d2::Pool::builder().build(manager).map_err(|err| {
  68. io::Error::new(
  69. ErrorKind::Other,
  70. format!("Failed to create pool: {:?}", err),
  71. )
  72. })?;
  73. let _ = {
  74. let conn = &pool.get().map_err(|err| {
  75. io::Error::new(
  76. ErrorKind::Other,
  77. format!("Failed to get connection: {:?}", err),
  78. )
  79. })?;
  80. let migrations_dir = diesel_migrations::find_migrations_directory()
  81. .map_err(|err| {
  82. io::Error::new(
  83. ErrorKind::Other,
  84. format!("Error finding migrations dir: {:?}", err),
  85. )
  86. })?;
  87. let _ = diesel_migrations::run_pending_migrations_in_directory(
  88. conn,
  89. &migrations_dir,
  90. &mut io::sink(),
  91. )
  92. .map_err(|err| {
  93. io::Error::new(
  94. ErrorKind::Other,
  95. format!("Error running migrations: {:?}", err),
  96. )
  97. })?;
  98. };
  99. Ok(test::init_service(
  100. App::new()
  101. .configure(configure_app(AppData {
  102. config: AppConfig { hash_cost: 8 },
  103. pool,
  104. }))
  105. .wrap(TracingLogger),
  106. )
  107. .await)
  108. }