feat: Check logs against parts of the message only - #6704

Merged
kenjis merged 2 commits into
codeigniter4:4.3from
paulbalandan:assert-logged-approx
Oct 20, 2022
Merged

feat: Check logs against parts of the message only#6704
kenjis merged 2 commits into
codeigniter4:4.3from
paulbalandan:assert-logged-approx

Conversation

@paulbalandan

@paulbalandanpaulbalandan commented Oct 17, 2022

Copy link
Copy Markdown
Member

Description
Currently, CIUnitTestCase::assertLogged() matches the logged message verbatim. For simple messages this is no problem but for complex, hard-to-build, or volatile messages, it may be hard to come up with the exact message. This PR adds the capability for the assertLogged method to compare only parts of the message instead of the whole.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@paulbalandanpaulbalandan added docs needed Pull requests needing documentation write-ups and/or revisions. 4.3 labels Oct 17, 2022
@kenjiskenjis added the enhancement PRs that improve existing functionalities label Oct 17, 2022
@kenjis

Copy link
Copy Markdown
Member

The implementation looks good.

@paulbalandanpaulbalandan removed the docs needed Pull requests needing documentation write-ups and/or revisions. label Oct 17, 2022
@kenjis

Copy link
Copy Markdown
Member

Something wrong with GA checks.

Some checks were not successful
1 failing and 5 successful checks

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would lean towards creating a new assertLoggedStrict() or the like, but if you two prefer this I'm good with it.

Edit: the opposite, I suppose! assertLogContains()

@paulbalandan

Copy link
Copy Markdown
MemberAuthor

I was actually contemplating between a new method and modified method. I'll check what I can do.

@kenjis

Copy link
Copy Markdown
Member

Generally It is better to avoid boolean flag parameter.
I prefer a new method, because it is easier to read.

$this->assertLogged('error', 'variable did not', false); // What's false? Jump to the method.$this->assertLogContains('error', 'variable did not');

@paulbalandanpaulbalandan changed the title feat: Add $useExactComparison option to assertLoggedfeat: Check logs against parts of the message onlyOct 18, 2022
*
* @throws Exception
*/
public function assertLogged(string $level, $expectedMessage = null)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not related to this PR, but why $expectedMessage can be null?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure either.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤦‍♂️

/**
* Asserts that there is a log record that contains `$logMessage` in the message.
*/
public function assertLogContains(string $level, string $logMessage, string $message = ''): void

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$expectedMessage is better? assertLogged() uses it.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My understanding is $expectedMessage is used since the assertion compares the message as expected in the logs.
For assertLogContains, I think it is counter-intuitive to use $expectedMessage when it can only be a part of the whole expected message. I was also thinking whether to use $needle or $needleMessage as alternative name.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No preference from me

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am a little uncomfortable with both $needle and $needleMessage.
needle needs haystack.

So let's leave it as it is.

@kenjis
kenjis merged commit ee3e329 into codeigniter4:4.3Oct 20, 2022
@paulbalandan
paulbalandan deleted the assert-logged-approx branch October 20, 2022 05:00
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that improve existing functionalities

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@paulbalandan@kenjis@MGatner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

feat: Check logs against parts of the message only - #6704

Merged
kenjis merged 2 commits into
codeigniter4:4.3from
paulbalandan:assert-logged-approx
Oct 20, 2022
Merged

feat: Check logs against parts of the message only#6704
kenjis merged 2 commits into
codeigniter4:4.3from
paulbalandan:assert-logged-approx

Conversation

@paulbalandan

@paulbalandanpaulbalandan commented Oct 17, 2022

Copy link
Copy Markdown
Member

Description
Currently, CIUnitTestCase::assertLogged() matches the logged message verbatim. For simple messages this is no problem but for complex, hard-to-build, or volatile messages, it may be hard to come up with the exact message. This PR adds the capability for the assertLogged method to compare only parts of the message instead of the whole.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@paulbalandanpaulbalandan added docs needed Pull requests needing documentation write-ups and/or revisions. 4.3 labels Oct 17, 2022
@kenjiskenjis added the enhancement PRs that improve existing functionalities label Oct 17, 2022
@kenjis

Copy link
Copy Markdown
Member

The implementation looks good.

