Where in the source code are transaction validation checks implemented?
Your general understanding is correct.

Mining doesn't perform any additional checks then any other full node.  Mining serves the function of giving transactions an ordering which is difficult to undo, but validation is just a function performed by every node.

Some tests are in miner.cpp because creating a block that matches some set of rules needs different code than checking if a block matches those rules. For example, some space needs to be set aside for the coinbase transaction (which is produced externally in normal use).