use super::*;
#[test]
fn test_path_resolution_relative_import() {
let code = r#"import App from './App';"#;
let current_module = PathBuf::from("/project/src/main.tsx");
let known_modules: HashSet<String> = [
"/project/src/main.tsx".to_string(),
"/project/src/App.tsx".to_string(),
]
.into_iter()
.collect();
let transformed =
crate::web_bundler::transform_module_code(code, Some(¤t_module), &known_modules);
assert!(
transformed.contains("require('/project/src/App.tsx')")
|| transformed.contains("require('./App')"), "Should use absolute path for local import: got '{}'",
transformed
);
}
#[test]
fn test_path_resolution_parent_import() {
let code = r#"import utils from '../utils';"#;
let current_module = PathBuf::from("/project/src/components/Button.tsx");
let known_modules: HashSet<String> = [
"/project/src/components/Button.tsx".to_string(),
"/project/src/utils.ts".to_string(),
]
.into_iter()
.collect();
let transformed =
crate::web_bundler::transform_module_code(code, Some(¤t_module), &known_modules);
assert!(
transformed.contains("require('/project/src/utils.ts')")
|| transformed.contains("require('../utils')"),
"Should handle parent imports: got '{}'",
transformed
);
}
#[test]
fn test_path_resolution_named_import() {
let code = r#"import { Button, Input } from './components';"#;
let current_module = PathBuf::from("/project/src/App.tsx");
let known_modules: HashSet<String> = [
"/project/src/App.tsx".to_string(),
"/project/src/components/index.ts".to_string(),
]
.into_iter()
.collect();
let transformed =
crate::web_bundler::transform_module_code(code, Some(¤t_module), &known_modules);
assert!(
transformed.contains("require('/project/src/components/index.ts')")
|| transformed.contains("require('./components')"),
"Should resolve named imports: got '{}'",
transformed
);
}
#[test]
fn test_path_resolution_reexport() {
let code = r#"export * from './types';"#;
let current_module = PathBuf::from("/project/src/index.ts");
let known_modules: HashSet<String> = [
"/project/src/index.ts".to_string(),
"/project/src/types.ts".to_string(),
]
.into_iter()
.collect();
let transformed =
crate::web_bundler::transform_module_code(code, Some(¤t_module), &known_modules);
assert!(
transformed.contains("require('/project/src/types.ts')")
|| transformed.contains("require('./types')"),
"Should resolve re-export paths: got '{}'",
transformed
);
}
#[test]
fn test_path_resolution_namespace_import() {
let code = r#"import * as Utils from './utils';"#;
let current_module = PathBuf::from("/project/src/main.ts");
let known_modules: HashSet<String> = [
"/project/src/main.ts".to_string(),
"/project/src/utils.ts".to_string(),
]
.into_iter()
.collect();
let transformed =
crate::web_bundler::transform_module_code(code, Some(¤t_module), &known_modules);
assert!(
transformed.contains("require('/project/src/utils.ts')")
|| transformed.contains("require('./utils')"),
"Should resolve namespace imports: got '{}'",
transformed
);
}
#[test]
fn test_path_resolution_external_unchanged() {
let code = r#"import React from 'react';"#;
let current_module = PathBuf::from("/project/src/App.tsx");
let known_modules: HashSet<String> = ["/project/src/App.tsx".to_string()]
.into_iter()
.collect();
let transformed =
crate::web_bundler::transform_module_code(code, Some(¤t_module), &known_modules);
assert!(
transformed.contains("window.React"),
"External should use globals: got '{}'",
transformed
);
assert!(
!transformed.contains("require('react')"),
"Should not require external modules"
);
}
#[test]
fn test_path_resolution_mixed_imports() {
let code = r#"import React from 'react';
import App from './App';
import { utils } from '../lib/utils';"#;
let current_module = PathBuf::from("/project/src/main.tsx");
let known_modules: HashSet<String> = [
"/project/src/main.tsx".to_string(),
"/project/src/App.tsx".to_string(),
"/project/lib/utils.ts".to_string(),
]
.into_iter()
.collect();
let transformed =
crate::web_bundler::transform_module_code(code, Some(¤t_module), &known_modules);
assert!(
transformed.contains("window.React"),
"React should use global: got '{}'",
transformed
);
assert!(
transformed.contains("require("),
"Should have require calls for local modules: got '{}'",
transformed
);
}
#[test]
fn test_path_resolution_with_explicit_extension() {
let code = r#"import config from './config.json';"#;
let current_module = PathBuf::from("/project/src/main.tsx");
let known_modules: HashSet<String> = [
"/project/src/main.tsx".to_string(),
"/project/src/config.json".to_string(),
]
.into_iter()
.collect();
let transformed =
crate::web_bundler::transform_module_code(code, Some(¤t_module), &known_modules);
assert!(
transformed.contains("require('/project/src/config.json')")
|| transformed.contains("require('./config.json')"),
"Should handle explicit extension: got '{}'",
transformed
);
}
#[test]
fn test_path_resolution_dot_in_path_not_extension() {
let code = r#"import App from './App';"#;
let current_module = PathBuf::from("/project/src/main.tsx");
let known_modules: HashSet<String> = [
"/project/src/main.tsx".to_string(),
"/project/src/App.tsx".to_string(),
]
.into_iter()
.collect();
let transformed =
crate::web_bundler::transform_module_code(code, Some(¤t_module), &known_modules);
assert!(
transformed.contains("require('/project/src/App.tsx')")
|| transformed.contains("require('./App')"),
"Should try extensions for ./App: got '{}'",
transformed
);
}
#[test]
fn test_path_resolution_hidden_file() {
let code = r#"import env from './.env';"#;
let current_module = PathBuf::from("/project/src/main.tsx");
let known_modules: HashSet<String> = [
"/project/src/main.tsx".to_string(),
"/project/src/.env".to_string(),
]
.into_iter()
.collect();
let transformed =
crate::web_bundler::transform_module_code(code, Some(¤t_module), &known_modules);
assert!(
transformed.contains("require('/project/src/.env')")
|| transformed.contains("require('./.env')"),
"Should handle hidden files: got '{}'",
transformed
);
}