@paulbalandanpaulbalandan removed the docs needed Pull requests needing documentation write-ups and/or revisions. label Oct 17, 2022
@kenjis

Copy link
Copy Markdown
Member

Something wrong with GA checks.

Some checks were not successful
1 failing and 5 successful checks

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would lean towards creating a new assertLoggedStrict() or the like, but if you two prefer this I'm good with it.

Edit: the opposite, I suppose! assertLogContains()

@paulbalandan

Copy link
Copy Markdown
MemberAuthor

I was actually contemplating between a new method and modified method. I'll check what I can do.

@kenjis

Copy link
Copy Markdown
Member

Generally It is better to avoid boolean flag parameter.
I prefer a new method, because it is easier to read.

$this->assertLogged('error', 'variable did not', false); // What's false? Jump to the method.$this->assertLogContains('error', 'variable did not');

@paulbalandanpaulbalandan changed the title feat: Add $useExactComparison option to assertLoggedfeat: Check logs against parts of the message onlyOct 18, 2022
*
* @throws Exception
*/
public function assertLogged(string $level, $expectedMessage = null)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not related to this PR, but why $expectedMessage can be null?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure either.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤦‍♂️

/**
* Asserts that there is a log record that contains `$logMessage` in the message.
*/
public function assertLogContains(string $level, string $logMessage, string $message = ''): void

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$expectedMessage is better? assertLogged() uses it.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My understanding is $expectedMessage is used since the assertion compares the message as expected in the logs.
For assertLogContains, I think it is counter-intuitive to use $expectedMessage when it can only be a part of the whole expected message. I was also thinking whether to use $needle or $needleMessage as alternative name.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No preference from me

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am a little uncomfortable with both $needle and $needleMessage.
needle needs haystack.

So let's leave it as it is.

@kenjis
kenjis merged commit ee3e329 into codeigniter4:4.3Oct 20, 2022
@paulbalandan
paulbalandan deleted the assert-logged-approx branch October 20, 2022 05:00
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that improve existing functionalities

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@paulbalandan@kenjis@MGatner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: Check logs against parts of the message only - #6704

Merged
kenjis merged 2 commits into
codeigniter4:4.3from
paulbalandan:assert-logged-approx
Oct 20, 2022
Merged

feat: Check logs against parts of the message only#6704
kenjis merged 2 commits into
codeigniter4:4.3from
paulbalandan:assert-logged-approx

Conversation

@paulbalandan

@paulbalandanpaulbalandan commented Oct 17, 2022

Copy link
Copy Markdown
Member

Description
Currently, CIUnitTestCase::assertLogged() matches the logged message verbatim. For simple messages this is no problem but for complex, hard-to-build, or volatile messages, it may be hard to come up with the exact message. This PR adds the capability for the assertLogged method to compare only parts of the message instead of the whole.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@paulbalandanpaulbalandan added docs needed Pull requests needing documentation write-ups and/or revisions. 4.3 labels Oct 17, 2022
@kenjiskenjis added the enhancement PRs that improve existing functionalities label Oct 17, 2022
@kenjis

Copy link
Copy Markdown
Member

The implementation looks good.

@paulbalandanpaulbalandan removed the docs needed Pull requests needing documentation write-ups and/or revisions. label Oct 17, 2022
@kenjis

Copy link
Copy Markdown
Member

Something wrong with GA checks.

Some checks were not successful
1 failing and 5 successful checks

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would lean towards creating a new assertLoggedStrict() or the like, but if you two prefer this I'm good with it.

Edit: the opposite, I suppose! assertLogContains()

@paulbalandan

Copy link
Copy Markdown
MemberAuthor

I was actually contemplating between a new method and modified method. I'll check what I can do.

@kenjis

Copy link
Copy Markdown
Member

Generally It is better to avoid boolean flag parameter.
I prefer a new method, because it is easier to read.

$this->assertLogged('error', 'variable did not', false); // What's false? Jump to the method.$this->assertLogContains('error', 'variable did not');

@paulbalandanpaulbalandan changed the title feat: Add $useExactComparison option to assertLoggedfeat: Check logs against parts of the message onlyOct 18, 2022
*
* @throws Exception
*/
public function assertLogged(string $level, $expectedMessage = null)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not related to this PR, but why $expectedMessage can be null?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure either.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤦‍♂️

