feat(plotting): extract plotting module with histogram and CDF
This commit is contained in:
@@ -0,0 +1,134 @@
|
||||
"""Tests for the plotting module."""
|
||||
|
||||
import pytest
|
||||
from pathlib import Path
|
||||
from unittest.mock import MagicMock, patch
|
||||
import matplotlib
|
||||
matplotlib.use("Agg")
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
from disk_checker.plotting.plots import draw_histogram, draw_cdf, generate_plot
|
||||
import pandas as pd
|
||||
|
||||
|
||||
class TestDrawHistogram:
|
||||
"""Tests for draw_histogram function."""
|
||||
|
||||
@pytest.fixture
|
||||
def sample_df(self):
|
||||
"""Create a sample DataFrame for testing."""
|
||||
return pd.DataFrame({
|
||||
"metric": ["read_clat", "read_clat", "write_clat"],
|
||||
"latency_ns": [1000, 2000, 1500],
|
||||
"count": [1, 2, 1],
|
||||
})
|
||||
|
||||
def test_draws_histogram(self, sample_df, tmp_path):
|
||||
"""Test that histogram is drawn without errors."""
|
||||
fig, ax = plt.subplots()
|
||||
draw_histogram(ax, sample_df, ["read_clat"])
|
||||
assert ax.get_title() == "Completion latency distribution"
|
||||
plt.close(fig)
|
||||
|
||||
def test_multiple_metrics(self, sample_df, tmp_path):
|
||||
"""Test drawing multiple metrics."""
|
||||
fig, ax = plt.subplots()
|
||||
draw_histogram(ax, sample_df, ["read_clat", "write_clat"])
|
||||
assert len(ax.collections) > 0
|
||||
plt.close(fig)
|
||||
|
||||
def test_log_scale(self, sample_df, tmp_path):
|
||||
"""Test logarithmic scale."""
|
||||
fig, ax = plt.subplots()
|
||||
draw_histogram(ax, sample_df, ["read_clat"], log_x=True, log_y=True)
|
||||
assert ax.get_xscale() == "log"
|
||||
assert ax.get_yscale() == "log"
|
||||
plt.close(fig)
|
||||
|
||||
|
||||
class TestDrawCdf:
|
||||
"""Tests for draw_cdf function."""
|
||||
|
||||
@pytest.fixture
|
||||
def sample_df(self):
|
||||
"""Create a sample DataFrame for testing."""
|
||||
return pd.DataFrame({
|
||||
"metric": ["read_clat", "read_clat"],
|
||||
"latency_ns": [1000, 2000],
|
||||
"count": [1, 3],
|
||||
})
|
||||
|
||||
def test_draws_cdf(self, sample_df, tmp_path):
|
||||
"""Test that CDF is drawn without errors."""
|
||||
fig, ax = plt.subplots()
|
||||
draw_cdf(ax, sample_df, ["read_clat"])
|
||||
assert ax.get_title() == "Cumulative latency distribution"
|
||||
assert ax.get_ylim() == (0, 100)
|
||||
plt.close(fig)
|
||||
|
||||
def test_log_scale(self, sample_df, tmp_path):
|
||||
"""Test logarithmic X scale."""
|
||||
fig, ax = plt.subplots()
|
||||
draw_cdf(ax, sample_df, ["read_clat"], log_x=True)
|
||||
assert ax.get_xscale() == "log"
|
||||
plt.close(fig)
|
||||
|
||||
|
||||
class TestGeneratePlot:
|
||||
"""Tests for generate_plot function."""
|
||||
|
||||
@pytest.fixture
|
||||
def sample_df(self):
|
||||
"""Create a sample DataFrame for testing."""
|
||||
return pd.DataFrame({
|
||||
"metric": ["read_clat", "read_clat"],
|
||||
"latency_ns": [1000, 2000],
|
||||
"count": [1, 3],
|
||||
})
|
||||
|
||||
def test_generates_histogram(self, sample_df, tmp_path):
|
||||
"""Test generating histogram plot."""
|
||||
output = tmp_path / "test.png"
|
||||
result = generate_plot(
|
||||
df=sample_df,
|
||||
metrics=["read_clat"],
|
||||
output_path=output,
|
||||
)
|
||||
assert result == output
|
||||
assert output.exists()
|
||||
|
||||
def test_generates_cdf_only(self, sample_df, tmp_path):
|
||||
"""Test generating CDF-only plot."""
|
||||
output = tmp_path / "test_cdf.png"
|
||||
result = generate_plot(
|
||||
df=sample_df,
|
||||
metrics=["read_clat"],
|
||||
output_path=output,
|
||||
cdf_only=True,
|
||||
)
|
||||
assert result == output
|
||||
assert output.exists()
|
||||
|
||||
def test_generates_histogram_with_cdf(self, sample_df, tmp_path):
|
||||
"""Test generating histogram with CDF below."""
|
||||
output = tmp_path / "test_both.png"
|
||||
result = generate_plot(
|
||||
df=sample_df,
|
||||
metrics=["read_clat"],
|
||||
output_path=output,
|
||||
show_cdf=True,
|
||||
)
|
||||
assert result == output
|
||||
assert output.exists()
|
||||
|
||||
def test_custom_dpi(self, sample_df, tmp_path):
|
||||
"""Test custom DPI setting."""
|
||||
output = tmp_path / "test_dpi.png"
|
||||
result = generate_plot(
|
||||
df=sample_df,
|
||||
metrics=["read_clat"],
|
||||
output_path=output,
|
||||
dpi=300,
|
||||
)
|
||||
assert result == output
|
||||
assert output.exists()
|
||||
Reference in New Issue
Block a user