Skip to content

Commit

Permalink
Merge branch '312555020' into 312555020
Browse files Browse the repository at this point in the history
  • Loading branch information
Deron5566 authored Mar 7, 2024
2 parents f351ec2 + 2d41d26 commit 050fe3c
Show file tree
Hide file tree
Showing 11 changed files with 267 additions and 11 deletions.
9 changes: 4 additions & 5 deletions .github/pull_request_template.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
## Description

<!-- You can check sample PR here: (remember delete this link when you create your PR) -->
<!-- You can check sample PR here: (remember to delete this link when you create your PR) -->
<https://github.com/SQLab/112-spring-software-testing/pull/2>

<!-- Please briefly describe your change here -->

---

<!-- Please make sure you're satisfy and fill the following checkboxes -->
<!-- Please make sure you're satisfied and fill in the following checkboxes -->
<!-- A good PR should include the following parts: -->

- [ ] A clear title (name your pr "[LAB{lab_number}] {your_student_id}")
- [ ] A clear title (name your PR "[LAB{lab_number}] {your_student_id}")
- [ ] A meaningful message for PR, as well as its commits
- [ ] From your specific branch (***not main or other's branch***) merging to your branch
- [ ] Excluding any irrelevant files, such as binaries, text files, or dot files
- [ ] Passing tests/CI
- [ ] Add proper label for this PR
- [ ] Passing all CI (You should check it first to pass one of the validations in CI. However, you need to make sure your PR passes all CI after you submit it.)
60 changes: 60 additions & 0 deletions .github/workflows/PR.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
name: PR automation
on:
pull_request_target:
types: [opened, reopened, edited, ready_for_review]

jobs:
labeler:
runs-on: ubuntu-latest
steps:
- name: Label PR
uses: actions/github-script@v5
with:
github-token: ${{ secrets.PAT }}
script: |
const { owner, repo, number: issue_number } = context.issue;
const pr = await github.rest.pulls.get({ owner, repo, pull_number: issue_number });
const title = pr.data.title;
const labRegex = /\[LAB(\d+)\]/;
const titleRegex = /^\[LAB\d+\] [\da-zA-Z]+$/;
if (!titleRegex.test(title)) {
core.setFailed('PR title does not match the required format. Please use the format [LAB#] student#.');
}
if (pr.data.head.ref !== pr.data.base.ref) {
core.setFailed('The source branch and target branch must be the same.');
}
if (pr.data.base.ref === 'main') {
core.setFailed('The target branch cannot be main.');
}
const match = title.match(labRegex);
if (match) {
const labelToAdd = 'lab' + match[1];
await github.rest.issues.addLabels({ owner, repo, issue_number, labels: [labelToAdd] });
} else {
core.setFailed('No match found in PR title. Please add a label in the format [LAB#] to the PR title.');
}
checklist-check:
runs-on: ubuntu-latest
steps:
- name: Check PR description
uses: actions/github-script@v5
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const { owner, repo, number: issue_number } = context.issue;
const pr = await github.rest.pulls.get({ owner, repo, pull_number: issue_number });
const body = pr.data.body;
const checkboxes = body.match(/\- \[[x ]\]/g);
if (!checkboxes || checkboxes.length !== 5) {
core.setFailed('The PR description must contain exactly 5 checkboxes.');
}
const unchecked = body.match(/\- \[ \]/g);
if (unchecked && unchecked.length > 0) {
core.setFailed(`There are ${unchecked.length} unchecked items in the PR description.`);
}
7 changes: 3 additions & 4 deletions .github/workflows/lab1.yml
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
name: lab1
name: lab1 autograding

on:
pull_request:
types: [labeled]
types: [labeled, synchronize, opened, reopened, ready_for_review]

jobs:
build:
if: ${{ github.event.label.name == 'lab1' }}
if: contains(github.event.pull_request.labels.*.name, 'lab1')
runs-on: ${{ matrix.os }}
strategy:
matrix:
Expand All @@ -22,6 +22,5 @@ jobs:
sudo apt-get install -y nodejs
- name: grading
run: |
echo "cd lab1"
cd lab1
./validate.sh
26 changes: 26 additions & 0 deletions .github/workflows/lab2.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
name: lab2 autograding

on:
pull_request:
types: [labeled, synchronize, opened, reopened, ready_for_review]

jobs:
build:
if: contains(github.event.pull_request.labels.*.name, 'lab2')
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-22.04]
fail-fast: false
steps:
- uses: actions/checkout@v1
with:
fetch-depth: 1
- name: dependency (ubuntu)
run: |
curl -fsSL https://deb.nodesource.com/setup_21.x | sudo -E bash - &&\
sudo apt-get install -y nodejs
- name: grading
run: |
cd lab2
./validate.sh
2 changes: 1 addition & 1 deletion lab1/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

## Introduction

In this lab, you will write unit tests for functions implemented in `main.js`. You can learn how to use classes and functions in it by uncommenting the code in `main.js.`
In this lab, you will write unit tests for functions implemented in `main.js`. You can learn how to use classes and functions in it by uncommenting the code in it.

## Requirement