/**
* Asserts that there is a log record that contains `$logMessage` in the message.
*/
public function assertLogContains(string $level, string $logMessage, string $message = ''): void

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$expectedMessage is better? assertLogged() uses it.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My understanding is $expectedMessage is used since the assertion compares the message as expected in the logs.
For assertLogContains, I think it is counter-intuitive to use $expectedMessage when it can only be a part of the whole expected message. I was also thinking whether to use $needle or $needleMessage as alternative name.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No preference from me

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am a little uncomfortable with both $needle and $needleMessage.
needle needs haystack.

So let's leave it as it is.

@kenjis
kenjis merged commit ee3e329 into codeigniter4:4.3Oct 20, 2022
@paulbalandan
paulbalandan deleted the assert-logged-approx branch October 20, 2022 05:00
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that improve existing functionalities

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@paulbalandan@kenjis@MGatner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: Check logs against parts of the message only - #6704

Merged
kenjis merged 2 commits into
codeigniter4:4.3from
paulbalandan:assert-logged-approx
Oct 20, 2022
Merged

feat: Check logs against parts of the message only#6704
kenjis merged 2 commits into
codeigniter4:4.3from
paulbalandan:assert-logged-approx

Conversation

@paulbalandan

@paulbalandanpaulbalandan commented Oct 17, 2022

Copy link
Copy Markdown
Member

Description
Currently, CIUnitTestCase::assertLogged() matches the logged message verbatim. For simple messages this is no problem but for complex, hard-to-build, or volatile messages, it may be hard to come up with the exact message. This PR adds the capability for the assertLogged method to compare only parts of the message instead of the whole.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@paulbalandanpaulbalandan added docs needed Pull requests needing documentation write-ups and/or revisions. 4.3 labels Oct 17, 2022
@kenjiskenjis added the enhancement PRs that improve existing functionalities label Oct 17, 2022
@kenjis

Copy link
Copy Markdown
Member

The implementation looks good.

@paulbalandanpaulbalandan removed the docs needed Pull requests needing documentation write-ups and/or revisions. label Oct 17, 2022
@kenjis

Copy link
Copy Markdown
Member

Something wrong with GA checks.

Some checks were not successful
1 failing and 5 successful checks

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would lean towards creating a new assertLoggedStrict() or the like, but if you two prefer this I'm good with it.

Edit: the opposite, I suppose! assertLogContains()

@paulbalandan

Copy link
Copy Markdown
MemberAuthor

I was actually contemplating between a new method and modified method. I'll check what I can do.

@kenjis

Copy link
Copy Markdown
Member

Generally It is better to avoid boolean flag parameter.
I prefer a new method, because it is easier to read.

$this->assertLogged('error', 'variable did not', false); // What's false? Jump to the method.$this->assertLogContains('error', 'variable did not');

@paulbalandanpaulbalandan changed the title feat: Add $useExactComparison option to assertLoggedfeat: Check logs against parts of the message onlyOct 18, 2022
*
* @throws Exception
*/
public function assertLogged(string $level, $expectedMessage = null)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not related to this PR, but why $expectedMessage can be null?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure either.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤦‍♂️

/**
* Asserts that there is a log record that contains `$logMessage` in the message.
*/
public function assertLogContains(string $level, string $logMessage, string $message = ''): void

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$expectedMessage is better? assertLogged() uses it.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My understanding is $expectedMessage is used since the assertion compares the message as expected in the logs.
For assertLogContains, I think it is counter-intuitive to use $expectedMessage when it can only be a part of the whole expected message. I was also thinking whether to use $needle or $needleMessage as alternative name.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No preference from me

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am a little uncomfortable with both $needle and $needleMessage.
needle needs haystack.

So let's leave it as it is.

@kenjis
kenjis merged commit ee3e329 into codeigniter4:4.3Oct 20, 2022
@paulbalandan
paulbalandan deleted the assert-logged-approx branch October 20, 2022 05:00
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that improve existing functionalities

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@paulbalandan@kenjis@MGatner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

feat: Check logs against parts of the message only - #6704

Merged
kenjis merged 2 commits into
codeigniter4:4.3from
paulbalandan:assert-logged-approx
Oct 20, 2022
Merged

