How to ensure 100% code coverage for Ash?

I’m using ExCoveralls to measure code coverage in an Ash-based project, and I noticed that lines written through Ash DSL macros don’t appear as SLOC in the coverage report.

For example, in the following action:

create :create_task do
  ...
  change set_attribute(:state, "created")
end

the macro line isn’t counted toward coverage. However, when I rewrite it using an anonymous function:

create :create_task do
  ...
  change fn changeset, _context ->
    Ash.Changeset.set_attribute(changeset, :state, "created")
  end
end

the lines inside the function are counted as SLOC.

Is there any recommended way to get meaningful coverage metrics when using Ash DSL macros?
Are there any tools or approaches that better support coverage reporting for Ash-generated code?

Thanks!

They are compile-time constructs, it’s a limitation of coverage tools with metaprogramming, not specific to Ash. You did find a trick to turn it into runtime code but the question is why even do this, i.e. 100% sounds better but beyond that is it really necessary?

Meaningful code coverage != 100% code coverage

Ensure the code is well-tested, then look at the number that comes out. That’s the number you need. 80% is generally considered very good.

Don’t waste your time trying to get 100% code coverage.

2 Likes