Expand Down
2 changes: 1 addition & 1 deletion lab1/validate.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ cd $tmp_dir

rm -rf *
cp $solution_path/*.js .
result=$($node --test --experimental-test-coverage) ; ret=$?
result=$($"node" --test --experimental-test-coverage) ; ret=$?
if [ $ret -ne 0 ] ; then
echo "[!] testing fails"
exit 1
Expand Down
22 changes: 22 additions & 0 deletions lab2/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Lab2

## Introduction

In this lab, you will write unit tests for functions implemented in `main.js`. You can learn how to use classes and functions in it by uncommenting the code in it. (But remember don't commit them on GitHub)

## Requirement

1. Write test cases in `main_test.js` and achieve 100% code coverage. Remember to use Mock, Spy, or Stub when necessary, you need to at least use one of them in your test cases. (100%)

You can run `validate.sh` in your local to test if you satisfy the requirements.

Please note that you must not alter files other than `main_test.js`. You will get 0 points if

1. you modify other files to achieve requirements.
2. you can't pass all CI on your PR.

## Submission

You need to open a pull request to your branch (e.g. 311XXXXXX, your student number) and contain the code that satisfies the abovementioned requirements.

Moreover, please submit the URL of your PR to E3. Your submission will only be accepted when you present at both places.
77 changes: 77 additions & 0 deletions lab2/main.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
const fs = require('fs');
const util = require('util');
const readFile = util.promisify(fs.readFile);

class MailSystem {
write(name) {
console.log('--write mail for ' + name + '--');
const context = 'Congrats, ' + name + '!';
return context;
}

send(name, context) {
console.log('--send mail to ' + name + '--');
// Interact with mail system and send mail
sleep(1000);
// random success or failure
const success = Math.random() > 0.5;
if (success) {
console.log('mail sent');
} else {
console.log('mail failed');
}
return success;
}
}

class Application {
constructor() {
this.people = [];
this.selected = [];
this.mailSystem = new MailSystem();
this.getNames().then(([people, selected]) => {
this.people = people;
this.selected = selected;
});
}

async getNames() {
const data = await readFile('name_list.txt', 'utf8');
const people = data.split('\n');
const selected = [];
return [people, selected];
}

getRandomPerson() {
const i = Math.floor(Math.random() * this.people.length);
return this.people[i];
}

selectNextPerson() {
console.log('--select next person--');
if (this.people.length === this.selected.length) {
console.log('all selected');
return null;
}
let person = this.getRandomPerson();
while (this.selected.includes(person)) {
person = this.getRandomPerson();
}
this.selected.push(person);
return person;
}

notifySelected() {
console.log('--notify selected--');
for (const x of this.selected) {
const context = this.mailSystem.write(x);
this.mailSystem.send(x, context);
}
}
}

// const app = new Application();
// app.selectNextPerson();
// app.selectNextPerson();
// app.selectNextPerson();
// app.notifySelected();
6 changes: 6 additions & 0 deletions lab2/main_test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
const test = require('node:test');
const assert = require('assert');
const { Application, MailSystem } = require('./main');

// TODO: write your tests here
// Remember to use Stub, Mock, and Spy when necessary
38 changes: 38 additions & 0 deletions lab2/validate.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
#!/bin/bash

# Check for unwanted files
for file in *; do
if [[ $file != "main.js" && $file != "main_test.js" && $file != "README.md" && $file != "validate.sh" ]]; then
echo "[!] Unwanted file detected: $file."
exit 1
fi
done

node=$(which node)
test_path="${BASH_SOURCE[0]}"
solution_path="$(realpath .)"
tmp_dir=$(mktemp -d -t lab2-XXXXXXXXXX)

cd $tmp_dir

rm -rf *
cp $solution_path/*.js .
result=$($"node" --test --experimental-test-coverage) ; ret=$?
if [ $ret -ne 0 ] ; then
echo "[!] testing fails"
exit 1
else
coverage=$(echo "$result" | grep 'all files' | awk -F '|' '{print $2}' | sed 's/ //g')
if (( $(echo "$coverage < 100" | bc -l) )); then
echo "[!] Coverage is only $coverage%"
exit 1
else
echo "[V] Coverage is 100%"
fi
fi

rm -rf $tmp_dir

exit 0

# vim: set fenc=utf8 ff=unix et sw=2 ts=2 sts=2:
29 changes: 29 additions & 0 deletions scripts/rebase-all.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
#!/bin/bash

git fetch origin

for branch in $(git branch -r | grep -v HEAD); do
# Remove the "origin/" prefix
branch=${branch#origin/}

if [[ "$branch" != "main" ]]; then
git checkout "$branch"
if [[ $? -ne 0 ]]; then
echo "Checkout failed for branch $branch"
exit 1
fi
git pull origin "$branch"
if [[ $? -ne 0 ]]; then
echo "Pull failed for branch $branch"
exit 1
fi
git rebase main
if [[ $? -ne 0 ]]; then
echo "Rebase failed for branch $branch"
exit 1
fi
git push origin "$branch"
fi
done

git checkout main

0 comments on commit 050fe3c

Please sign in to comment.