feat: Check logs against parts of the message only#6704
kenjis merged 2 commits into
codeigniter4:4.3from
paulbalandan:assert-logged-approx

Conversation

@paulbalandan

@paulbalandanpaulbalandan commented Oct 17, 2022

Copy link
Copy Markdown
Member

Description
Currently, CIUnitTestCase::assertLogged() matches the logged message verbatim. For simple messages this is no problem but for complex, hard-to-build, or volatile messages, it may be hard to come up with the exact message. This PR adds the capability for the assertLogged method to compare only parts of the message instead of the whole.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@paulbalandanpaulbalandan added docs needed Pull requests needing documentation write-ups and/or revisions. 4.3 labels Oct 17, 2022
@kenjiskenjis added the enhancement PRs that improve existing functionalities label Oct 17, 2022
@kenjis

Copy link
Copy Markdown
Member

The implementation looks good.

@paulbalandanpaulbalandan removed the docs needed Pull requests needing documentation write-ups and/or revisions. label Oct 17, 2022
@kenjis

Copy link
Copy Markdown
Member

Something wrong with GA checks.

Some checks were not successful
1 failing and 5 successful checks

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would lean towards creating a new assertLoggedStrict() or the like, but if you two prefer this I'm good with it.

Edit: the opposite, I suppose! assertLogContains()

@paulbalandan

Copy link
Copy Markdown
MemberAuthor

I was actually contemplating between a new method and modified method. I'll check what I can do.

@kenjis

Copy link
Copy Markdown
Member

Generally It is better to avoid boolean flag parameter.
I prefer a new method, because it is easier to read.

$this->assertLogged('error', 'variable did not', false); // What's false? Jump to the method.$this->assertLogContains('error', 'variable did not');

@paulbalandanpaulbalandan changed the title feat: Add $useExactComparison option to assertLoggedfeat: Check logs against parts of the message onlyOct 18, 2022
*
* @throws Exception
*/
public function assertLogged(string $level, $expectedMessage = null)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not related to this PR, but why $expectedMessage can be null?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure either.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤦‍♂️

/**
* Asserts that there is a log record that contains `$logMessage` in the message.
*/
public function assertLogContains(string $level, string $logMessage, string $message = ''): void

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$expectedMessage is better? assertLogged() uses it.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My understanding is $expectedMessage is used since the assertion compares the message as expected in the logs.
For assertLogContains, I think it is counter-intuitive to use $expectedMessage when it can only be a part of the whole expected message. I was also thinking whether to use $needle or $needleMessage as alternative name.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No preference from me

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am a little uncomfortable with both $needle and $needleMessage.
needle needs haystack.

So let's leave it as it is.

@kenjis
kenjis merged commit ee3e329 into codeigniter4:4.3Oct 20, 2022
@paulbalandan
paulbalandan deleted the assert-logged-approx branch October 20, 2022 05:00
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that improve existing functionalities

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@paulbalandan@kenjis@MGatner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: Check logs against parts of the message only - #6704

Merged
kenjis merged 2 commits into
codeigniter4:4.3from
paulbalandan:assert-logged-approx
Oct 20, 2022
Merged

feat: Check logs against parts of the message only#6704
kenjis merged 2 commits into
codeigniter4:4.3from
paulbalandan:assert-logged-approx

Conversation

@paulbalandan

@paulbalandanpaulbalandan commented Oct 17, 2022

Copy link
Copy Markdown
Member

Description
Currently, CIUnitTestCase::assertLogged() matches the logged message verbatim. For simple messages this is no problem but for complex, hard-to-build, or volatile messages, it may be hard to come up with the exact message. This PR adds the capability for the assertLogged method to compare only parts of the message instead of the whole.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@paulbalandanpaulbalandan added docs needed Pull requests needing documentation write-ups and/or revisions. 4.3 labels Oct 17, 2022
@kenjiskenjis added the enhancement PRs that improve existing functionalities label Oct 17, 2022
@kenjis

Copy link
Copy Markdown
Member

The implementation looks good.

@paulbalandanpaulbalandan removed the docs needed Pull requests needing documentation write-ups and/or revisions. label Oct 17, 2022
@kenjis

Copy link
Copy Markdown
Member

