from __future__ import annotations
from sparkless.testing import get_imports
_imports = get_imports()
F = _imports.F
Window = _imports.Window
def test_window_no_arg_constructor(spark) -> None:
df = spark.createDataFrame(
[{"dept": "A", "salary": 100}, {"dept": "A", "salary": 200}],
["dept", "salary"],
)
w = Window().partitionBy("dept").orderBy("salary")
out = df.select("dept", "salary", F.row_number().over(w).alias("rn")).collect()
assert len(out) == 2
assert out[0]["dept"] == "A" and out[0]["salary"] == 100 and out[0]["rn"] == 1
assert out[1]["dept"] == "A" and out[1]["salary"] == 200 and out[1]["rn"] == 2
def test_window_partition_by_order_by_strings_classmethod(spark) -> None:
df = spark.createDataFrame(
[(1, 100, "A"), (2, 200, "A"), (3, 150, "B")],
["id", "salary", "dept"],
)
w = Window.partitionBy("dept").orderBy("salary")
out = df.withColumn("rn", F.row_number().over(w)).orderBy(["id"]).collect()
assert len(out) == 3
by_id = {r["id"]: r["rn"] for r in out}
assert by_id[1] == 1 and by_id[2] == 2 and by_id[3] == 1