Something wrong with GA checks.

Some checks were not successful
1 failing and 5 successful checks

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would lean towards creating a new assertLoggedStrict() or the like, but if you two prefer this I'm good with it.

Edit: the opposite, I suppose! assertLogContains()

@paulbalandan

Copy link
Copy Markdown
MemberAuthor

I was actually contemplating between a new method and modified method. I'll check what I can do.

@kenjis

Copy link
Copy Markdown
Member

Generally It is better to avoid boolean flag parameter.
I prefer a new method, because it is easier to read.

$this->assertLogged('error', 'variable did not', false); // What's false? Jump to the method.$this->assertLogContains('error', 'variable did not');

@paulbalandanpaulbalandan changed the title feat: Add $useExactComparison option to assertLoggedfeat: Check logs against parts of the message onlyOct 18, 2022
*
* @throws Exception
*/
public function assertLogged(string $level, $expectedMessage = null)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not related to this PR, but why $expectedMessage can be null?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure either.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤦‍♂️

/**
* Asserts that there is a log record that contains `$logMessage` in the message.
*/
public function assertLogContains(string $level, string $logMessage, string $message = ''): void

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$expectedMessage is better? assertLogged() uses it.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My understanding is $expectedMessage is used since the assertion compares the message as expected in the logs.
For assertLogContains, I think it is counter-intuitive to use $expectedMessage when it can only be a part of the whole expected message. I was also thinking whether to use $needle or $needleMessage as alternative name.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No preference from me

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am a little uncomfortable with both $needle and $needleMessage.
needle needs haystack.

So let's leave it as it is.

@kenjis
kenjis merged commit ee3e329 into codeigniter4:4.3Oct 20, 2022
@paulbalandan
paulbalandan deleted the assert-logged-approx branch October 20, 2022 05:00
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that improve existing functionalities

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@paulbalandan@kenjis@MGatner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

feat: Check logs against parts of the message only - #6704

Merged
kenjis merged 2 commits into
codeigniter4:4.3from
paulbalandan:assert-logged-approx
Oct 20, 2022
Merged

feat: Check logs against parts of the message only#6704
kenjis merged 2 commits into
codeigniter4:4.3from
paulbalandan:assert-logged-approx

Conversation

@paulbalandan

@paulbalandanpaulbalandan commented Oct 17, 2022

Copy link
Copy Markdown
Member

Description
Currently, CIUnitTestCase::assertLogged() matches the logged message verbatim. For simple messages this is no problem but for complex, hard-to-build, or volatile messages, it may be hard to come up with the exact message. This PR adds the capability for the assertLogged method to compare only parts of the message instead of the whole.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@paulbalandanpaulbalandan added docs needed Pull requests needing documentation write-ups and/or revisions. 4.3 labels Oct 17, 2022
@kenjiskenjis added the enhancement PRs that improve existing functionalities label Oct 17, 2022
@kenjis

Copy link
Copy Markdown
Member

The implementation looks good.

@paulbalandanpaulbalandan removed the docs needed Pull requests needing documentation write-ups and/or revisions. label Oct 17, 2022
@kenjis

Copy link
Copy Markdown
Member

Something wrong with GA checks.

Some checks were not successful
1 failing and 5 successful checks

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would lean towards creating a new assertLoggedStrict() or the like, but if you two prefer this I'm good with it.

Edit: the opposite, I suppose! assertLogContains()

@paulbalandan

Copy link
Copy Markdown
MemberAuthor

I was actually contemplating between a new method and modified method. I'll check what I can do.

@kenjis

Copy link
Copy Markdown
Member

Generally It is better to avoid boolean flag parameter.
I prefer a new method, because it is easier to read.

$this->assertLogged('error', 'variable did not', false); // What's false? Jump to the method.$this->assertLogContains('error', 'variable did not');

@paulbalandanpaulbalandan changed the title feat: Add $useExactComparison option to assertLoggedfeat: Check logs against parts of the message onlyOct 18, 2022
*
* @throws Exception
*/
public function assertLogged(string $level, $expectedMessage = null)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not related to this PR, but why $expectedMessage can be null?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure either.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤦‍♂️

/**
* Asserts that there is a log record that contains `$logMessage` in the message.
*/
public function assertLogContains(string $level, string $logMessage, string $message = ''): void

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$expectedMessage is better? assertLogged() uses it.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My understanding is $expectedMessage is used since the assertion compares the message as expected in the logs.
For assertLogContains, I think it is counter-intuitive to use $expectedMessage when it can only be a part of the whole expected message. I was also thinking whether to use $needle or $needleMessage as alternative name.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No preference from me

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am a little uncomfortable with both $needle and $needleMessage.
needle needs haystack.

So let's leave it as it is.

@kenjis
kenjis merged commit ee3e329 into codeigniter4:4.3Oct 20, 2022
@paulbalandan
paulbalandan deleted the assert-logged-approx branch October 20, 2022 05:00
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that improve existing functionalities

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@paulbalandan@kenjis@MGatner
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

feat: Check logs against parts of the message only - #6704

Merged
kenjis merged 2 commits into
codeigniter4:4.3from
paulbalandan:assert-logged-approx
Oct 20, 2022
Merged

feat: Check logs against parts of the message only#6704
kenjis merged 2 commits into
codeigniter4:4.3from
paulbalandan:assert-logged-approx

Conversation

@paulbalandan

@paulbalandanpaulbalandan commented Oct 17, 2022

Copy link
Copy Markdown
Member

Description
Currently, CIUnitTestCase::assertLogged() matches the logged message verbatim. For simple messages this is no problem but for complex, hard-to-build, or volatile messages, it may be hard to come up with the exact message. This PR adds the capability for the assertLogged method to compare only parts of the message instead of the whole.

Checklist:

  • Securely signed commits
  • Component(s) with PHPDoc blocks, only if necessary or adds value
  • Unit testing, with >80% coverage
  • User guide updated
  • Conforms to style guide

@paulbalandanpaulbalandan added docs needed Pull requests needing documentation write-ups and/or revisions. 4.3 labels Oct 17, 2022
@kenjiskenjis added the enhancement PRs that improve existing functionalities label Oct 17, 2022
@kenjis

Copy link
Copy Markdown
Member

The implementation looks good.

@paulbalandanpaulbalandan removed the docs needed Pull requests needing documentation write-ups and/or revisions. label Oct 17, 2022
@kenjis

Copy link
Copy Markdown
Member

Something wrong with GA checks.

Some checks were not successful
1 failing and 5 successful checks

@MGatnerMGatner left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would lean towards creating a new assertLoggedStrict() or the like, but if you two prefer this I'm good with it.

Edit: the opposite, I suppose! assertLogContains()

@paulbalandan

Copy link
Copy Markdown
MemberAuthor

I was actually contemplating between a new method and modified method. I'll check what I can do.

@kenjis

Copy link
Copy Markdown
Member

Generally It is better to avoid boolean flag parameter.
I prefer a new method, because it is easier to read.

$this->assertLogged('error', 'variable did not', false); // What's false? Jump to the method.$this->assertLogContains('error', 'variable did not');

@paulbalandanpaulbalandan changed the title feat: Add $useExactComparison option to assertLoggedfeat: Check logs against parts of the message onlyOct 18, 2022
*
* @throws Exception
*/
public function assertLogged(string $level, $expectedMessage = null)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not related to this PR, but why $expectedMessage can be null?

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure either.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤦‍♂️

/**
* Asserts that there is a log record that contains `$logMessage` in the message.
*/
public function assertLogContains(string $level, string $logMessage, string $message = ''): void

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

$expectedMessage is better? assertLogged() uses it.

Copy link
Copy Markdown
MemberAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

My understanding is $expectedMessage is used since the assertion compares the message as expected in the logs.
For assertLogContains, I think it is counter-intuitive to use $expectedMessage when it can only be a part of the whole expected message. I was also thinking whether to use $needle or $needleMessage as alternative name.

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No preference from me

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am a little uncomfortable with both $needle and $needleMessage.
needle needs haystack.

So let's leave it as it is.

@kenjis
kenjis merged commit ee3e329 into codeigniter4:4.3Oct 20, 2022
@paulbalandan
paulbalandan deleted the assert-logged-approx branch October 20, 2022 05:00
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementPRs that improve existing functionalities

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@paulbalandan@kenjis@MGatner